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

From: Mario Limonciello

Date: Wed Sep 30 2026 - 18:09:32 EST




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@xxxxxxxxxx>