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

Peter Zijlstra peterz at infradead.org
Thu Oct 1 03:34:44 PDT 2026


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?



More information about the linux-arm-kernel mailing list