| From 599457ba15403037b489fe536266a3d5f9efaed7 Mon Sep 17 00:00:00 2001 |
| From: Vincent Guittot <vincent.guittot@linaro.org> |
| Date: Mon, 11 Dec 2023 11:48:50 +0100 |
| Subject: cpufreq: Use the fixed and coherent frequency for scaling capacity |
| |
| From: Vincent Guittot <vincent.guittot@linaro.org> |
| |
| commit 599457ba15403037b489fe536266a3d5f9efaed7 upstream. |
| |
| cpuinfo.max_freq can change at runtime because of boost as an example. This |
| implies that the value could be different from the frequency that has been |
| used to compute the capacity of a CPU. |
| |
| The new arch_scale_freq_ref() returns a fixed and coherent frequency |
| that can be used to compute the capacity for a given frequency. |
| |
| [ Also fix a arch_set_freq_scale() newline style wart in <linux/cpufreq.h>. ] |
| |
| Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Tested-by: Lukasz Luba <lukasz.luba@arm.com> |
| Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Acked-by: Rafael J. Wysocki <rafael@kernel.org> |
| Link: https://lore.kernel.org/r/20231211104855.558096-3-vincent.guittot@linaro.org |
| Stable-dep-of: e37617c8e53a ("sched/fair: Fix frequency selection for non-invariant case") |
| Signed-off-by: Wentao Guan <guanwentao@uniontech.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/cpufreq/cpufreq.c | 4 ++-- |
| include/linux/cpufreq.h | 1 + |
| 2 files changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/cpufreq/cpufreq.c |
| +++ b/drivers/cpufreq/cpufreq.c |
| @@ -454,7 +454,7 @@ void cpufreq_freq_transition_end(struct |
| |
| arch_set_freq_scale(policy->related_cpus, |
| policy->cur, |
| - policy->cpuinfo.max_freq); |
| + arch_scale_freq_ref(policy->cpu)); |
| |
| spin_lock(&policy->transition_lock); |
| policy->transition_ongoing = false; |
| @@ -2205,7 +2205,7 @@ unsigned int cpufreq_driver_fast_switch( |
| |
| policy->cur = freq; |
| arch_set_freq_scale(policy->related_cpus, freq, |
| - policy->cpuinfo.max_freq); |
| + arch_scale_freq_ref(policy->cpu)); |
| cpufreq_stats_record_transition(policy, freq); |
| |
| if (trace_cpu_frequency_enabled()) { |
| --- a/include/linux/cpufreq.h |
| +++ b/include/linux/cpufreq.h |
| @@ -1245,6 +1245,7 @@ void arch_set_freq_scale(const struct cp |
| { |
| } |
| #endif |
| + |
| /* the following are really really optional */ |
| extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs; |
| extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs; |