tools/power turbostat: introduce -s to dump counters

The new option allows just run turbostat and get dump of counter values. It's
useful when we have something more than one program to test.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Andy Shevchenko 2014-01-23 17:13:15 +02:00 коммит произвёл Len Brown
Родитель f591c38b91
Коммит 3b4d5c7fec
1 изменённых файлов: 65 добавлений и 33 удалений

Просмотреть файл

@ -46,6 +46,7 @@ unsigned int rapl_verbose; /* set with -R */
unsigned int rapl_joules; /* set with -J */
unsigned int thermal_verbose; /* set with -T */
unsigned int summary_only; /* set with -S */
unsigned int dump_only; /* set with -s */
unsigned int skip_c0;
unsigned int skip_c1;
unsigned int do_nhm_cstates;
@ -353,51 +354,57 @@ void print_header(void)
int dump_counters(struct thread_data *t, struct core_data *c,
struct pkg_data *p)
{
fprintf(stderr, "t %p, c %p, p %p\n", t, c, p);
outp += sprintf(outp, "t %p, c %p, p %p\n", t, c, p);
if (t) {
fprintf(stderr, "CPU: %d flags 0x%x\n", t->cpu_id, t->flags);
fprintf(stderr, "TSC: %016llX\n", t->tsc);
fprintf(stderr, "aperf: %016llX\n", t->aperf);
fprintf(stderr, "mperf: %016llX\n", t->mperf);
fprintf(stderr, "c1: %016llX\n", t->c1);
fprintf(stderr, "msr0x%x: %08llX\n",
outp += sprintf(outp, "CPU: %d flags 0x%x\n",
t->cpu_id, t->flags);
outp += sprintf(outp, "TSC: %016llX\n", t->tsc);
outp += sprintf(outp, "aperf: %016llX\n", t->aperf);
outp += sprintf(outp, "mperf: %016llX\n", t->mperf);
outp += sprintf(outp, "c1: %016llX\n", t->c1);
outp += sprintf(outp, "msr0x%x: %08llX\n",
extra_delta_offset32, t->extra_delta32);
fprintf(stderr, "msr0x%x: %016llX\n",
outp += sprintf(outp, "msr0x%x: %016llX\n",
extra_delta_offset64, t->extra_delta64);
fprintf(stderr, "msr0x%x: %08llX\n",
outp += sprintf(outp, "msr0x%x: %08llX\n",
extra_msr_offset32, t->extra_msr32);
fprintf(stderr, "msr0x%x: %016llX\n",
outp += sprintf(outp, "msr0x%x: %016llX\n",
extra_msr_offset64, t->extra_msr64);
if (do_smi)
fprintf(stderr, "SMI: %08X\n", t->smi_count);
outp += sprintf(outp, "SMI: %08X\n", t->smi_count);
}
if (c) {
fprintf(stderr, "core: %d\n", c->core_id);
fprintf(stderr, "c3: %016llX\n", c->c3);
fprintf(stderr, "c6: %016llX\n", c->c6);
fprintf(stderr, "c7: %016llX\n", c->c7);
fprintf(stderr, "DTS: %dC\n", c->core_temp_c);
outp += sprintf(outp, "core: %d\n", c->core_id);
outp += sprintf(outp, "c3: %016llX\n", c->c3);
outp += sprintf(outp, "c6: %016llX\n", c->c6);
outp += sprintf(outp, "c7: %016llX\n", c->c7);
outp += sprintf(outp, "DTS: %dC\n", c->core_temp_c);
}
if (p) {
fprintf(stderr, "package: %d\n", p->package_id);
fprintf(stderr, "pc2: %016llX\n", p->pc2);
fprintf(stderr, "pc3: %016llX\n", p->pc3);
fprintf(stderr, "pc6: %016llX\n", p->pc6);
fprintf(stderr, "pc7: %016llX\n", p->pc7);
fprintf(stderr, "pc8: %016llX\n", p->pc8);
fprintf(stderr, "pc9: %016llX\n", p->pc9);
fprintf(stderr, "pc10: %016llX\n", p->pc10);
fprintf(stderr, "Joules PKG: %0X\n", p->energy_pkg);
fprintf(stderr, "Joules COR: %0X\n", p->energy_cores);
fprintf(stderr, "Joules GFX: %0X\n", p->energy_gfx);
fprintf(stderr, "Joules RAM: %0X\n", p->energy_dram);
fprintf(stderr, "Throttle PKG: %0X\n", p->rapl_pkg_perf_status);
fprintf(stderr, "Throttle RAM: %0X\n", p->rapl_dram_perf_status);
fprintf(stderr, "PTM: %dC\n", p->pkg_temp_c);
outp += sprintf(outp, "package: %d\n", p->package_id);
outp += sprintf(outp, "pc2: %016llX\n", p->pc2);
outp += sprintf(outp, "pc3: %016llX\n", p->pc3);
outp += sprintf(outp, "pc6: %016llX\n", p->pc6);
outp += sprintf(outp, "pc7: %016llX\n", p->pc7);
outp += sprintf(outp, "pc8: %016llX\n", p->pc8);
outp += sprintf(outp, "pc9: %016llX\n", p->pc9);
outp += sprintf(outp, "pc10: %016llX\n", p->pc10);
outp += sprintf(outp, "Joules PKG: %0X\n", p->energy_pkg);
outp += sprintf(outp, "Joules COR: %0X\n", p->energy_cores);
outp += sprintf(outp, "Joules GFX: %0X\n", p->energy_gfx);
outp += sprintf(outp, "Joules RAM: %0X\n", p->energy_dram);
outp += sprintf(outp, "Throttle PKG: %0X\n",
p->rapl_pkg_perf_status);
outp += sprintf(outp, "Throttle RAM: %0X\n",
p->rapl_dram_perf_status);
outp += sprintf(outp, "PTM: %dC\n", p->pkg_temp_c);
}
outp += sprintf(outp, "\n");
return 0;
}
@ -2289,7 +2296,7 @@ int initialize_counters(int cpu_id)
void allocate_output_buffer()
{
output_buffer = calloc(1, (1 + topo.num_cpus) * 256);
output_buffer = calloc(1, (1 + topo.num_cpus) * 1024);
outp = output_buffer;
if (outp == NULL)
err(-1, "calloc output buffer");
@ -2303,6 +2310,7 @@ void setup_all_buffers(void)
allocate_output_buffer();
for_all_proc_cpus(initialize_counters);
}
void turbostat_init()
{
check_cpuid();
@ -2371,13 +2379,30 @@ int fork_it(char **argv)
return status;
}
int get_and_dump_counters(void)
{
int status;
status = for_all_cpus(get_counters, ODD_COUNTERS);
if (status)
return status;
status = for_all_cpus(dump_counters, ODD_COUNTERS);
if (status)
return status;
flush_stdout();
return status;
}
void cmdline(int argc, char **argv)
{
int opt;
progname = argv[0];
while ((opt = getopt(argc, argv, "+pPSvi:c:C:m:M:RJT:")) != -1) {
while ((opt = getopt(argc, argv, "+pPsSvi:c:C:m:M:RJT:")) != -1) {
switch (opt) {
case 'p':
show_core_only++;
@ -2385,6 +2410,9 @@ void cmdline(int argc, char **argv)
case 'P':
show_pkg_only++;
break;
case 's':
dump_only++;
break;
case 'S':
summary_only++;
break;
@ -2432,6 +2460,10 @@ int main(int argc, char **argv)
turbostat_init();
/* dump counters and exit */
if (dump_only)
return get_and_dump_counters();
/*
* if any params left, it must be a command to fork
*/