turbostat for 4.10 merge
Len Brown
maintainercover turbostat for 4.10 merge
These patches bring the upstream tree up to date with the version of turbostat that I am currently using.
Let me know if you have any troubles, or suggestions.
thanks,
-Len Brown, Intel Open Source Technology Center
Len Brown
maintainerPATCH 1/17 tools/power turbostat: tidy up output on Joule counter overflow
From: Len Brown <[email protected]>
The RAPL Joules counter is limited in capacity.
Turbostat estimates how soon it can roll-over
based on the max TDP of the processor --
which tells us the maximum increment rate.
eg.
RAPL: 2759 sec. Joule Counter Range, at 95 Watts
So if a sample duration is longer than 2759 seconds on this system, '**' replace the decimal place in the display to indicate that the results may be suspect.
But the display had an extra ' ' in this case, throwing off the columns.
Also, the -J "Joules" option appended an extra "time" column to the display. While this may be useful, it printed the interval time, which may not be the accurate time per processor. Remove this column, which appeared only when using '-J',
as we plan to add accurate per-cpu interval times in a future commit.
--- tools/power/x86/turbostat/turbostat.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
tools/power/x86/turbostat/turbostat.c +1 -5
@@ -423,8 +423,6 @@ void print_header(void) outp +=sprintf (outp," PKG_%%" );if (do_rapl &RAPL_DRAM_PERF_STATUS ) outp +=sprintf (outp," RAM_%%" ); - outp +=sprintf (outp," time" ); - } done: outp +=sprintf (outp,"\n" );
@@ -665,7 +663,7 @@ int format_counters(struct thread_data *t, struct core_data *c,if (interval_float < rapl_joule_counter_range) fmt8 ="%8.2f" ;else - fmt8 =" %6.0f**" ; + fmt8 ="%6.0f**" ;if (do_rapl && !rapl_joules) {if (do_rapl &RAPL_PKG )
@@ -697,8 +695,6 @@ int format_counters(struct thread_data *t, struct core_data *c, outp +=sprintf (outp, fmt8,100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float);if (do_rapl &RAPL_DRAM_PERF_STATUS ) outp +=sprintf (outp, fmt8,100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float); - - outp +=sprintf (outp, fmt8, interval_float); } done: outp +=sprintf (outp,"\n" );
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 2/17 tools/power turbostat: Gracefully handle ACPI S3
In reply to Len BrownFrom: Len Brown <[email protected]>
turbostat gives valid results across suspend to idle, aka freeze, whether invoked in interval mode, or in command mode. Indeed, this can be used to measure suspend to idle:
turbostat echo freeze > /sys/power/state
But this does not work across suspend to ACPI S3, because the processor counters, including the TSC, are reset on resume. Further, when turbostat detects a problem, it does't forgive the hardware, and interval mode will print *'s from there on out.
Instead, upon detecting counters going backwards, simply reset and start over.
Interval mode across ACPI S3: (observe TSC going backwards)
root@sharkbay:/home/lenb/turbostat-src# ./turbostat -M 0x10
CPU Avg_MHz Busy% Bzy_MHz TSC_MHz MSR 0x010
- 1 0.06 858 2294 0x0000000000000000
0 0 0.06 847 2294 0x0000002a254b98ac
1 1 0.06 878 2294 0x0000002a254efa3a
2 1 0.07 843 2294 0x0000002a2551df65
3 0 0.05 863 2294 0x0000002a2553fea2
turbostat: re-initialized with num_cpus 4
CPU Avg_MHz Busy% Bzy_MHz TSC_MHz MSR 0x010
- 2 0.20 849 2294 0x0000000000000000
0 2 0.26 856 2294 0x0000000449abb60d
1 2 0.20 844 2294 0x0000000449b087ec
2 2 0.21 850 2294 0x0000000449b35d5d
3 1 0.12 839 2294 0x0000000449b5fd5a
^CCommand mode across ACPI S3:
root@sharkbay:/home/lenb/turbostat-src# ./turbostat -M 0x10 sleep 10 ./turbostat: Counter reset detected 14.196299 sec
--- tools/power/x86/turbostat/turbostat.c | 77 ++++++++++++++++------------------- 1 file changed, 35 insertions(+), 42 deletions(-)
tools/power/x86/turbostat/turbostat.c +35 -42
@@ -51,8 +51,6 @@ unsigned int debug;unsigned int rapl_joules;unsigned int summary_only;unsigned int dump_only; -unsigned int skip_c0; -unsigned int skip_c1;unsigned int do_nhm_cstates;unsigned int do_snb_cstates;unsigned int do_knl_cstates;
@@ -145,7 +143,6 @@ unsigned int has_hwp_pkg; /* IA32_HWP_REQUEST_PKG */#define MAX (a, b) ((a) > (b) ? (a) : (b)) -int aperf_mperf_unstable;int backwards_count;char *progname;
@@ -546,12 +543,8 @@ int format_counters(struct thread_data *t, struct core_data *c, 1.0 / units * t->aperf / interval_float);/* Busy% */ -if (has_aperf) { -if (!skip_c0) - outp +=sprintf (outp,"%8.2f" ,100.0 * t->mperf/t->tsc/tsc_tweak); -else - outp +=sprintf (outp,"********" ); - } +if (has_aperf) + outp +=sprintf (outp,"%8.2f" ,100.0 * t->mperf/t->tsc/tsc_tweak);/* Bzy_MHz */ if (has_aperf) {
@@ -591,12 +584,8 @@ int format_counters(struct thread_data *t, struct core_data *c,if (do_smi) outp +=sprintf (outp,"%8d" , t->smi_count); -if (do_nhm_cstates) { -if (!skip_c1) - outp +=sprintf (outp,"%8.2f" ,100.0 * t->c1/t->tsc); -else - outp +=sprintf (outp,"********" ); - } +if (do_nhm_cstates) + outp +=sprintf (outp,"%8.2f" ,100.0 * t->c1/t->tsc);/* print per-core data only for 1st thread in core */ if (!(t->flags &CPU_IS_FIRST_THREAD_IN_CORE ))
@@ -622,8 +611,8 @@ int format_counters(struct thread_data *t, struct core_data *c,/* GFXrc6 */ if (do_gfx_rc6_ms) { -if (p->gfx_rc6_ms ==-1 ) {/* detect counter reset */ - outp +=sprintf (outp," ***.**" ); +if (p->gfx_rc6_ms ==-1 ) {/* detect GFX counter reset */ + outp +=sprintf (outp," **.**" ); }else { outp +=sprintf (outp,"%8.2f" , p->gfx_rc6_ms /10.0 / interval_float);
@@ -748,7 +737,7 @@ void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_ old =0x100000000 + new - old; \ } -void +int delta_package (struct pkg_data *new,struct pkg_data *old) {
@@ -784,6 +773,8 @@ delta_package(struct pkg_data *new, struct pkg_data *old)DELTA_WRAP32 (new->energy_dram, old->energy_dram);DELTA_WRAP32 (new->rapl_pkg_perf_status, old->rapl_pkg_perf_status);DELTA_WRAP32 (new->rapl_dram_perf_status, old->rapl_dram_perf_status); + +return 0 ; }void
@@ -798,7 +789,7 @@ delta_core(struct core_data *new, struct core_data *old)/* * old = new - old */ -void +int delta_thread (struct thread_data *new,struct thread_data *old,struct core_data *core_delta) {
@@ -817,20 +808,7 @@ delta_thread(struct thread_data *new, struct thread_data *old, old->aperf = new->aperf - old->aperf; old->mperf = new->mperf - old->mperf; }else { - -if (!aperf_mperf_unstable) { -fprintf (outf,"%s: APERF or MPERF went backwards *\n" , progname); -fprintf (outf,"* Frequency results do not cover entire interval *\n" ); -fprintf (outf,"* fix this by running Linux-2.6.30 or later *\n" ); - - aperf_mperf_unstable =1 ; - } -/* -* mperf delta is likely a huge "positive" number -* can not use it for calculating c0 time -*/ - skip_c0 =1 ; - skip_c1 =1 ; +return -1 ; } }
@@ -877,24 +855,30 @@ delta_thread(struct thread_data *new, struct thread_data *old,if (do_smi) old->smi_count = new->smi_count - old->smi_count; + +return 0 ; }int delta_cpu (struct thread_data *t,struct core_data *c,struct pkg_data *p,struct thread_data *t2,struct core_data *c2,struct pkg_data *p2) { +int retval =0 ; +/* calculate core delta only for 1st thread in core */ if (t->flags &CPU_IS_FIRST_THREAD_IN_CORE )delta_core (c, c2);/* always calculate thread delta */ -delta_thread (t, t2, c2);/* c2 is core delta */ + retval =delta_thread (t, t2, c2);/* c2 is core delta */ +if (retval) +return retval;/* calculate package delta only for 1st core in package */ if (t->flags &CPU_IS_FIRST_CORE_IN_PACKAGE ) -delta_package (p, p2); + retval =delta_package (p, p2); -return 0 ; +return retval; }void clear_counters (struct thread_data *t,struct core_data *c,struct pkg_data *p)
@@ -2067,7 +2051,10 @@ void turbostat_loop() }gettimeofday (&tv_odd, (struct timezone *)NULL );timersub (&tv_odd, &tv_even, &tv_delta); -for_all_cpus_2 (delta_cpu,ODD_COUNTERS ,EVEN_COUNTERS ); +if (for_all_cpus_2 (delta_cpu,ODD_COUNTERS ,EVEN_COUNTERS )) { +re_initialize (); + goto restart; + }compute_average (EVEN_COUNTERS );format_all_counters (EVEN_COUNTERS );flush_output_stdout ();
@@ -2083,7 +2070,10 @@ void turbostat_loop() }gettimeofday (&tv_even, (struct timezone *)NULL );timersub (&tv_even, &tv_odd, &tv_delta); -for_all_cpus_2 (delta_cpu,EVEN_COUNTERS ,ODD_COUNTERS ); +if (for_all_cpus_2 (delta_cpu,EVEN_COUNTERS ,ODD_COUNTERS )) { +re_initialize (); + goto restart; + }compute_average (ODD_COUNTERS );format_all_counters (ODD_COUNTERS );flush_output_stdout ();
@@ -3693,9 +3683,12 @@ int fork_it(char **argv)for_all_cpus (get_counters,ODD_COUNTERS );gettimeofday (&tv_odd, (struct timezone *)NULL );timersub (&tv_odd, &tv_even, &tv_delta); -for_all_cpus_2 (delta_cpu,ODD_COUNTERS ,EVEN_COUNTERS ); -compute_average (EVEN_COUNTERS ); -format_all_counters (EVEN_COUNTERS ); +if (for_all_cpus_2 (delta_cpu,ODD_COUNTERS ,EVEN_COUNTERS )) +fprintf (outf,"%s: Counter reset detected\n" , progname); +else { +compute_average (EVEN_COUNTERS ); +format_all_counters (EVEN_COUNTERS ); + }fprintf (outf,"%.6f sec\n" , tv_delta.tv_sec + tv_delta.tv_usec/1000000.0 );
@@ -3722,7 +3715,7 @@ int get_and_dump_counters(void) }void print_version () { -fprintf (outf,"turbostat version 4.12 5 Apr 2016" +fprintf (outf,"turbostat version 4.13 22 Apr 2016" " - Len Brown <[email protected]>\n" ); }
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 3/17 tools/power turbostat: switch to tab delimited output
In reply to Len BrownFrom: Len Brown <[email protected]>
Switch to tab-delimited output from fixed-width columns to make it simpler to import into spreadsheets.
As the fixed width columnns were 8-spaces wide,
the output on the screen should not change.
--- tools/power/x86/turbostat/turbostat.c | 170 +++++++++++++++++----------------- 1 file changed, 85 insertions(+), 85 deletions(-)
tools/power/x86/turbostat/turbostat.c +85 -85
@@ -323,103 +323,103 @@ int get_msr(int cpu, off_t offset, unsigned long long *msr)void print_header (void ) {if (show_pkg) - outp +=sprintf (outp," Package" ); + outp +=sprintf (outp,"\tPackage" );if (show_core) - outp +=sprintf (outp," Core" ); + outp +=sprintf (outp,"\tCore" );if (show_cpu) - outp +=sprintf (outp," CPU" ); + outp +=sprintf (outp,"\tCPU" );if (has_aperf) - outp +=sprintf (outp," Avg_MHz" ); + outp +=sprintf (outp,"\tAvg_MHz" );if (has_aperf) - outp +=sprintf (outp," Busy%%" ); + outp +=sprintf (outp,"\tBusy%%" );if (has_aperf) - outp +=sprintf (outp," Bzy_MHz" ); - outp +=sprintf (outp," TSC_MHz" ); + outp +=sprintf (outp,"\tBzy_MHz" ); + outp +=sprintf (outp,"\tTSC_MHz" );if (extra_delta_offset32) - outp +=sprintf (outp," count 0x%03X" , extra_delta_offset32); + outp +=sprintf (outp,"\tcount 0x%03X" , extra_delta_offset32);if (extra_delta_offset64) - outp +=sprintf (outp," COUNT 0x%03X" , extra_delta_offset64); + outp +=sprintf (outp,"\tCOUNT 0x%03X" , extra_delta_offset64);if (extra_msr_offset32) - outp +=sprintf (outp," MSR 0x%03X" , extra_msr_offset32); + outp +=sprintf (outp,"\tMSR 0x%03X" , extra_msr_offset32);if (extra_msr_offset64) - outp +=sprintf (outp," MSR 0x%03X" , extra_msr_offset64); + outp +=sprintf (outp,"\tMSR 0x%03X" , extra_msr_offset64);if (!debug) goto done;if (do_irq) - outp +=sprintf (outp," IRQ" ); + outp +=sprintf (outp,"\tIRQ" );if (do_smi) - outp +=sprintf (outp," SMI" ); + outp +=sprintf (outp,"\tSMI" );if (do_nhm_cstates) - outp +=sprintf (outp," CPU%%c1" ); + outp +=sprintf (outp,"\tCPU%%c1" );if (do_nhm_cstates && !do_slm_cstates && !do_knl_cstates) - outp +=sprintf (outp," CPU%%c3" ); + outp +=sprintf (outp,"\tCPU%%c3" );if (do_nhm_cstates) - outp +=sprintf (outp," CPU%%c6" ); + outp +=sprintf (outp,"\tCPU%%c6" );if (do_snb_cstates) - outp +=sprintf (outp," CPU%%c7" ); + outp +=sprintf (outp,"\tCPU%%c7" );if (do_dts) - outp +=sprintf (outp," CoreTmp" ); + outp +=sprintf (outp,"\tCoreTmp" );if (do_ptm) - outp +=sprintf (outp," PkgTmp" ); + outp +=sprintf (outp,"\tPkgTmp" );if (do_gfx_rc6_ms) - outp +=sprintf (outp," GFX%%rc6" ); + outp +=sprintf (outp,"\tGFX%%rc6" );if (do_gfx_mhz) - outp +=sprintf (outp," GFXMHz" ); + outp +=sprintf (outp,"\tGFXMHz" );if (do_skl_residency) { - outp +=sprintf (outp," Totl%%C0" ); - outp +=sprintf (outp," Any%%C0" ); - outp +=sprintf (outp," GFX%%C0" ); - outp +=sprintf (outp," CPUGFX%%" ); + outp +=sprintf (outp,"\tTotl%%C0" ); + outp +=sprintf (outp,"\tAny%%C0" ); + outp +=sprintf (outp,"\tGFX%%C0" ); + outp +=sprintf (outp,"\tCPUGFX%%" ); }if (do_pc2) - outp +=sprintf (outp," Pkg%%pc2" ); + outp +=sprintf (outp,"\tPkg%%pc2" );if (do_pc3) - outp +=sprintf (outp," Pkg%%pc3" ); + outp +=sprintf (outp,"\tPkg%%pc3" );if (do_pc6) - outp +=sprintf (outp," Pkg%%pc6" ); + outp +=sprintf (outp,"\tPkg%%pc6" );if (do_pc7) - outp +=sprintf (outp," Pkg%%pc7" ); + outp +=sprintf (outp,"\tPkg%%pc7" );if (do_c8_c9_c10) { - outp +=sprintf (outp," Pkg%%pc8" ); - outp +=sprintf (outp," Pkg%%pc9" ); - outp +=sprintf (outp," Pk%%pc10" ); + outp +=sprintf (outp,"\tPkg%%pc8" ); + outp +=sprintf (outp,"\tPkg%%pc9" ); + outp +=sprintf (outp,"\tPk%%pc10" ); }if (do_rapl && !rapl_joules) {if (do_rapl &RAPL_PKG ) - outp +=sprintf (outp," PkgWatt" ); + outp +=sprintf (outp,"\tPkgWatt" );if (do_rapl &RAPL_CORES ) - outp +=sprintf (outp," CorWatt" ); + outp +=sprintf (outp,"\tCorWatt" );if (do_rapl &RAPL_GFX ) - outp +=sprintf (outp," GFXWatt" ); + outp +=sprintf (outp,"\tGFXWatt" );if (do_rapl &RAPL_DRAM ) - outp +=sprintf (outp," RAMWatt" ); + outp +=sprintf (outp,"\tRAMWatt" );if (do_rapl &RAPL_PKG_PERF_STATUS ) - outp +=sprintf (outp," PKG_%%" ); + outp +=sprintf (outp,"\tPKG_%%" );if (do_rapl &RAPL_DRAM_PERF_STATUS ) - outp +=sprintf (outp," RAM_%%" ); + outp +=sprintf (outp,"\tRAM_%%" ); }else if (do_rapl && rapl_joules) {if (do_rapl &RAPL_PKG ) - outp +=sprintf (outp," Pkg_J" ); + outp +=sprintf (outp,"\tPkg_J" );if (do_rapl &RAPL_CORES ) - outp +=sprintf (outp," Cor_J" ); + outp +=sprintf (outp,"\tCor_J" );if (do_rapl &RAPL_GFX ) - outp +=sprintf (outp," GFX_J" ); + outp +=sprintf (outp,"\tGFX_J" );if (do_rapl &RAPL_DRAM ) - outp +=sprintf (outp," RAM_J" ); + outp +=sprintf (outp,"\tRAM_J" );if (do_rapl &RAPL_PKG_PERF_STATUS ) - outp +=sprintf (outp," PKG_%%" ); + outp +=sprintf (outp,"\tPKG_%%" );if (do_rapl &RAPL_DRAM_PERF_STATUS ) - outp +=sprintf (outp," RAM_%%" ); + outp +=sprintf (outp,"\tRAM_%%" ); } done: outp +=sprintf (outp,"\n" );
@@ -515,91 +515,91 @@ int format_counters(struct thread_data *t, struct core_data *c,/* topo columns, print blanks on 1st (average) line */ if (t == &average.threads) {if (show_pkg) - outp +=sprintf (outp," -" ); + outp +=sprintf (outp,"\t-" );if (show_core) - outp +=sprintf (outp," -" ); + outp +=sprintf (outp,"\t-" );if (show_cpu) - outp +=sprintf (outp," -" ); + outp +=sprintf (outp,"\t-" ); }else {if (show_pkg) {if (p) - outp +=sprintf (outp,"%8d" , p->package_id); + outp +=sprintf (outp,"\t%d" , p->package_id);else - outp +=sprintf (outp," -" ); + outp +=sprintf (outp,"\t-" ); }if (show_core) {if (c) - outp +=sprintf (outp,"%8d" , c->core_id); + outp +=sprintf (outp,"\t%d" , c->core_id);else - outp +=sprintf (outp," -" ); + outp +=sprintf (outp,"\t-" ); }if (show_cpu) - outp +=sprintf (outp,"%8d" , t->cpu_id); + outp +=sprintf (outp,"\t%d" , t->cpu_id); }/* Avg_MHz */ if (has_aperf) - outp +=sprintf (outp,"%8.0f" , + outp +=sprintf (outp,"\t%.0f" ,1.0 / units * t->aperf / interval_float);/* Busy% */ if (has_aperf) - outp +=sprintf (outp,"%8.2f" ,100.0 * t->mperf/t->tsc/tsc_tweak); + outp +=sprintf (outp,"\t%.2f" ,100.0 * t->mperf/t->tsc/tsc_tweak);/* Bzy_MHz */ if (has_aperf) {if (has_base_hz) - outp +=sprintf (outp,"%8.0f" , base_hz / units * t->aperf / t->mperf); + outp +=sprintf (outp,"\t%.0f" , base_hz / units * t->aperf / t->mperf);else - outp +=sprintf (outp,"%8.0f" , + outp +=sprintf (outp,"\t%.0f" ,1.0 * t->tsc / units * t->aperf / t->mperf / interval_float); }/* TSC_MHz */ - outp +=sprintf (outp,"%8.0f" ,1.0 * t->tsc/units/interval_float); + outp +=sprintf (outp,"\t%.0f" ,1.0 * t->tsc/units/interval_float);/* delta */ if (extra_delta_offset32) - outp +=sprintf (outp," %11llu" , t->extra_delta32); + outp +=sprintf (outp,"\t%11llu" , t->extra_delta32);/* DELTA */ if (extra_delta_offset64) - outp +=sprintf (outp," %11llu" , t->extra_delta64); + outp +=sprintf (outp,"\t%11llu" , t->extra_delta64);/* msr */ if (extra_msr_offset32) - outp +=sprintf (outp," 0x%08llx" , t->extra_msr32); + outp +=sprintf (outp,"\t0x%08llx" , t->extra_msr32);/* MSR */ if (extra_msr_offset64) - outp +=sprintf (outp," 0x%016llx" , t->extra_msr64); + outp +=sprintf (outp,"\t0x%016llx" , t->extra_msr64);if (!debug) goto done;/* IRQ */ if (do_irq) - outp +=sprintf (outp,"%8d" , t->irq_count); + outp +=sprintf (outp,"\t%d" , t->irq_count);/* SMI */ if (do_smi) - outp +=sprintf (outp,"%8d" , t->smi_count); + outp +=sprintf (outp,"\t%d" , t->smi_count);if (do_nhm_cstates) - outp +=sprintf (outp,"%8.2f" ,100.0 * t->c1/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * t->c1/t->tsc);/* print per-core data only for 1st thread in core */ if (!(t->flags &CPU_IS_FIRST_THREAD_IN_CORE )) goto done;if (do_nhm_cstates && !do_slm_cstates && !do_knl_cstates) - outp +=sprintf (outp,"%8.2f" ,100.0 * c->c3/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * c->c3/t->tsc);if (do_nhm_cstates) - outp +=sprintf (outp,"%8.2f" ,100.0 * c->c6/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * c->c6/t->tsc);if (do_snb_cstates) - outp +=sprintf (outp,"%8.2f" ,100.0 * c->c7/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * c->c7/t->tsc);if (do_dts) - outp +=sprintf (outp,"%8d" , c->core_temp_c); + outp +=sprintf (outp,"\t%d" , c->core_temp_c);/* print per-package data only for 1st core in package */ if (!(t->flags &CPU_IS_FIRST_CORE_IN_PACKAGE ))
@@ -607,42 +607,42 @@ int format_counters(struct thread_data *t, struct core_data *c,/* PkgTmp */ if (do_ptm) - outp +=sprintf (outp,"%8d" , p->pkg_temp_c); + outp +=sprintf (outp,"\t%d" , p->pkg_temp_c);/* GFXrc6 */ if (do_gfx_rc6_ms) {if (p->gfx_rc6_ms ==-1 ) {/* detect GFX counter reset */ - outp +=sprintf (outp," **.**" ); + outp +=sprintf (outp,"\t**.**" ); }else { - outp +=sprintf (outp,"%8.2f" , + outp +=sprintf (outp,"\t%.2f" , p->gfx_rc6_ms /10.0 / interval_float); } }/* GFXMHz */ if (do_gfx_mhz) - outp +=sprintf (outp,"%8d" , p->gfx_mhz); + outp +=sprintf (outp,"\t%d" , p->gfx_mhz);/* Totl%C0, Any%C0 GFX%C0 CPUGFX% */ if (do_skl_residency) { - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pkg_wtd_core_c0/t->tsc); - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pkg_any_core_c0/t->tsc); - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pkg_any_gfxe_c0/t->tsc); - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pkg_both_core_gfxe_c0/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pkg_wtd_core_c0/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pkg_any_core_c0/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pkg_any_gfxe_c0/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pkg_both_core_gfxe_c0/t->tsc); }if (do_pc2) - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pc2/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pc2/t->tsc);if (do_pc3) - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pc3/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pc3/t->tsc);if (do_pc6) - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pc6/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pc6/t->tsc);if (do_pc7) - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pc7/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pc7/t->tsc);if (do_c8_c9_c10) { - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pc8/t->tsc); - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pc9/t->tsc); - outp +=sprintf (outp,"%8.2f" ,100.0 * p->pc10/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pc8/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pc9/t->tsc); + outp +=sprintf (outp,"\t%.2f" ,100.0 * p->pc10/t->tsc); }/*
@@ -650,7 +650,7 @@ int format_counters(struct thread_data *t, struct core_data *c,* indicate that results are suspect by printing "**" in fraction place. */ if (interval_float < rapl_joule_counter_range) - fmt8 ="%8.2f" ; + fmt8 ="\t%.2f" ;else fmt8 ="%6.0f**" ;
@@ -3715,7 +3715,7 @@ int get_and_dump_counters(void) }void print_version () { -fprintf (outf,"turbostat version 4.13 22 Apr 2016" +fprintf (outf,"turbostat version 4.14 22 Apr 2016" " - Len Brown <[email protected]>\n" ); }
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 4/17 tools/power turbostat: Allocate correct amount of fd and irq entries
In reply to Len BrownFrom: Mika Westerberg <[email protected]>
The tool uses topo.max_cpu_num to determine number of entries needed for fd_percpu[] and irqs_per_cpu[]. For example on a system with 4 CPUs topo.max_cpu_num is 3 so we get too small array for holding per-CPU items.
Fix this to use right number of entries, which is topo.max_cpu_num + 1.
--- tools/power/x86/turbostat/turbostat.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/power/x86/turbostat/turbostat.c +4 -4
@@ -1618,7 +1618,7 @@ void free_fd_percpu(void) {int i; -for (i =0 ; i < topo.max_cpu_num; ++i) { +for (i =0 ; i < topo.max_cpu_num +1 ; ++i) {if (fd_percpu[i] !=0 )close (fd_percpu[i]); }
@@ -3584,7 +3584,7 @@ void allocate_output_buffer() }void allocate_fd_percpu (void ) { - fd_percpu =calloc (topo.max_cpu_num,sizeof (int )); + fd_percpu =calloc (topo.max_cpu_num +1 ,sizeof (int ));if (fd_percpu ==NULL )err (-1 ,"calloc fd_percpu" ); }
@@ -3594,9 +3594,9 @@ void allocate_irq_buffers(void)if (irq_column_2_cpu ==NULL )err (-1 ,"calloc %d" , topo.num_cpus); - irqs_per_cpu =calloc (topo.max_cpu_num,sizeof (int )); + irqs_per_cpu =calloc (topo.max_cpu_num +1 ,sizeof (int ));if (irqs_per_cpu ==NULL ) -err (-1 ,"calloc %d" , topo.max_cpu_num); +err (-1 ,"calloc %d" , topo.max_cpu_num +1 ); }void setup_all_buffers (void ) {
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 5/17 tools/power turbostat: fix error case overflow read of slm_freq_table[]
In reply to Len BrownFrom: Colin Ian King <[email protected]>
When i >= SLM_BCLK_FREQS, the frequency read from the slm_freq_table is off the end of the array because msr is set to 3 rather than the actual array index i. Set i to 3 rather than msr to fix this.
--- tools/power/x86/turbostat/turbostat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/power/x86/turbostat/turbostat.c +1 -1
@@ -3036,7 +3036,7 @@ double slm_bclk(void) i = msr &0xf ;if (i >=SLM_BCLK_FREQS ) {fprintf (outf,"SLM BCLK[%d] invalid\n" , i); - msr =3 ; + i =3 ; } freq = slm_freq_table[i];
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 6/17 tools/power/turbostat: split core MSR support into status + limit
In reply to Len BrownFrom: Jacob Pan <[email protected]>
Some CPUs may not have PP0/Core domain power limit MSRs. We should still allow its domain energy status to be used. This patch splits PP0/Core RAPL into two separate flags for power limit and energy status such that energy status can continue to be reported without power limit.
Without this patch, turbostat will not be able to use the remaining RAPL features if some PL MSRs are not present.
--- tools/power/x86/turbostat/turbostat.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
tools/power/x86/turbostat/turbostat.c +11 -9
@@ -129,9 +129,8 @@ unsigned int has_hwp_pkg; /* IA32_HWP_REQUEST_PKG */#define RAPL_DRAM_POWER_INFO (1 << 5)/* 0x61c MSR_DRAM_POWER_INFO */ -#define RAPL_CORES (1 << 6) +#define RAPL_CORES_POWER_LIMIT (1 << 6)/* 0x638 MSR_PP0_POWER_LIMIT */ -/* 0x639 MSR_PP0_ENERGY_STATUS */ #define RAPL_CORE_POLICY (1 << 7)/* 0x63a MSR_PP0_POLICY */
@@ -139,6 +138,10 @@ unsigned int has_hwp_pkg; /* IA32_HWP_REQUEST_PKG *//* 0x640 MSR_PP1_POWER_LIMIT */ /* 0x641 MSR_PP1_ENERGY_STATUS */ /* 0x642 MSR_PP1_POLICY */ + +#define RAPL_CORES_ENERGY_STATUS (1 << 9) +/* 0x639 MSR_PP0_ENERGY_STATUS */ +#define RAPL_CORES (RAPL_CORES_ENERGY_STATUS | RAPL_CORES_POWER_LIMIT)#define TJMAX_DEFAULT 100#define MAX (a, b) ((a) > (b) ? (a) : (b))
@@ -397,7 +400,7 @@ void print_header(void)if (do_rapl && !rapl_joules) {if (do_rapl &RAPL_PKG ) outp +=sprintf (outp,"\tPkgWatt" ); -if (do_rapl &RAPL_CORES ) +if (do_rapl &RAPL_CORES_ENERGY_STATUS ) outp +=sprintf (outp,"\tCorWatt" );if (do_rapl &RAPL_GFX ) outp +=sprintf (outp,"\tGFXWatt" );
@@ -410,7 +413,7 @@ void print_header(void) }else if (do_rapl && rapl_joules) {if (do_rapl &RAPL_PKG ) outp +=sprintf (outp,"\tPkg_J" ); -if (do_rapl &RAPL_CORES ) +if (do_rapl &RAPL_CORES_ENERGY_STATUS ) outp +=sprintf (outp,"\tCor_J" );if (do_rapl &RAPL_GFX ) outp +=sprintf (outp,"\tGFX_J" );
@@ -657,7 +660,7 @@ int format_counters(struct thread_data *t, struct core_data *c,if (do_rapl && !rapl_joules) {if (do_rapl &RAPL_PKG ) outp +=sprintf (outp, fmt8, p->energy_pkg * rapl_energy_units / interval_float); -if (do_rapl &RAPL_CORES ) +if (do_rapl &RAPL_CORES_ENERGY_STATUS ) outp +=sprintf (outp, fmt8, p->energy_cores * rapl_energy_units / interval_float);if (do_rapl &RAPL_GFX ) outp +=sprintf (outp, fmt8, p->energy_gfx * rapl_energy_units / interval_float);
@@ -1217,7 +1220,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)return -13 ; p->energy_pkg = msr &0xFFFFFFFF ; } -if (do_rapl &RAPL_CORES ) { +if (do_rapl &RAPL_CORES_ENERGY_STATUS ) {if (get_msr (cpu,MSR_PP0_ENERGY_STATUS , &msr))return -14 ; p->energy_cores = msr &0xFFFFFFFF ;
@@ -2657,7 +2660,7 @@ void rapl_probe(unsigned int family, unsigned int model)break ;case 0x37 :/* BYT */ case 0x4D :/* AVN */ - do_rapl =RAPL_PKG |RAPL_CORES ; + do_rapl =RAPL_PKG |RAPL_CORES ;break ;default :return ;
@@ -2872,9 +2875,8 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)fprintf (outf,"cpu%d: MSR_PP0_POLICY: %lld\n" , cpu, msr &0xF ); } } -if (do_rapl &RAPL_CORES ) { +if (do_rapl &RAPL_CORES_POWER_LIMIT ) {if (debug) { -if (get_msr (cpu,MSR_PP0_POWER_LIMIT , &msr))return -9 ; fprintf(outf, "cpu%d: MSR_PP0_POWER_LIMIT: 0x%08llx (%slocked)\n",
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 7/17 tools/power/turbostat: Add Denverton support
In reply to Len BrownFrom: Jacob Pan <[email protected]>
Denverton is an Atom based micro server which shares the same Goldmont architecture as Broxton. The available C-states on Denverton is a subset of Broxton with only C1, C1e, and C6.
--- tools/power/x86/turbostat/turbostat.c | 2 ++ 1 file changed, 2 insertions(+)
tools/power/x86/turbostat/turbostat.c +2 -0
@@ -2204,6 +2204,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) pkg_cstate_limits = phi_pkg_cstate_limits;break ;case 0x5C :/* BXT */ +case 0x5F :/* DNV */ pkg_cstate_limits = bxt_pkg_cstate_limits;break ;default :
@@ -3301,6 +3302,7 @@ void process_cpuid() crystal_hz =25000000 ;/* 25.0 MHz */ break ;case 0x5C :/* BXT */ +case 0x5F :/* DNV */ crystal_hz =19200000 ;/* 19.2 MHz */ break ;default :
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 8/17 tools/power/turbostat: Add Denverton RAPL support
In reply to Len BrownFrom: Jacob Pan <[email protected]>
The Denverton CPU RAPL supports package, core, and DRAM domains.
--- tools/power/x86/turbostat/turbostat.c | 3 +++ 1 file changed, 3 insertions(+)
tools/power/x86/turbostat/turbostat.c +3 -0
@@ -2663,6 +2663,9 @@ void rapl_probe(unsigned int family, unsigned int model)case 0x4D :/* AVN */ do_rapl =RAPL_PKG |RAPL_CORES ;break ; +case 0x5f :/* DNV */ + do_rapl =RAPL_PKG |RAPL_DRAM |RAPL_DRAM_POWER_INFO |RAPL_DRAM_PERF_STATUS |RAPL_PKG_PERF_STATUS |RAPL_PKG_POWER_INFO |RAPL_CORES_ENERGY_STATUS ; +break ;default :return ; }
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 9/17 tools/power turbostat: use intel-family.h model strings
In reply to Len BrownFrom: Len Brown <[email protected]>
All except for model 1F, a Nehalem, which is currently incorrectly indentified as a Westmere in that new header.
--- tools/power/x86/turbostat/Makefile | 1 + tools/power/x86/turbostat/turbostat.c | 249 +++++++++++++++++----------------- 2 files changed, 126 insertions(+), 124 deletions(-)
tools/power/x86/turbostat/Makefile +1 -0
@@ -10,6 +10,7 @@ endif turbostat : turbostat.c CFLAGS += -Wall CFLAGS += -DMSRHEADER='"../../../../arch/x86/include/asm/msr-index.h"' +CFLAGS += -DINTEL_FAMILY_HEADER='"../../../../arch/x86/include/asm/intel-family.h"' %: %.c @mkdir -p $(BUILD_OUTPUT)
tools/power/x86/turbostat/turbostat.c +125 -124
387 lines not on this page · raw message
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 10/17 tools/power turbostat: fix Denverton BCLK
In reply to Len BrownFrom: Xiaolong Wang <[email protected]>
Add Denverton to the group of SandyBridge and later processors, to let the bclk be recognized as 100MHz rather than 133MHz, then avoid the wrong value of the frequencies based on it, including Bzy_MHz, max efficiency freuency, base frequency, and turbo mode frequencies.
--- tools/power/x86/turbostat/turbostat.c | 1 + 1 file changed, 1 insertion(+)
tools/power/x86/turbostat/turbostat.c +1 -0
@@ -2938,6 +2938,7 @@ int has_snb_msrs(unsigned int family, unsigned int model)case INTEL_FAM6_KABYLAKE_DESKTOP :/* KBL */ case INTEL_FAM6_SKYLAKE_X :/* SKX */ case INTEL_FAM6_ATOM_GOLDMONT :/* BXT */ +case INTEL_FAM6_ATOM_DENVERTON :/* DNV */ return 1 ; }return 0 ;
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 11/17 tools/power turbostat: Display HWP OOB status
In reply to Len BrownFrom: Srinivas Pandruvada <[email protected]>
Display if the HWP is enabled in OOB (Out of band) mode.
--- tools/power/x86/turbostat/turbostat.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/power/x86/turbostat/turbostat.c +3 -2
@@ -3168,10 +3168,11 @@ void decode_misc_pwr_mgmt_msr(void)return ;if (!get_msr (base_cpu,MSR_MISC_PWR_MGMT , &msr)) -fprintf (outf,"cpu%d: MSR_MISC_PWR_MGMT: 0x%08llx (%sable-EIST_Coordination %sable-EPB)\n" , +fprintf (outf,"cpu%d: MSR_MISC_PWR_MGMT: 0x%08llx (%sable-EIST_Coordination %sable-EPB %sable-OOB)\n" , base_cpu, msr, msr & (1 <<0 ) ?"DIS" :"EN" , - msr & (1 <<1 ) ?"EN" :"DIS" ); + msr & (1 <<1 ) ?"EN" :"DIS" , + msr & (1 <<8 ) ?"EN" :"DIS" ); }void process_cpuid ()
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 12/17 tools/power turbostat: Support Knights Mill (KNM)
In reply to Len BrownFrom: Len Brown <[email protected]>
Original-author: Piotr Luc <[email protected]>
--- tools/power/x86/turbostat/turbostat.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/power/x86/turbostat/turbostat.c +7 -0
@@ -2202,6 +2202,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) pkg_cstate_limits = amt_pkg_cstate_limits;break ;case INTEL_FAM6_XEON_PHI_KNL :/* PHI */ +case INTEL_FAM6_XEON_PHI_KNM : pkg_cstate_limits = phi_pkg_cstate_limits;break ;case INTEL_FAM6_ATOM_GOLDMONT :/* BXT */
@@ -2228,6 +2229,7 @@ int has_nhm_turbo_ratio_limit(unsigned int family, unsigned int model)case INTEL_FAM6_NEHALEM_EX :/* Nehalem-EX Xeon - Beckton */ case INTEL_FAM6_WESTMERE_EX :/* Westmere-EX Xeon - Eagleton */ case INTEL_FAM6_XEON_PHI_KNL :/* PHI - Knights Landing (different MSR definition) */ +case INTEL_FAM6_XEON_PHI_KNM :return 0 ;default :return 1 ;
@@ -2275,6 +2277,7 @@ int has_knl_turbo_ratio_limit(unsigned int family, unsigned int model)switch (model) {case INTEL_FAM6_XEON_PHI_KNL :/* Knights Landing */ +case INTEL_FAM6_XEON_PHI_KNM :return 1 ;default :return 0 ;
@@ -2305,6 +2308,7 @@ int has_config_tdp(unsigned int family, unsigned int model)case INTEL_FAM6_SKYLAKE_X :/* SKX */ case INTEL_FAM6_XEON_PHI_KNL :/* Knights Landing */ +case INTEL_FAM6_XEON_PHI_KNM :return 1 ;default :return 0 ;
@@ -2606,6 +2610,7 @@ rapl_dram_energy_units_probe(int model, double rapl_energy_units)case INTEL_FAM6_BROADWELL_X :/* BDX */ case INTEL_FAM6_BROADWELL_XEON_D :/* BDX-DE */ case INTEL_FAM6_XEON_PHI_KNL :/* KNL */ +case INTEL_FAM6_XEON_PHI_KNM :return (rapl_dram_energy_units =15.3 /1000000 );default :return (rapl_energy_units);
@@ -2654,6 +2659,7 @@ void rapl_probe(unsigned int family, unsigned int model)case INTEL_FAM6_BROADWELL_XEON_D :/* BDX-DE */ case INTEL_FAM6_SKYLAKE_X :/* SKX */ case INTEL_FAM6_XEON_PHI_KNL :/* KNL */ +case INTEL_FAM6_XEON_PHI_KNM : do_rapl =RAPL_PKG |RAPL_DRAM |RAPL_DRAM_POWER_INFO |RAPL_DRAM_PERF_STATUS |RAPL_PKG_PERF_STATUS |RAPL_PKG_POWER_INFO ;break ;case INTEL_FAM6_SANDYBRIDGE_X :
@@ -3017,6 +3023,7 @@ int is_knl(unsigned int family, unsigned int model)return 0 ;switch (model) {case INTEL_FAM6_XEON_PHI_KNL :/* KNL */ +case INTEL_FAM6_XEON_PHI_KNM :return 1 ; }return 0 ;
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 13/17 tools/power turbostat: fix SKX PKG_CSTATE_LIMIT decoding
In reply to Len BrownFrom: Len Brown <[email protected]>
SKX has fewer package C-states than previous generations, and so the decoding of PKG_CSTATE_LIMIT has changed.
This changes the line ending with pkg-cstate-limit=XXX: pcYYY
--- tools/power/x86/turbostat/turbostat.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/power/x86/turbostat/turbostat.c +4 -1
@@ -1294,6 +1294,7 @@ int slv_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV,int amt_pkg_cstate_limits[16 ] = {PCL__0 ,PCL__1 ,PCL__2 ,PCLRSV ,PCLRSV ,PCLRSV ,PCL__6 ,PCL__7 ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV };int phi_pkg_cstate_limits[16 ] = {PCL__0 ,PCL__2 ,PCL_6N ,PCL_6R ,PCLRSV ,PCLRSV ,PCLRSV ,PCLUNL ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV };int bxt_pkg_cstate_limits[16 ] = {PCL__0 ,PCL__2 ,PCLUNL ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV }; +int skx_pkg_cstate_limits[16 ] = {PCL__0 ,PCL__2 ,PCL_6N ,PCL_6R ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLUNL ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV ,PCLRSV }; static void
@@ -2191,9 +2192,11 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)case INTEL_FAM6_SKYLAKE_DESKTOP :/* SKL */ case INTEL_FAM6_KABYLAKE_MOBILE :/* KBL */ case INTEL_FAM6_KABYLAKE_DESKTOP :/* KBL */ -case INTEL_FAM6_SKYLAKE_X :/* SKX */ pkg_cstate_limits = hsw_pkg_cstate_limits;break ; +case INTEL_FAM6_SKYLAKE_X :/* SKX */ + pkg_cstate_limits = skx_pkg_cstate_limits; +break ;case INTEL_FAM6_ATOM_SILVERMONT1 :/* BYT */ case INTEL_FAM6_ATOM_SILVERMONT2 :/* AVN */ pkg_cstate_limits = slv_pkg_cstate_limits;
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 14/17 tools/power turbostat: line up headers when -M is used
In reply to Len BrownFrom: Len Brown <[email protected]>
The -M option adds an 18-column item, and the header needs to be wide enough to keep the header aligned with the columns.
--- tools/power/x86/turbostat/turbostat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/power/x86/turbostat/turbostat.c +1 -1
@@ -345,7 +345,7 @@ void print_header(void)if (extra_delta_offset64) outp +=sprintf (outp,"\tCOUNT 0x%03X" , extra_delta_offset64);if (extra_msr_offset32) - outp +=sprintf (outp,"\tMSR 0x%03X" , extra_msr_offset32); + outp +=sprintf (outp,"\t MSR 0x%03X" , extra_msr_offset32);if (extra_msr_offset64) outp +=sprintf (outp,"\tMSR 0x%03X" , extra_msr_offset64);
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 15/17 tools/power turbostat: Denverton uses a 25 MHz crystal, not 19.2 MHz
In reply to Len BrownFrom: Len Brown <[email protected]>
This changes only the TSC frequency decoding line seen with --debug
old: TSC: 1382 MHz (19200000 Hz * 216 / 3 / 1000000)
new: TSC: 1800 MHz (25000000 Hz * 216 / 3 / 1000000)
--- tools/power/x86/turbostat/turbostat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/power/x86/turbostat/turbostat.c +1 -1
@@ -3315,10 +3315,10 @@ void process_cpuid() crystal_hz =24000000 ;/* 24.0 MHz */ break ;case INTEL_FAM6_SKYLAKE_X :/* SKX */ +case INTEL_FAM6_ATOM_DENVERTON :/* DNV */ crystal_hz =25000000 ;/* 25.0 MHz */ break ;case INTEL_FAM6_ATOM_GOLDMONT :/* BXT */ -case INTEL_FAM6_ATOM_DENVERTON :/* DNV */ crystal_hz =19200000 ;/* 19.2 MHz */ break ;default :
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 16/17 tools/power turbostat: Make extensible via the --add parameter
In reply to Len BrownFrom: Len Brown <[email protected]>
Create the "--add" parameter. This can be used to teach an existing turbostat binary about any number of any type of counter.
turbostat(8) details the syntax for --add.
--- tools/power/x86/turbostat/turbostat.8 | 22 ++ tools/power/x86/turbostat/turbostat.c | 396 +++++++++++++++++++++++++++++++++- 2 files changed, 409 insertions(+), 9 deletions(-)
tools/power/x86/turbostat/turbostat.8 +22 -0
@@ -25,6 +25,28 @@ Some information is not available on older processors. .SS Options Options can be specified with a single or double '-', and only as much of the option name as necessary to disambiguate it from others is necessary. Note that options are case-sensitive. +.PP +\fB--add attributes\fP add column with counter having specified 'attributes'. The 'location' attribute is required, all others are optional. +.nf + location: {\fBmsrDDD\fP | \fBmsr0xXXX\fP} + msrDDD is a decimal offset, eg. msr16 + msr0xXXX is a hex offset, eg. msr0x10 + + scope: {\fBcpu\fP | \fBcore\fP | \fBpackage\fP} + sample and print the counter for every cpu, core, or package. + default: cpu + + size: {\fBu32\fP | \fBu64\fP } + MSRs are read as 64-bits, u32 truncates the displayed value to 32-bits. + default: u64 + + format: {\fBraw\fP | \fBdelta\fP | \fBpercent\fP} + 'raw' shows the MSR contents in hex. + 'delta' shows the difference in values during the measurement interval. + 'percent' shows the delta as a percentage of the cycles elapsed. + default: delta +.fi +.PP \fB--Counter MSR#\fP shows the delta of the specified 64-bit MSR counter. .PP \fB--counter MSR#\fP shows the delta of the specified 32-bit MSR counter.
tools/power/x86/turbostat/turbostat.c +387 -9
654 lines not on this page · raw message
Signature · 1 line
2.11.0.161.g6610af872
Len Brown
maintainerPATCH 17/17 tools/power turbostat: remove obsolete -M, -m, -C, -c options
In reply to Len BrownFrom: Len Brown <[email protected]>
The new --add option has replaced the -M, -m, -C, -c options Eg.
-M 0x10 is now --add msr0x10,raw
-m 0x10 is now --add msr0x10,raw,u32
-C 0x10 is now --add msr0x10,delta
-c 0x10 is now --add msr0x10,delta,u32
The --add option can be repeated to add any number of counters, while the previous options were limited to adding one of each type.
In addition, the --add option can accept a column label, and can also display a counter as a percentage of elapsed cycles.
Eg. --add msr0x3fe,core,percent,MY_CC3
--- tools/power/x86/turbostat/turbostat.8 | 8 --- tools/power/x86/turbostat/turbostat.c | 104 +--------------------------------- 2 files changed, 2 insertions(+), 110 deletions(-)
tools/power/x86/turbostat/turbostat.8 +0 -8
@@ -47,10 +47,6 @@ name as necessary to disambiguate it from others is necessary. Note that option default: delta .fi .PP -\fB--Counter MSR#\fP shows the delta of the specified 64-bit MSR counter. -.PP -\fB--counter MSR#\fP shows the delta of the specified 32-bit MSR counter. -.PP \fB--Dump\fP displays the raw counter values. .PP \fB--debug\fP displays additional system configuration information. Invoking this parameter
@@ -65,10 +61,6 @@ The file is truncated if it already exists, and it is created if it does not exi .PP \fB--Joules\fP displays energy in Joules, rather than dividing Joules by time to print power in Watts. .PP -\fB--MSR MSR#\fP shows the specified 64-bit MSR value. -.PP -\fB--msr MSR#\fP shows the specified 32-bit MSR value. -.PP \fB--Package\fP limits output to the system summary plus the 1st thread in each Package. .PP \fB--processor\fP limits output to the system summary plus the 1st thread in each processor of each package. Ie. it skips hyper-threaded siblings.
tools/power/x86/turbostat/turbostat.c +2 -102
200 lines not on this page · raw message
Signature · 1 line
2.11.0.161.g6610af872