Commit dd778a5e authored by Len Brown's avatar Len Brown

tools/power turbostat: support "--hide C1" etc.

Originally, the only way to hide the sysfs C-state statistics columns
was with "--hide sysfs".  This was because we process "--hide" before
we probe for those columns.

hack --hide to remember deferred hide requests, and apply
them when sysfs is probed.

"--hide sysfs" is still available as short-hand to refer to
the entire group of counters.

The down-side of this change is that we no longer error check for
bogus --hide column names.  But the user will quickly figure that
out if a column they mean to hide is still there...
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 4e4e1e7c
...@@ -114,7 +114,7 @@ This is ideal for remote debugging, use the "--out" option to save everything to ...@@ -114,7 +114,7 @@ This is ideal for remote debugging, use the "--out" option to save everything to
.PP .PP
When you are not interested in all that information, and there are several ways to see only what you want. First the "--quiet" option will skip the configuration information, and turbostat will show only the counter columns. Second, you can reduce the columns with the "--hide" and "--show" options. If you use the "--show" option, then turbostat will show only the columns you list. If you use the "--hide" option, turbostat will show all columns, except the ones you list. When you are not interested in all that information, and there are several ways to see only what you want. First the "--quiet" option will skip the configuration information, and turbostat will show only the counter columns. Second, you can reduce the columns with the "--hide" and "--show" options. If you use the "--show" option, then turbostat will show only the columns you list. If you use the "--hide" option, turbostat will show all columns, except the ones you list.
.PP .PP
To find out what columns are available for --show and --hide, the "--list" option is available. Note, however, there is an exception. The C-state columns collected from sysfs "C1,C2,C3,C1%,C2%,C3%" are not built-in counters, but are discovered after --show and --hide are processed. You can use the special counter name "sysfs" to refer to all of them at the same time. To find out what columns are available for --show and --hide, the "--list" option is available. For convenience, the special strings "sysfs" can be used to refer to all of the sysfs C-state counters at once:
.nf .nf
sudo ./turbostat --show sysfs --quiet sleep 10 sudo ./turbostat --show sysfs --quiet sleep 10
10.003837 sec 10.003837 sec
......
...@@ -434,12 +434,45 @@ unsigned long long bic_present = BIC_sysfs; ...@@ -434,12 +434,45 @@ unsigned long long bic_present = BIC_sysfs;
#define BIC_PRESENT(COUNTER_BIT) (bic_present |= COUNTER_BIT) #define BIC_PRESENT(COUNTER_BIT) (bic_present |= COUNTER_BIT)
#define BIC_NOT_PRESENT(COUNTER_BIT) (bic_present &= ~COUNTER_BIT) #define BIC_NOT_PRESENT(COUNTER_BIT) (bic_present &= ~COUNTER_BIT)
#define MAX_DEFERRED 16
char *deferred_skip_names[MAX_DEFERRED];
int deferred_skip_index;
/*
* HIDE_LIST - hide this list of counters, show the rest [default]
* SHOW_LIST - show this list of counters, hide the rest
*/
enum show_hide_mode { SHOW_LIST, HIDE_LIST } global_show_hide_mode = HIDE_LIST;
void help(void)
{
fprintf(outf,
"Usage: turbostat [OPTIONS][(--interval seconds) | COMMAND ...]\n"
"\n"
"Turbostat forks the specified COMMAND and prints statistics\n"
"when COMMAND completes.\n"
"If no COMMAND is specified, turbostat wakes every 5-seconds\n"
"to print statistics, until interrupted.\n"
"--add add a counter\n"
" eg. --add msr0x10,u64,cpu,delta,MY_TSC\n"
"--cpu cpu-set limit output to summary plus cpu-set:\n"
" {core | package | j,k,l..m,n-p }\n"
"--quiet skip decoding system configuration header\n"
"--interval sec Override default 5-second measurement interval\n"
"--help print this help message\n"
"--list list column headers only\n"
"--out file create or truncate \"file\" for all output\n"
"--version print version information\n"
"\n"
"For more help, run \"man turbostat\"\n");
}
/* /*
* bic_lookup * bic_lookup
* for all the strings in comma separate name_list, * for all the strings in comma separate name_list,
* set the approprate bit in return value. * set the approprate bit in return value.
*/ */
unsigned long long bic_lookup(char *name_list) unsigned long long bic_lookup(char *name_list, enum show_hide_mode mode)
{ {
int i; int i;
unsigned long long retval = 0; unsigned long long retval = 0;
...@@ -459,9 +492,20 @@ unsigned long long bic_lookup(char *name_list) ...@@ -459,9 +492,20 @@ unsigned long long bic_lookup(char *name_list)
} }
} }
if (i == MAX_BIC) { if (i == MAX_BIC) {
if (mode == SHOW_LIST) {
fprintf(stderr, "Invalid counter name: %s\n", name_list); fprintf(stderr, "Invalid counter name: %s\n", name_list);
exit(-1); exit(-1);
} }
deferred_skip_names[deferred_skip_index++] = name_list;
if (debug)
fprintf(stderr, "deferred \"%s\"\n", name_list);
if (deferred_skip_index >= MAX_DEFERRED) {
fprintf(stderr, "More than max %d un-recognized --skip options '%s'\n",
MAX_DEFERRED, name_list);
help();
exit(1);
}
}
name_list = comma; name_list = comma;
if (name_list) if (name_list)
...@@ -471,6 +515,7 @@ unsigned long long bic_lookup(char *name_list) ...@@ -471,6 +515,7 @@ unsigned long long bic_lookup(char *name_list)
return retval; return retval;
} }
void print_header(char *delim) void print_header(char *delim)
{ {
struct msr_counter *mp; struct msr_counter *mp;
...@@ -502,20 +547,17 @@ void print_header(char *delim) ...@@ -502,20 +547,17 @@ void print_header(char *delim)
outp += sprintf(outp, "%sSMI", (printed++ ? delim : "")); outp += sprintf(outp, "%sSMI", (printed++ ? delim : ""));
for (mp = sys.tp; mp; mp = mp->next) { for (mp = sys.tp; mp; mp = mp->next) {
if (*delim == ',') {
outp += sprintf(outp, "%s%s", (printed++ ? delim : ""), "sysfs");
break;
}
if (mp->format == FORMAT_RAW) { if (mp->format == FORMAT_RAW) {
if (mp->width == 64) if (mp->width == 64)
outp += sprintf(outp, "%s%18.18s", delim, mp->name); outp += sprintf(outp, "%s%18.18s", (printed++ ? delim : ""), mp->name);
else else
outp += sprintf(outp, "%s%10.10s", delim, mp->name); outp += sprintf(outp, "%s%10.10s", (printed++ ? delim : ""), mp->name);
} else { } else {
if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns) if ((mp->type == COUNTER_ITEMS) && sums_need_wide_columns)
outp += sprintf(outp, "%s%8s", delim, mp->name); outp += sprintf(outp, "%s%8s", (printed++ ? delim : ""), mp->name);
else else
outp += sprintf(outp, "%s%s", delim, mp->name); outp += sprintf(outp, "%s%s", (printed++ ? delim : ""), mp->name);
} }
} }
...@@ -4142,29 +4184,6 @@ void process_cpuid() ...@@ -4142,29 +4184,6 @@ void process_cpuid()
return; return;
} }
void help()
{
fprintf(outf,
"Usage: turbostat [OPTIONS][(--interval seconds) | COMMAND ...]\n"
"\n"
"Turbostat forks the specified COMMAND and prints statistics\n"
"when COMMAND completes.\n"
"If no COMMAND is specified, turbostat wakes every 5-seconds\n"
"to print statistics, until interrupted.\n"
"--add add a counter\n"
" eg. --add msr0x10,u64,cpu,delta,MY_TSC\n"
"--cpu cpu-set limit output to summary plus cpu-set:\n"
" {core | package | j,k,l..m,n-p }\n"
"--quiet skip decoding system configuration header\n"
"--interval sec Override default 5-second measurement interval\n"
"--help print this help message\n"
"--list list column headers only\n"
"--out file create or truncate \"file\" for all output\n"
"--version print version information\n"
"\n"
"For more help, run \"man turbostat\"\n");
}
/* /*
* in /dev/cpu/ return success for names that are numbers * in /dev/cpu/ return success for names that are numbers
...@@ -4689,6 +4708,16 @@ void parse_add_command(char *add_command) ...@@ -4689,6 +4708,16 @@ void parse_add_command(char *add_command)
} }
} }
int is_deferred_skip(char *name)
{
int i;
for (i = 0; i < deferred_skip_index; ++i)
if (!strcmp(name, deferred_skip_names[i]))
return 1;
return 0;
}
void probe_sysfs(void) void probe_sysfs(void)
{ {
char path[64]; char path[64];
...@@ -4720,6 +4749,9 @@ void probe_sysfs(void) ...@@ -4720,6 +4749,9 @@ void probe_sysfs(void)
sprintf(path, "cpuidle/state%d/time", state); sprintf(path, "cpuidle/state%d/time", state);
if (is_deferred_skip(name_buf))
continue;
add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_USEC, add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_USEC,
FORMAT_PERCENT, SYSFS_PERCPU); FORMAT_PERCENT, SYSFS_PERCPU);
} }
...@@ -4741,6 +4773,9 @@ void probe_sysfs(void) ...@@ -4741,6 +4773,9 @@ void probe_sysfs(void)
sprintf(path, "cpuidle/state%d/usage", state); sprintf(path, "cpuidle/state%d/usage", state);
if (is_deferred_skip(name_buf))
continue;
add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_ITEMS, add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_ITEMS,
FORMAT_DELTA, SYSFS_PERCPU); FORMAT_DELTA, SYSFS_PERCPU);
} }
...@@ -4834,12 +4869,6 @@ void parse_cpu_command(char *optarg) ...@@ -4834,12 +4869,6 @@ void parse_cpu_command(char *optarg)
exit(-1); exit(-1);
} }
/*
* HIDE_LIST - hide this list of counters, show the rest [default]
* SHOW_LIST - show this list of counters, hide the rest
*/
enum show_hide_mode { SHOW_LIST, HIDE_LIST } global_show_hide_mode = HIDE_LIST;
int shown; int shown;
/* /*
* parse_show_hide() - process cmdline to set default counter action * parse_show_hide() - process cmdline to set default counter action
...@@ -4853,9 +4882,9 @@ void parse_show_hide(char *optarg, enum show_hide_mode new_mode) ...@@ -4853,9 +4882,9 @@ void parse_show_hide(char *optarg, enum show_hide_mode new_mode)
*/ */
if (new_mode == SHOW_LIST) { if (new_mode == SHOW_LIST) {
if (shown == 0) if (shown == 0)
bic_enabled = bic_lookup(optarg); bic_enabled = bic_lookup(optarg, new_mode);
else else
bic_enabled |= bic_lookup(optarg); bic_enabled |= bic_lookup(optarg, new_mode);
shown = 1; shown = 1;
return; return;
...@@ -4865,7 +4894,7 @@ void parse_show_hide(char *optarg, enum show_hide_mode new_mode) ...@@ -4865,7 +4894,7 @@ void parse_show_hide(char *optarg, enum show_hide_mode new_mode)
* --hide: do not show those specified * --hide: do not show those specified
* multiple invocations simply clear more bits in enabled mask * multiple invocations simply clear more bits in enabled mask
*/ */
bic_enabled &= ~bic_lookup(optarg); bic_enabled &= ~bic_lookup(optarg, new_mode);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment