public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] cpupower: Make TSC read per CPU for Mperf monitor
@ 2023-05-04  6:25 Wyes Karny
  2023-05-04  6:47 ` Thomas Renninger
  0 siblings, 1 reply; 4+ messages in thread
From: Wyes Karny @ 2023-05-04  6:25 UTC (permalink / raw)
  To: Thomas Renninger, Shuah Khan
  Cc: linux-pm, linux-kernel, Dominik Brodowski, gautham.shenoy,
	Wyes Karny

System-wide TSC read could cause a drift in C0 percentage calculation.
Because if first TSC is read and then one by one mperf is read for all
cpus, this introduces drift between mperf reading of later CPUs and TSC
reading.  To lower this drift read TSC per CPU and also just after mperf
read.  This technique improves C0 percentage calculation in Mperf monitor.

Before fix: (System 100% busy)

              | Mperf              || RAPL        || Idle_Stats
 PKG|CORE| CPU| C0   | Cx   | Freq  || pack | core  || POLL | C1   | C2
   0|   0|   0| 87.15| 12.85|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   0| 256| 84.62| 15.38|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   1|   1| 87.15| 12.85|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   1| 257| 84.08| 15.92|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   2|   2| 86.61| 13.39|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   2| 258| 83.26| 16.74|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   3|   3| 86.61| 13.39|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   3| 259| 83.60| 16.40|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   4|   4| 86.33| 13.67|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   4| 260| 83.33| 16.67|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   5|   5| 86.06| 13.94|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   5| 261| 83.05| 16.95|  2695||168659003|3970468||  0.00|  0.00| 0.00
   0|   6|   6| 85.51| 14.49|  2695||168659003|3970468||  0.00|  0.00| 0.00

After fix: (System 100% busy)

             | Mperf              || RAPL        || Idle_Stats
 PKG|CORE| CPU| C0   | Cx   | Freq  || pack | core  || POLL | C1   | C2
   0|   0|   0| 98.03|  1.97|  2415||163295480|3811189||  0.00|  0.00| 0.00
   0|   0| 256| 98.50|  1.50|  2394||163295480|3811189||  0.00|  0.00| 0.00
   0|   1|   1| 99.99|  0.01|  2401||163295480|3811189||  0.00|  0.00| 0.00
   0|   1| 257| 99.99|  0.01|  2375||163295480|3811189||  0.00|  0.00| 0.00
   0|   2|   2| 99.99|  0.01|  2401||163295480|3811189||  0.00|  0.00| 0.00
   0|   2| 258|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
   0|   3|   3|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
   0|   3| 259| 99.99|  0.01|  2435||163295480|3811189||  0.00|  0.00| 0.00
   0|   4|   4|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
   0|   4| 260|100.00|  0.00|  2435||163295480|3811189||  0.00|  0.00| 0.00
   0|   5|   5| 99.99|  0.01|  2401||163295480|3811189||  0.00|  0.00| 0.00
   0|   5| 261|100.00|  0.00|  2435||163295480|3811189||  0.00|  0.00| 0.00
   0|   6|   6|100.00|  0.00|  2401||163295480|3811189||  0.00|  0.00| 0.00
   0|   6| 262|100.00|  0.00|  2435||163295480|3811189||  0.00|  0.00| 0.00

Cc: Thomas Renninger <trenn@suse.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Dominik Brodowski <linux@dominikbrodowski.net>

Fixes: 7fe2f6399a84 ("cpupowerutils - cpufrequtils extended with quite some features")
Signed-off-by: Wyes Karny <wyes.karny@amd.com>
---
 .../utils/idle_monitor/mperf_monitor.c        | 31 +++++++++----------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c b/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
index e7d48cb563c0..ae6af354a81d 100644
--- a/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
+++ b/tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
@@ -70,8 +70,8 @@ static int max_freq_mode;
  */
 static unsigned long max_frequency;
 
-static unsigned long long tsc_at_measure_start;
-static unsigned long long tsc_at_measure_end;
+static unsigned long long *tsc_at_measure_start;
+static unsigned long long *tsc_at_measure_end;
 static unsigned long long *mperf_previous_count;
 static unsigned long long *aperf_previous_count;
 static unsigned long long *mperf_current_count;
@@ -169,7 +169,7 @@ static int mperf_get_count_percent(unsigned int id, double *percent,
 	aperf_diff = aperf_current_count[cpu] - aperf_previous_count[cpu];
 
 	if (max_freq_mode == MAX_FREQ_TSC_REF) {
-		tsc_diff = tsc_at_measure_end - tsc_at_measure_start;
+		tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu];
 		*percent = 100.0 * mperf_diff / tsc_diff;
 		dprint("%s: TSC Ref - mperf_diff: %llu, tsc_diff: %llu\n",
 		       mperf_cstates[id].name, mperf_diff, tsc_diff);
@@ -206,7 +206,7 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count,
 
 	if (max_freq_mode == MAX_FREQ_TSC_REF) {
 		/* Calculate max_freq from TSC count */
-		tsc_diff = tsc_at_measure_end - tsc_at_measure_start;
+		tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu];
 		time_diff = timespec_diff_us(time_start, time_end);
 		max_frequency = tsc_diff / time_diff;
 	}
@@ -225,33 +225,27 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count,
 static int mperf_start(void)
 {
 	int cpu;
-	unsigned long long dbg;
 
 	clock_gettime(CLOCK_REALTIME, &time_start);
-	mperf_get_tsc(&tsc_at_measure_start);
 
-	for (cpu = 0; cpu < cpu_count; cpu++)
+	for (cpu = 0; cpu < cpu_count; cpu++) {
+		mperf_get_tsc(&tsc_at_measure_start[cpu]);
 		mperf_init_stats(cpu);
+	}
 
-	mperf_get_tsc(&dbg);
-	dprint("TSC diff: %llu\n", dbg - tsc_at_measure_start);
 	return 0;
 }
 
 static int mperf_stop(void)
 {
-	unsigned long long dbg;
 	int cpu;
 
-	for (cpu = 0; cpu < cpu_count; cpu++)
+	for (cpu = 0; cpu < cpu_count; cpu++) {
 		mperf_measure_stats(cpu);
+		mperf_get_tsc(&tsc_at_measure_end[cpu]);
+	}
 
-	mperf_get_tsc(&tsc_at_measure_end);
 	clock_gettime(CLOCK_REALTIME, &time_end);
-
-	mperf_get_tsc(&dbg);
-	dprint("TSC diff: %llu\n", dbg - tsc_at_measure_end);
-
 	return 0;
 }
 
@@ -353,7 +347,8 @@ struct cpuidle_monitor *mperf_register(void)
 	aperf_previous_count = calloc(cpu_count, sizeof(unsigned long long));
 	mperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
 	aperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
-
+	tsc_at_measure_start = calloc(cpu_count, sizeof(unsigned long long));
+	tsc_at_measure_end = calloc(cpu_count, sizeof(unsigned long long));
 	mperf_monitor.name_len = strlen(mperf_monitor.name);
 	return &mperf_monitor;
 }
@@ -364,6 +359,8 @@ void mperf_unregister(void)
 	free(aperf_previous_count);
 	free(mperf_current_count);
 	free(aperf_current_count);
+	free(tsc_at_measure_start);
+	free(tsc_at_measure_end);
 	free(is_valid);
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] cpupower: Make TSC read per CPU for Mperf monitor
  2023-05-04  6:25 [PATCH] cpupower: Make TSC read per CPU for Mperf monitor Wyes Karny
@ 2023-05-04  6:47 ` Thomas Renninger
  2023-05-04 16:09   ` Shuah Khan
  0 siblings, 1 reply; 4+ messages in thread
From: Thomas Renninger @ 2023-05-04  6:47 UTC (permalink / raw)
  To: Thomas Renninger, Shuah Khan, Wyes Karny
  Cc: linux-pm, linux-kernel, Dominik Brodowski, gautham.shenoy,
	Wyes Karny

On Donnerstag, 4. Mai 2023 08:25:44 CEST Wyes Karny wrote:
> This technique improves C0 percentage calculation in Mperf monitor.

I very much like this patch.
Would be nice to see it queued up if Shuah is ok with it.

Thanks for this one!

     Thomas



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] cpupower: Make TSC read per CPU for Mperf monitor
  2023-05-04  6:47 ` Thomas Renninger
