summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorGautham R. Shenoy <gautham.shenoy@amd.com>2025-06-12 17:53:54 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-08-28 16:21:25 +0200
commit1b5c6a600ff46296309892c7ec6030b2b768bd45 (patch)
tree9ff245eb95c554cf8c3dc9ca210fda618eb51fae /tools
parentc41fef8b2dfe9db90421fbc2cde1edc8fff58a35 (diff)
downloadlinux-1b5c6a600ff46296309892c7ec6030b2b768bd45.tar.gz
linux-1b5c6a600ff46296309892c7ec6030b2b768bd45.tar.bz2
linux-1b5c6a600ff46296309892c7ec6030b2b768bd45.zip
pm: cpupower: Fix the snapshot-order of tsc,mperf, clock in mperf_stop()
[ Upstream commit cda7ac8ce7de84cf32a3871ba5f318aa3b79381e ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/power/cpupower/utils/idle_monitor/mperf_monitor.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c b/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
index 0e8c0b879d4b..09c606760464 100644
--- a/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
+++ b/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
@@ -201,9 +201,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;