mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 04:17:47 +00:00
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: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
41618e63f2
commit
1ef7d21afe
@ -47,6 +47,8 @@ name as necessary to disambiguate it from others is necessary. Note that option
|
||||
default: delta
|
||||
.fi
|
||||
.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.
|
||||
.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.
|
||||
|
@ -143,8 +143,9 @@ unsigned int has_misc_feature_control;
|
||||
int backwards_count;
|
||||
char *progname;
|
||||
|
||||
cpu_set_t *cpu_present_set, *cpu_affinity_set;
|
||||
size_t cpu_present_setsize, cpu_affinity_setsize;
|
||||
#define CPU_SUBSET_MAXCPUS 1024 /* need to use before probe... */
|
||||
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
|
||||
|
||||
struct thread_data {
|
||||
@ -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))
|
||||
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;
|
||||
|
||||
tsc = t->tsc * tsc_tweak;
|
||||
@ -4096,6 +4102,7 @@ void help()
|
||||
"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 cpu-set\n"
|
||||
"--quiet skip decoding system configuration header\n"
|
||||
"--interval sec Override default 5-second measurement interval\n"
|
||||
"--help print this help message\n"
|
||||
@ -4158,6 +4165,15 @@ void topology_probe()
|
||||
CPU_ZERO_S(cpu_present_setsize, cpu_present_set);
|
||||
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
|
||||
*/
|
||||
@ -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]
|
||||
* SHOW_LIST - show this list of counters, hide the rest
|
||||
@ -4716,6 +4803,7 @@ void cmdline(int argc, char **argv)
|
||||
int option_index = 0;
|
||||
static struct option long_options[] = {
|
||||
{"add", required_argument, 0, 'a'},
|
||||
{"cpu", required_argument, 0, 'c'},
|
||||
{"Dump", no_argument, 0, 'D'},
|
||||
{"debug", no_argument, 0, 'd'}, /* internal, not documented */
|
||||
{"interval", required_argument, 0, 'i'},
|
||||
@ -4741,6 +4829,9 @@ void cmdline(int argc, char **argv)
|
||||
case 'a':
|
||||
parse_add_command(optarg);
|
||||
break;
|
||||
case 'c':
|
||||
parse_cpu_command(optarg);
|
||||
break;
|
||||
case 'D':
|
||||
dump_only++;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user