On Wed, Oct 18, 2023 at 6:25 PM Vincent Guittot <vincent.guittot@xxxxxxxxxx> wrote: > > 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. > > Signed-off-by: Vincent Guittot <vincent.guittot@xxxxxxxxxx> > Acked-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx> > Reviewed-by: Lukasz Luba <lukasz.luba@xxxxxxx> > Tested-by: Lukasz Luba <lukasz.luba@xxxxxxx> Acked-by: Rafael J. Wysocki <rafael@xxxxxxxxxx> > --- > drivers/cpufreq/cpufreq.c | 4 ++-- > include/linux/cpufreq.h | 9 +++++++++ > 2 files changed, 11 insertions(+), 2 deletions(-) > > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > index 60ed89000e82..8c4f9c2f9c44 100644 > --- a/drivers/cpufreq/cpufreq.c > +++ b/drivers/cpufreq/cpufreq.c > @@ -454,7 +454,7 @@ void cpufreq_freq_transition_end(struct cpufreq_policy *policy, > > 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; > @@ -2174,7 +2174,7 @@ unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy, > > 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()) { > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h > index 71d186d6933a..bbc483b4b6e5 100644 > --- a/include/linux/cpufreq.h > +++ b/include/linux/cpufreq.h > @@ -1211,6 +1211,15 @@ void arch_set_freq_scale(const struct cpumask *cpus, > { > } > #endif > + > +#ifndef arch_scale_freq_ref > +static __always_inline > +unsigned int arch_scale_freq_ref(int cpu) > +{ > + return 0; > +} > +#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; > -- > 2.34.1 >