Commit 1ef7d21a authored by Len Brown's avatar Len Brown

tools/power turbostat: add --cpu parameter

With the --cpu parameter, turbostat prints only lines
for the specified set of CPUs:

sudo ./turbostat --quiet --show Core,CPU --cpu 0,1,3..5,6-7
	Core	CPU
	-	-
	0	0
	0	4
	1	1
	1	5
	2	6
	3	3
	3	7
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 41618e63
...@@ -47,6 +47,8 @@ name as necessary to disambiguate it from others is necessary. Note that option ...@@ -47,6 +47,8 @@ name as necessary to disambiguate it from others is necessary. Note that option
default: delta default: delta
.fi .fi
.PP .PP
\fB--cpu cpu-set\fP limit output to system summary plus the specified cpu-set. cpu-set is a comma delimited list of cpu ranges. cpu ranges can be individual cpu numbers or start and end numbers, separated by ".." or '-'. eg. 1,2,8,14..17,21-44
.PP
\fB--hide column\fP do not show the specified columns. May be invoked multiple times, or with a comma-separated list of column names. Use "--hide sysfs" to hide the sysfs statistics columns as a group. \fB--hide column\fP do not show the specified columns. May be invoked multiple times, or with a comma-separated list of column names. Use "--hide sysfs" to hide the sysfs statistics columns as a group.
.PP .PP
\fB--show column\fP show only the specified columns. May be invoked multiple times, or with a comma-separated list of column names. Use "--show sysfs" to show the sysfs statistics columns as a group. \fB--show column\fP show only the specified columns. May be invoked multiple times, or with a comma-separated list of column names. Use "--show sysfs" to show the sysfs statistics columns as a group.
......
...@@ -143,8 +143,9 @@ unsigned int has_misc_feature_control; ...@@ -143,8 +143,9 @@ unsigned int has_misc_feature_control;
int backwards_count; int backwards_count;
char *progname; char *progname;
cpu_set_t *cpu_present_set, *cpu_affinity_set; #define CPU_SUBSET_MAXCPUS 1024 /* need to use before probe... */
size_t cpu_present_setsize, cpu_affinity_setsize; cpu_set_t *cpu_present_set, *cpu_affinity_set, *cpu_subset;
size_t cpu_present_setsize, cpu_affinity_setsize, cpu_subset_size;
#define MAX_ADDED_COUNTERS 16 #define MAX_ADDED_COUNTERS 16
struct thread_data { struct thread_data {
...@@ -700,6 +701,11 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -700,6 +701,11 @@ int format_counters(struct thread_data *t, struct core_data *c,
if (show_pkg_only && !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) if (show_pkg_only && !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE))
return 0; return 0;
/*if not summary line and --cpu is used */
if ((t != &average.threads) &&
(cpu_subset && !CPU_ISSET_S(t->cpu_id, cpu_subset_size, cpu_subset)))
return 0;
interval_float = tv_delta.tv_sec + tv_delta.tv_usec/1000000.0; interval_float = tv_delta.tv_sec + tv_delta.tv_usec/1000000.0;
tsc = t->tsc * tsc_tweak; tsc = t->tsc * tsc_tweak;
...@@ -4096,6 +4102,7 @@ void help() ...@@ -4096,6 +4102,7 @@ void help()
"to print statistics, until interrupted.\n" "to print statistics, until interrupted.\n"
"--add add a counter\n" "--add add a counter\n"
" eg. --add msr0x10,u64,cpu,delta,MY_TSC\n" " eg. --add msr0x10,u64,cpu,delta,MY_TSC\n"
"--cpu cpu-set limit output to summary plus cpu-set cpu-set\n"
"--quiet skip decoding system configuration header\n" "--quiet skip decoding system configuration header\n"
"--interval sec Override default 5-second measurement interval\n" "--interval sec Override default 5-second measurement interval\n"
"--help print this help message\n" "--help print this help message\n"
...@@ -4158,6 +4165,15 @@ void topology_probe() ...@@ -4158,6 +4165,15 @@ void topology_probe()
CPU_ZERO_S(cpu_present_setsize, cpu_present_set); CPU_ZERO_S(cpu_present_setsize, cpu_present_set);
for_all_proc_cpus(mark_cpu_present); for_all_proc_cpus(mark_cpu_present);
/*
* Validate that all cpus in cpu_subset are also in cpu_present_set
*/
for (i = 0; i < CPU_SUBSET_MAXCPUS; ++i) {
if (CPU_ISSET_S(i, cpu_subset_size, cpu_subset))
if (!CPU_ISSET_S(i, cpu_present_setsize, cpu_present_set))
err(1, "cpu%d not present", i);
}
/* /*
* Allocate and initialize cpu_affinity_set * Allocate and initialize cpu_affinity_set
*/ */
...@@ -4675,6 +4691,77 @@ void probe_sysfs(void) ...@@ -4675,6 +4691,77 @@ void probe_sysfs(void)
} }
/*
* parse cpuset with following syntax
* 1,2,4..6,8-10 and set bits in cpu_subset
*/
void parse_cpu_command(char *optarg)
{
unsigned int start, end;
char *next;
cpu_subset = CPU_ALLOC(CPU_SUBSET_MAXCPUS);
if (cpu_subset == NULL)
err(3, "CPU_ALLOC");
cpu_subset_size = CPU_ALLOC_SIZE(CPU_SUBSET_MAXCPUS);
CPU_ZERO_S(cpu_subset_size, cpu_subset);
next = optarg;
while (next && *next) {
if (*next == '-') /* no negative cpu numbers */
goto error;
start = strtoul(next, &next, 10);
if (start >= CPU_SUBSET_MAXCPUS)
goto error;
CPU_SET_S(start, cpu_subset_size, cpu_subset);
if (*next == '\0')
break;
if (*next == ',') {
next += 1;
continue;
}
if (*next == '-') {
next += 1; /* start range */
} else if (*next == '.') {
next += 1;
if (*next == '.')
next += 1; /* start range */
else
goto error;
}
end = strtoul(next, &next, 10);
if (end <= start)
goto error;
while (++start <= end) {
if (start >= CPU_SUBSET_MAXCPUS)
goto error;
CPU_SET_S(start, cpu_subset_size, cpu_subset);
}
if (*next == ',')
next += 1;
else if (*next != '\0')
goto error;
}
return;
error:
fprintf(stderr, "'--cpu %s' malformed\n", optarg);
exit(-1);
}
/* /*
* HIDE_LIST - hide this list of counters, show the rest [default] * HIDE_LIST - hide this list of counters, show the rest [default]
* SHOW_LIST - show this list of counters, hide the rest * SHOW_LIST - show this list of counters, hide the rest
...@@ -4716,6 +4803,7 @@ void cmdline(int argc, char **argv) ...@@ -4716,6 +4803,7 @@ void cmdline(int argc, char **argv)
int option_index = 0; int option_index = 0;
static struct option long_options[] = { static struct option long_options[] = {
{"add", required_argument, 0, 'a'}, {"add", required_argument, 0, 'a'},
{"cpu", required_argument, 0, 'c'},
{"Dump", no_argument, 0, 'D'}, {"Dump", no_argument, 0, 'D'},
{"debug", no_argument, 0, 'd'}, /* internal, not documented */ {"debug", no_argument, 0, 'd'}, /* internal, not documented */
{"interval", required_argument, 0, 'i'}, {"interval", required_argument, 0, 'i'},
...@@ -4741,6 +4829,9 @@ void cmdline(int argc, char **argv) ...@@ -4741,6 +4829,9 @@ void cmdline(int argc, char **argv)
case 'a': case 'a':
parse_add_command(optarg); parse_add_command(optarg);
break; break;
case 'c':
parse_cpu_command(optarg);
break;
case 'D': case 'D':
dump_only++; dump_only++;
break; break;
......
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