Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pm: cpupower: Fix the snapshot-order of tsc,mperf, clock in mperf_stop()

In the function mperf_start(), mperf_monitor snapshots the time, tsc
and finally the aperf,mperf MSRs. However, this order of snapshotting
in is reversed in mperf_stop(). As a result, the C0 residency (which
is computed as delta_mperf * 100 / delta_tsc) is under-reported on
CPUs that is 100% busy.

Fix this by snapshotting time, tsc and then aperf,mperf in
mperf_stop() in the same order as in mperf_start().

Link: https://lore.kernel.org/r/20250612122355.19629-2-gautham.shenoy@amd.com
Signed-off-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

authored by

Gautham R. Shenoy and committed by
Shuah Khan
cda7ac8c e044b8a9

+2 -2
+2 -2
tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
··· 240 240 int cpu; 241 241 242 242 for (cpu = 0; cpu < cpu_count; cpu++) { 243 - mperf_measure_stats(cpu); 244 - mperf_get_tsc(&tsc_at_measure_end[cpu]); 245 243 clock_gettime(CLOCK_REALTIME, &time_end[cpu]); 244 + mperf_get_tsc(&tsc_at_measure_end[cpu]); 245 + mperf_measure_stats(cpu); 246 246 } 247 247 248 248 return 0;