@ 2023-05-04 16:09   ` Shuah Khan
  2023-05-04 19:42     ` Wyes Karny
  0 siblings, 1 reply; 4+ messages in thread
From: Shuah Khan @ 2023-05-04 16:09 UTC (permalink / raw)
  To: Thomas Renninger, Thomas Renninger, Shuah Khan, Wyes Karny
  Cc: linux-pm, linux-kernel, Dominik Brodowski, gautham.shenoy,
	Shuah Khan

On 5/4/23 00:47, Thomas Renninger wrote:
> On Donnerstag, 4. Mai 2023 08:25:44 CEST Wyes Karny wrote:
>> This technique improves C0 percentage calculation in Mperf monitor.
> 

Like it. Thanks for finding and fixing it.

> I very much like this patch.
> Would be nice to see it queued up if Shuah is ok with it.
> 
> Thanks for this one!
> 
>       Thomas
> 
> 

Thank Thomas for the review. I will queue this up to send after
the merge window closes.

thanks,
-- Shuah


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] cpupower: Make TSC read per CPU for Mperf monitor
  2023-05-04 16:09   ` Shuah Khan
@ 2023-05-04 19:42     ` Wyes Karny
  0 siblings, 0 replies; 4+ messages in thread
From: Wyes Karny @ 2023-05-04 19:42 UTC (permalink / raw)
  To: Shuah Khan, Thomas Renninger
  Cc: Thomas Renninger, Thomas Renninger, Shuah Khan, linux-pm,
	linux-kernel, Dominik Brodowski, gautham.shenoy

On 04 May 10:09, Shuah Khan wrote:
> On 5/4/23 00:47, Thomas Renninger wrote:
> > On Donnerstag, 4. Mai 2023 08:25:44 CEST Wyes Karny wrote:
> > > This technique improves C0 percentage calculation in Mperf monitor.
> > 
> 
> Like it. Thanks for finding and fixing it.
> 
> > I very much like this patch.
> > Would be nice to see it queued up if Shuah is ok with it.
> > 
> > Thanks for this one!
> > 
> >       Thomas
> > 
> > 
> 
> Thank Thomas for the review. I will queue this up to send after
> the merge window closes.

Thanks Thomas, Shuah for reviewing and accepting the patch.

Regards,
Wyes
> 
> thanks,
> -- Shuah
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-05-04 19:45 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-04  6:25 [PATCH] cpupower: Make TSC read per CPU for Mperf monitor Wyes Karny
2023-05-04  6:47 ` Thomas Renninger
2023-05-04 16:09   ` Shuah Khan
2023-05-04 19:42     ` Wyes Karny

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox