Re: [PATCH 0/3] cpufreq: Resolve CPPC frequencies to performance levels

From: Peter Zijlstra

Date: Thu Oct 01 2026 - 06:45:10 EST


On Tue, Sep 29, 2026 at 11:29:54AM +0100, Christian Loehle wrote:
> For table-based cpufreq drivers, the core resolves requests to supported
> frequency-table entries before governors such as schedutil compare them
> with their cached target. Different kHz requests selecting the same entry
> therefore need not reach the driver again.
>
> Table-less cppc-cpufreq lacks this resolution: the core returns the requested
> kHz value even if firmware exposes only a few CPPC performance levels.
> Different requests can miss the governor's cache yet program the same
> Desired Performance value. The tested ARM AGI CPU exposes only 61 levels,
> with bounds visible at:
>
> /sys/devices/system/cpu/cpuX/acpi_cppc/{lowest,highest}_perf
>
> Add ->resolve_freq() so table-less ->target() drivers can canonicalize
> requests without constructing a frequency table. CPPC resolves requests
> before sugov_update_next_freq(), allowing its existing cache to skip
> equivalent requests. Raw limit notifications still trigger
> reconsideration, but only changed resolved limits force a driver update.
> Failed limit writes remain pending for retry.
>
> Testing on an ARM AGI CPU (61 distinct CPPC levels) with schedutil gives
> the following end-to-end results across 16 iterations:
>
> schbench -m 2 -t 31 -F 256 -n 5 -R 18000 -r 60 -w 20 -i 60
>
> metric baseline resolve-freq change
> median p99 3364 us 3280 us -2.5%
> mean of run p99s 3664.2 us 3299.0 us -10.0%
> worst run p99 4360 us 3500 us -19.7%
> median throughput 16431.08 RPS 16460.69 RPS +0.2%
>
> In an instrumented run of the same workload, cppc_set_perf() calls fell
> from 1,136,868 to 866,703, a 23.8% reduction.
>
> Christian Loehle (3):
> cpufreq: Add a driver frequency resolution callback
> cpufreq: CPPC: Resolve frequencies to performance levels
> cpufreq: Skip updates for unchanged resolved limits
>
> Documentation/admin-guide/pm/cpufreq.rst | 4 +
> Documentation/cpu-freq/cpu-drivers.rst | 19 ++
> drivers/cpufreq/cppc_cpufreq.c | 257 +++++++++++++++++++++--
> drivers/cpufreq/cpufreq.c | 99 +++++++--
> include/linux/cpufreq.h | 11 +
> kernel/sched/cpufreq_schedutil.c | 19 +-
> 6 files changed, 359 insertions(+), 50 deletions(-)

No objection to the kernel/sched/ change. I'm assuming rjw or other
cpufreq maintainer will take this?