Message ID | 20250614003601.1600784-1-pmalani@google.com |
---|---|
State | New |
Headers | show |
Series | cpufreq: CPPC: Dont read counters for idle CPUs | expand |
Hi Prashant,
kernel test robot noticed the following build errors:
[auto build test ERROR on rafael-pm/linux-next]
[also build test ERROR on rafael-pm/bleeding-edge linus/master v6.16-rc1 next-20250613]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Prashant-Malani/cpufreq-CPPC-Dont-read-counters-for-idle-CPUs/20250614-083659
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
patch link: https://lore.kernel.org/r/20250614003601.1600784-1-pmalani%40google.com
patch subject: [PATCH] cpufreq: CPPC: Dont read counters for idle CPUs
config: riscv-defconfig (https://download.01.org/0day-ci/archive/20250615/202506152245.BJAubGbp-lkp@intel.com/config)
compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project f819f46284f2a79790038e1f6649172789734ae8)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250615/202506152245.BJAubGbp-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506152245.BJAubGbp-lkp@intel.com/
All errors (new ones prefixed by >>, old ones prefixed by <<):
>> ERROR: modpost: "idle_cpu" [drivers/cpufreq/cppc_cpufreq.ko] undefined!
On Sun, 15 Jun 2025 at 07:28, kernel test robot <lkp@intel.com> wrote: > > Hi Prashant, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on rafael-pm/linux-next] > [also build test ERROR on rafael-pm/bleeding-edge linus/master v6.16-rc1 next-20250613] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > url: https://github.com/intel-lab-lkp/linux/commits/Prashant-Malani/cpufreq-CPPC-Dont-read-counters-for-idle-CPUs/20250614-083659 > base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next > patch link: https://lore.kernel.org/r/20250614003601.1600784-1-pmalani%40google.com > patch subject: [PATCH] cpufreq: CPPC: Dont read counters for idle CPUs > config: riscv-defconfig (https://download.01.org/0day-ci/archive/20250615/202506152245.BJAubGbp-lkp@intel.com/config) > compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project f819f46284f2a79790038e1f6649172789734ae8) > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250615/202506152245.BJAubGbp-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202506152245.BJAubGbp-lkp@intel.com/ > > All errors (new ones prefixed by >>, old ones prefixed by <<): > > >> ERROR: modpost: "idle_cpu" [drivers/cpufreq/cppc_cpufreq.ko] undefined! Looks like my compilation .config included the header implicitly, but it got missed here. I'll add it in v2, once there is consensus on this change. Best regards,
diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index b7c688a5659c..9bc2546fb4a7 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -753,6 +753,10 @@ static unsigned int cppc_cpufreq_get_rate(unsigned int cpu) cpufreq_cpu_put(policy); + /* Idle CPUs have unreliable counters, so skip to the end. */ + if (idle_cpu(cpu)) + goto out_invalid_counters; + ret = cppc_get_perf_ctrs_sample(cpu, &fb_ctrs_t0, &fb_ctrs_t1); if (ret) { if (ret == -EFAULT)
AMU performance counters tend to be inaccurate when measured on idle CPUs. On an idle CPU which is programmed to 3.4 GHz (verified through firmware), here is a measurement and calculation of operating frequency: t0: ref=899127636, del=3012458473 t1: ref=899129626, del=3012466509 perf=40 For reference, when we measure the same CPU with stress-ng running, we have a more accurate result: t0: ref=30751756418, del=104490567689 t1: ref=30751760628, del=104490582296 perf=34 (t0 and t1 are 2 microseconds apart) In the above, the prescribed method[1] of calculating frequency from CPPC counters was used. The follow-on effect is that the inaccurate frequency is stashed in the cpufreq policy struct when the CPU is brought online. Since CPUs are mostly idle when they are brought online, this means cpufreq has an inaccurate view of the programmed clock rate. Consequently, if userspace tries to actually set the frequency to the previously erroneous rate (4 GHz in the above example), cpufreq returns early without calling in to the CPPC driver to send the relevant PCC command; it thinks the CPU is already at that frequency. Update the CPPC get_rate() code to skip sampling counters if we know a CPU is idle, and go directly to the fallback response of returning the “desired” frequency. The code intends to do that anyway if the counters happen to return an “idle” reading. [1] https://docs.kernel.org/admin-guide/acpi/cppc_sysfs.html#computing-average-delivered-performance Signed-off-by: Prashant Malani <pmalani@google.com> --- drivers/cpufreq/cppc_cpufreq.c | 4 ++++ 1 file changed, 4 insertions(+)