]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpufreq: Make cpufreq_update_pressure() fall back to cpuinfo.max_freq
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 7 Jul 2026 17:25:39 +0000 (19:25 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 9 Jul 2026 18:31:57 +0000 (20:31 +0200)
If arch_scale_freq_ref() is not defined for a given arch (like x86, for
example), cpufreq_update_pressure() will always set cpufreq_pressure to
zero for all CPUs in the system, which is generally problematic on
systems with asymmetric capacity [1].

However, in the absence of arch_scale_freq_ref(), it is reasonable
to assume that cpuinfo.max_freq is the maximum sustainable frequency
for the given cpufreq policy.  Moreover, there are cases in which
arch_scale_freq_ref() would need to be defined to return essentially
the cpuinfo.max_freq value anyway (for example, intel_pstate on
hybrid platforms).

For the above reasons, update cpufreq_update_pressure() to fall back to
using cpuinfo.max_freq as the reference frequency if zero is returned by
arch_scale_freq_ref().

Fixes: 75d659317bb1 ("cpufreq: Add a cpufreq pressure feedback for the scheduler")
Link: https://lore.kernel.org/lkml/CAKfTPtBuRLfYNnR4w--cFZYZy-R8gaPEgVwCcaMmbCcJ2H-muQ@mail.gmail.com/
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Zhongqiu Han <zhongqiu.han@oss.qualcomm.com>
Tested-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> # cluster scheduling
Acked-by: Vincent Guittot <vincent.guittot@linaro.org>
Link: https://patch.msgid.link/5086499.GXAFRqVoOG@rafael.j.wysocki
drivers/cpufreq/cpufreq.c

index 507224c9ecd38e92887c330ad77c502422bbfb63..b898b6544069f80e7cfb5a805521649db6740eba 100644 (file)
@@ -2586,6 +2586,9 @@ static void cpufreq_update_pressure(struct cpufreq_policy *policy)
 
        cpu = cpumask_first(policy->related_cpus);
        max_freq = arch_scale_freq_ref(cpu);
+       if (!max_freq)
+               max_freq = policy->cpuinfo.max_freq;
+
        capped_freq = policy->max;
 
        /*