Loading arch/arm64/include/asm/topology.h +3 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,9 @@ int pcibus_to_node(struct pci_bus *bus); /* Replace task scheduler's default frequency-invariant accounting */ #define arch_scale_freq_capacity topology_get_freq_scale /* Replace task scheduler's default max-frequency-invariant accounting */ #define arch_scale_max_freq_capacity topology_get_max_freq_scale /* Replace task scheduler's default cpu-invariant accounting */ #define arch_scale_cpu_capacity topology_get_cpu_scale Loading drivers/base/arch_topology.c +24 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE; DEFINE_PER_CPU(unsigned long, efficiency) = SCHED_CAPACITY_SCALE; DEFINE_PER_CPU(unsigned long, max_cpu_freq); DEFINE_PER_CPU(unsigned long, max_freq_scale) = SCHED_CAPACITY_SCALE; void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, unsigned long max_freq) Loading @@ -35,8 +37,29 @@ void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq; for_each_cpu(i, cpus) for_each_cpu(i, cpus) { per_cpu(freq_scale, i) = scale; per_cpu(max_cpu_freq, i) = max_freq; } } void arch_set_max_freq_scale(struct cpumask *cpus, unsigned long policy_max_freq) { unsigned long scale, max_freq; int cpu = cpumask_first(cpus); if (cpu > nr_cpu_ids) return; max_freq = per_cpu(max_cpu_freq, cpu); if (!max_freq) return; scale = (policy_max_freq << SCHED_CAPACITY_SHIFT) / max_freq; for_each_cpu(cpu, cpus) per_cpu(max_freq_scale, cpu) = scale; } static DEFINE_MUTEX(cpu_scale_mutex); Loading drivers/cpufreq/cpufreq.c +9 −0 Original line number Diff line number Diff line Loading @@ -2234,6 +2234,9 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy, policy->min = new_policy->min; policy->max = new_policy->max; arch_set_max_freq_scale(policy->cpus, policy->max); trace_cpu_frequency_limits(policy->max, policy->min, policy->cpu); policy->cached_target_freq = UINT_MAX; Loading Loading @@ -2444,6 +2447,12 @@ __weak void arch_set_freq_scale(struct cpumask *cpus, } EXPORT_SYMBOL_GPL(arch_set_freq_scale); __weak void arch_set_max_freq_scale(struct cpumask *cpus, unsigned long policy_max_freq) { } EXPORT_SYMBOL_GPL(arch_set_max_freq_scale); /********************************************************************* * REGISTER / UNREGISTER CPUFREQ DRIVER * *********************************************************************/ Loading include/linux/arch_topology.h +8 −0 Original line number Diff line number Diff line Loading @@ -44,4 +44,12 @@ unsigned long topology_get_freq_scale(struct sched_domain *sd, int cpu) return per_cpu(freq_scale, cpu); } DECLARE_PER_CPU(unsigned long, max_freq_scale); static inline unsigned long topology_get_max_freq_scale(struct sched_domain *sd, int cpu) { return per_cpu(max_freq_scale, cpu); } #endif /* _LINUX_ARCH_TOPOLOGY_H_ */ include/linux/cpufreq.h +2 −0 Original line number Diff line number Diff line Loading @@ -922,6 +922,8 @@ extern unsigned int arch_freq_get_on_cpu(int cpu); extern void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, unsigned long max_freq); extern void arch_set_max_freq_scale(struct cpumask *cpus, unsigned long policy_max_freq); /* the following are really really optional */ extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs; Loading Loading
arch/arm64/include/asm/topology.h +3 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,9 @@ int pcibus_to_node(struct pci_bus *bus); /* Replace task scheduler's default frequency-invariant accounting */ #define arch_scale_freq_capacity topology_get_freq_scale /* Replace task scheduler's default max-frequency-invariant accounting */ #define arch_scale_max_freq_capacity topology_get_max_freq_scale /* Replace task scheduler's default cpu-invariant accounting */ #define arch_scale_cpu_capacity topology_get_cpu_scale Loading
drivers/base/arch_topology.c +24 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE; DEFINE_PER_CPU(unsigned long, efficiency) = SCHED_CAPACITY_SCALE; DEFINE_PER_CPU(unsigned long, max_cpu_freq); DEFINE_PER_CPU(unsigned long, max_freq_scale) = SCHED_CAPACITY_SCALE; void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, unsigned long max_freq) Loading @@ -35,8 +37,29 @@ void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq; for_each_cpu(i, cpus) for_each_cpu(i, cpus) { per_cpu(freq_scale, i) = scale; per_cpu(max_cpu_freq, i) = max_freq; } } void arch_set_max_freq_scale(struct cpumask *cpus, unsigned long policy_max_freq) { unsigned long scale, max_freq; int cpu = cpumask_first(cpus); if (cpu > nr_cpu_ids) return; max_freq = per_cpu(max_cpu_freq, cpu); if (!max_freq) return; scale = (policy_max_freq << SCHED_CAPACITY_SHIFT) / max_freq; for_each_cpu(cpu, cpus) per_cpu(max_freq_scale, cpu) = scale; } static DEFINE_MUTEX(cpu_scale_mutex); Loading
drivers/cpufreq/cpufreq.c +9 −0 Original line number Diff line number Diff line Loading @@ -2234,6 +2234,9 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy, policy->min = new_policy->min; policy->max = new_policy->max; arch_set_max_freq_scale(policy->cpus, policy->max); trace_cpu_frequency_limits(policy->max, policy->min, policy->cpu); policy->cached_target_freq = UINT_MAX; Loading Loading @@ -2444,6 +2447,12 @@ __weak void arch_set_freq_scale(struct cpumask *cpus, } EXPORT_SYMBOL_GPL(arch_set_freq_scale); __weak void arch_set_max_freq_scale(struct cpumask *cpus, unsigned long policy_max_freq) { } EXPORT_SYMBOL_GPL(arch_set_max_freq_scale); /********************************************************************* * REGISTER / UNREGISTER CPUFREQ DRIVER * *********************************************************************/ Loading
include/linux/arch_topology.h +8 −0 Original line number Diff line number Diff line Loading @@ -44,4 +44,12 @@ unsigned long topology_get_freq_scale(struct sched_domain *sd, int cpu) return per_cpu(freq_scale, cpu); } DECLARE_PER_CPU(unsigned long, max_freq_scale); static inline unsigned long topology_get_max_freq_scale(struct sched_domain *sd, int cpu) { return per_cpu(max_freq_scale, cpu); } #endif /* _LINUX_ARCH_TOPOLOGY_H_ */
include/linux/cpufreq.h +2 −0 Original line number Diff line number Diff line Loading @@ -922,6 +922,8 @@ extern unsigned int arch_freq_get_on_cpu(int cpu); extern void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, unsigned long max_freq); extern void arch_set_max_freq_scale(struct cpumask *cpus, unsigned long policy_max_freq); /* the following are really really optional */ extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs; Loading