summaryrefslogtreecommitdiffstats
path: root/tools/power/x86
diff options
context:
space:
mode:
authorLen Brown <len.brown@intel.com>2017-02-15 21:45:40 -0500
committerLen Brown <len.brown@intel.com>2017-03-01 00:14:23 -0500
commit0de6c0df4ecc32ffaf064fea3a43846ba4474bd0 (patch)
tree0dc54a7f318f054b2e7570d7dc561348dfda1399 /tools/power/x86
parentc8ade3616a1a5cf7767c0338d2b02007796f5d88 (diff)
tools/power turbostat: use wide columns to display large numbers
When a counter overlfows 7 columns, it shifts the remaining columns to the right, so they no longer line up under their column header. Update turbostat to dectect when it is handling large numbers, and switch to wider columns where, necessary. Reported-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'tools/power/x86')
-rw-r--r--tools/power/x86/turbostat/turbostat.c68
1 files changed, 55 insertions, 13 deletions
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 7b02fbb65893..cafc6bba6539 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -50,6 +50,7 @@ int *fd_percpu;
50struct timespec interval_ts = {5, 0}; 50struct timespec interval_ts = {5, 0};
51unsigned int debug; 51unsigned int debug;
52unsigned int quiet; 52unsigned int quiet;
53unsigned int sums_need_wide_columns;
53unsigned int rapl_joules; 54unsigned int rapl_joules;
54unsigned int summary_only; 55unsigned int summary_only;
55unsigned int list_header_only; 56unsigned int list_header_only;
@@ -154,7 +155,7 @@ struct thread_data {
154 unsigned long long aperf; 155 unsigned long long aperf;
155 unsigned long long mperf; 156 unsigned long long mperf;
156 unsigned long long c1; 157 unsigned long long c1;
157 unsigned int irq_count; 158 unsigned long long irq_count;
158 unsigned int smi_count; 159 unsigned int smi_count;
159 unsigned int cpu_id; 160 unsigned int cpu_id;
160 unsigned int flags; 161 unsigned int flags;
@@ -489,8 +490,13 @@ void print_header(char *delim)
489 if (DO_BIC(BIC_TSC_MHz)) 490 if (DO_BIC(BIC_TSC_MHz))
490 outp += sprintf(outp, "%sTSC_MHz", delim); 491 outp += sprintf(outp, "%sTSC_MHz", delim);
491 492
492 if (DO_BIC(BIC_IRQ)) 493 if (DO_BIC(BIC_IRQ)) {
493 outp += sprintf(outp, "%sIRQ", delim); 494 if (sums_need_wide_columns)
495 outp += sprintf(outp, "%s IRQ", delim);
496 else
497 outp += sprintf(outp, "%sIRQ", delim);
498 }
499
494 if (DO_BIC(BIC_SMI)) 500 if (DO_BIC(BIC_SMI))
495 outp += sprintf(outp, "%sSMI", delim); 501 outp += sprintf(outp, "%sSMI", delim);
496 502
@@ -501,7 +507,10 @@ void print_header(char *delim)
501 else 507 else
502 outp += sprintf(outp, "%s%10.10s", delim, mp->name); 508 outp += sprintf(outp, "%s%10.10s", delim, mp->name);
503 } else { 509 } else {
504 outp += sprintf(outp, "%s%s", delim, mp->name); 510 if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns)
511 outp += sprintf(outp, "%s%8s", delim, mp->name);
512 else
513 outp += sprintf(outp, "%s%s", delim, mp->name);
505 } 514 }
506 } 515 }
507 516
@@ -527,7 +536,10 @@ void print_header(char *delim)
527 else 536 else
528 outp += sprintf(outp, "%s%10.10s", delim, mp->name); 537 outp += sprintf(outp, "%s%10.10s", delim, mp->name);
529 } else { 538 } else {
530 outp += sprintf(outp, "%s%s", delim, mp->name); 539 if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns)
540 outp += sprintf(outp, "%s%8s", delim, mp->name);
541 else
542 outp += sprintf(outp, "%s%s", delim, mp->name);
531 } 543 }
532 } 544 }
533 545
@@ -596,7 +608,10 @@ void print_header(char *delim)
596 else 608 else
597 outp += sprintf(outp, "%s%10.10s", delim, mp->name); 609 outp += sprintf(outp, "%s%10.10s", delim, mp->name);
598 } else { 610 } else {
599 outp += sprintf(outp, "%s%s", delim, mp->name); 611 if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns)
612 outp += sprintf(outp, "%s%8s", delim, mp->name);
613 else
614 outp += sprintf(outp, "%s%s", delim, mp->name);
600 } 615 }
601 } 616 }
602 617
@@ -620,7 +635,7 @@ int dump_counters(struct thread_data *t, struct core_data *c,
620 outp += sprintf(outp, "c1: %016llX\n", t->c1); 635 outp += sprintf(outp, "c1: %016llX\n", t->c1);
621 636
622 if (DO_BIC(BIC_IRQ)) 637 if (DO_BIC(BIC_IRQ))
623 outp += sprintf(outp, "IRQ: %d\n", t->irq_count); 638 outp += sprintf(outp, "IRQ: %lld\n", t->irq_count);
624 if (DO_BIC(BIC_SMI)) 639 if (DO_BIC(BIC_SMI))
625 outp += sprintf(outp, "SMI: %d\n", t->smi_count); 640 outp += sprintf(outp, "SMI: %d\n", t->smi_count);
626 641
@@ -755,8 +770,12 @@ int format_counters(struct thread_data *t, struct core_data *c,
755 outp += sprintf(outp, "\t%.0f", 1.0 * t->tsc/units/interval_float); 770 outp += sprintf(outp, "\t%.0f", 1.0 * t->tsc/units/interval_float);
756 771
757 /* IRQ */ 772 /* IRQ */
758 if (DO_BIC(BIC_IRQ)) 773 if (DO_BIC(BIC_IRQ)) {
759 outp += sprintf(outp, "\t%d", t->irq_count); 774 if (sums_need_wide_columns)
775 outp += sprintf(outp, "\t%8lld", t->irq_count);
776 else
777 outp += sprintf(outp, "\t%lld", t->irq_count);
778 }
760 779
761 /* SMI */ 780 /* SMI */
762 if (DO_BIC(BIC_SMI)) 781 if (DO_BIC(BIC_SMI))
@@ -770,7 +789,10 @@ int format_counters(struct thread_data *t, struct core_data *c,
770 else 789 else
771 outp += sprintf(outp, "\t0x%016llx", t->counter[i]); 790 outp += sprintf(outp, "\t0x%016llx", t->counter[i]);
772 } else if (mp->format == FORMAT_DELTA) { 791 } else if (mp->format == FORMAT_DELTA) {
773 outp += sprintf(outp, "\t%lld", t->counter[i]); 792 if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns)
793 outp += sprintf(outp, "\t%8lld", t->counter[i]);
794 else
795 outp += sprintf(outp, "\t%lld", t->counter[i]);
774 } else if (mp->format == FORMAT_PERCENT) { 796 } else if (mp->format == FORMAT_PERCENT) {
775 if (mp->type == COUNTER_USEC) 797 if (mp->type == COUNTER_USEC)
776 outp += sprintf(outp, "\t%.2f", t->counter[i]/interval_float/10000); 798 outp += sprintf(outp, "\t%.2f", t->counter[i]/interval_float/10000);
@@ -809,7 +831,10 @@ int format_counters(struct thread_data *t, struct core_data *c,
809 else 831 else
810 outp += sprintf(outp, "\t0x%016llx", c->counter[i]); 832 outp += sprintf(outp, "\t0x%016llx", c->counter[i]);
811 } else if (mp->format == FORMAT_DELTA) { 833 } else if (mp->format == FORMAT_DELTA) {
812 outp += sprintf(outp, "\t%lld", c->counter[i]); 834 if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns)
835 outp += sprintf(outp, "\t%8lld", c->counter[i]);
836 else
837 outp += sprintf(outp, "\t%lld", c->counter[i]);
813 } else if (mp->format == FORMAT_PERCENT) { 838 } else if (mp->format == FORMAT_PERCENT) {
814 outp += sprintf(outp, "\t%.2f", 100.0 * c->counter[i]/tsc); 839 outp += sprintf(outp, "\t%.2f", 100.0 * c->counter[i]/tsc);
815 } 840 }
@@ -897,7 +922,10 @@ int format_counters(struct thread_data *t, struct core_data *c,
897 else 922 else
898 outp += sprintf(outp, "\t0x%016llx", p->counter[i]); 923 outp += sprintf(outp, "\t0x%016llx", p->counter[i]);
899 } else if (mp->format == FORMAT_DELTA) { 924 } else if (mp->format == FORMAT_DELTA) {
900 outp += sprintf(outp, "\t%lld", p->counter[i]); 925 if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns)
926 outp += sprintf(outp, "\t%8lld", p->counter[i]);
927 else
928 outp += sprintf(outp, "\t%lld", p->counter[i]);
901 } else if (mp->format == FORMAT_PERCENT) { 929 } else if (mp->format == FORMAT_PERCENT) {
902 outp += sprintf(outp, "\t%.2f", 100.0 * p->counter[i]/tsc); 930 outp += sprintf(outp, "\t%.2f", 100.0 * p->counter[i]/tsc);
903 } 931 }
@@ -1272,6 +1300,9 @@ void compute_average(struct thread_data *t, struct core_data *c,
1272 average.threads.mperf /= topo.num_cpus; 1300 average.threads.mperf /= topo.num_cpus;
1273 average.threads.c1 /= topo.num_cpus; 1301 average.threads.c1 /= topo.num_cpus;
1274 1302
1303 if (average.threads.irq_count > 9999999)
1304 sums_need_wide_columns = 1;
1305
1275 average.cores.c3 /= topo.num_cores; 1306 average.cores.c3 /= topo.num_cores;
1276 average.cores.c6 /= topo.num_cores; 1307 average.cores.c6 /= topo.num_cores;
1277 average.cores.c7 /= topo.num_cores; 1308 average.cores.c7 /= topo.num_cores;
@@ -1299,18 +1330,29 @@ void compute_average(struct thread_data *t, struct core_data *c,
1299 for (i = 0, mp = sys.tp; mp; i++, mp = mp->next) { 1330 for (i = 0, mp = sys.tp; mp; i++, mp = mp->next) {
1300 if (mp->format == FORMAT_RAW) 1331 if (mp->format == FORMAT_RAW)
1301 continue; 1332 continue;
1302 if (mp->flags & SYSFS_PERCPU && mp->type == COUNTER_ITEMS) 1333 if (mp->type == COUNTER_ITEMS) {
1334 if (average.threads.counter[i] > 9999999)
1335 sums_need_wide_columns = 1;
1303 continue; 1336 continue;
1337 }
1304 average.threads.counter[i] /= topo.num_cpus; 1338 average.threads.counter[i] /= topo.num_cpus;
1305 } 1339 }
1306 for (i = 0, mp = sys.cp; mp; i++, mp = mp->next) { 1340 for (i = 0, mp = sys.cp; mp; i++, mp = mp->next) {
1307 if (mp->format == FORMAT_RAW) 1341 if (mp->format == FORMAT_RAW)
1308 continue; 1342 continue;
1343 if (mp->type == COUNTER_ITEMS) {
1344 if (average.cores.counter[i] > 9999999)
1345 sums_need_wide_columns = 1;
1346 }
1309 average.cores.counter[i] /= topo.num_cores; 1347 average.cores.counter[i] /= topo.num_cores;
1310 } 1348 }
1311 for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) { 1349 for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) {
1312 if (mp->format == FORMAT_RAW) 1350 if (mp->format == FORMAT_RAW)
1313 continue; 1351 continue;
1352 if (mp->type == COUNTER_ITEMS) {
1353 if (average.packages.counter[i] > 9999999)
1354 sums_need_wide_columns = 1;
1355 }
1314 average.packages.counter[i] /= topo.num_packages; 1356 average.packages.counter[i] /= topo.num_packages;
1315 } 1357 }
1316} 1358}