]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pm: cpupower: Fix the snapshot-order of tsc,mperf, clock in mperf_stop()
authorGautham R. Shenoy <gautham.shenoy@amd.com>
Thu, 12 Jun 2025 12:23:54 +0000 (17:53 +0530)
committerShuah Khan <skhan@linuxfoundation.org>
Wed, 18 Jun 2025 22:21:12 +0000 (16:21 -0600)
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>
tools/power/cpupower/utils/idle_monitor/mperf_monitor.c

index 73b6b10cbdd29115719a6688c5de322211fbea96..5ae02c3d5b64b7f9cb498e4d5830dfa371cb4750 100644 (file)
@@ -240,9 +240,9 @@ static int mperf_stop(void)
        int cpu;
 
        for (cpu = 0; cpu < cpu_count; cpu++) {
-               mperf_measure_stats(cpu);
-               mperf_get_tsc(&tsc_at_measure_end[cpu]);
                clock_gettime(CLOCK_REALTIME, &time_end[cpu]);
+               mperf_get_tsc(&tsc_at_measure_end[cpu]);
+               mperf_measure_stats(cpu);
        }
 
        return 0;