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

Mario Limonciello superm1 at kernel.org
Wed Sep 30 13:06:46 PDT 2026



On 9/29/26 05:29, 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(-)
> 
> 
> base-commit: 6375e61c01e93e35ee7acd336a689ac1fae4b509

Reviewed-by: Mario Limonciello (AMD) <superm1 at kernel.org>



More information about the linux-arm-kernel mailing list