Skip to content

Commit

Permalink
tools/power turbostat: introduce -s to dump counters
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Len Brown <[email protected]>
  • Loading branch information
andy-shev authored and lenb committed Feb 1, 2014
1 parent f591c38 commit 3b4d5c7
Showing 1 changed file with 65 additions and 33 deletions.
98 changes: 65 additions & 33 deletions tools/power/x86/turbostat/turbostat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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");
Expand All @@ -2303,6 +2310,7 @@ void setup_all_buffers(void)
allocate_output_buffer();
for_all_proc_cpus(initialize_counters);
}

void turbostat_init()
{
check_cpuid();
Expand Down Expand Up @@ -2371,20 +2379,40 @@ 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++;
break;
case 'P':
show_pkg_only++;
break;
case 's':
dump_only++;
break;
case 'S':
summary_only++;
break;
Expand Down Expand Up @@ -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
*/
Expand Down

0 comments on commit 3b4d5c7

Please sign in to comment.