perf tools: Force uncore events to system wide monitoring
Make system wide (-a) the default option if no target was specified and one of following conditions is met: - there's no workload specified (current behaviour) - there is workload specified but all requested events are system wide ones Mixed events core/uncore with workload: $ perf stat -e 'uncore_cbox_0/clockticks/,cycles' sleep 1 Performance counter stats for 'sleep 1': <not supported> uncore_cbox_0/clockticks/ 980,489 cycles 1.000897406 seconds time elapsed Uncore event with workload: $ perf stat -e 'uncore_cbox_0/clockticks/' sleep 1 Performance counter stats for 'system wide': 281,473,897,192,670 uncore_cbox_0/clockticks/ 1.000833784 seconds time elapsed Committer note: When testing I realized the default case for !root, i.e. no events passed via -e, was broke by v2 of this patch, reported and after a patch provided by Jiri it is back working: [acme@jouet linux]$ perf stat usleep 1 Performance counter stats for 'usleep 1': 0.401335 task-clock:u (msec) # 0.297 CPUs utilized 0 context-switches:u # 0.000 K/sec 0 cpu-migrations:u # 0.000 K/sec 48 page-faults:u # 0.120 M/sec 458,146 cycles:u # 1.142 GHz 245,113 instructions:u # 0.54 insn per cycle 47,991 branches:u # 119.578 M/sec 4,022 branch-misses:u # 8.38% of all branches 0.001350029 seconds time elapsed [acme@jouet linux]$ Suggested-and-Tested-by: Borislav Petkov <bp@alien8.de> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/20170227094818.GA12764@krava Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
d0e02579c2
Коммит
e3ba76deef
|
@ -2350,6 +2350,35 @@ static int __cmd_report(int argc, const char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void setup_system_wide(int forks)
|
||||
{
|
||||
/*
|
||||
* Make system wide (-a) the default target if
|
||||
* no target was specified and one of following
|
||||
* conditions is met:
|
||||
*
|
||||
* - there's no workload specified
|
||||
* - there is workload specified but all requested
|
||||
* events are system wide events
|
||||
*/
|
||||
if (!target__none(&target))
|
||||
return;
|
||||
|
||||
if (!forks)
|
||||
target.system_wide = true;
|
||||
else {
|
||||
struct perf_evsel *counter;
|
||||
|
||||
evlist__for_each_entry(evsel_list, counter) {
|
||||
if (!counter->system_wide)
|
||||
return;
|
||||
}
|
||||
|
||||
if (evsel_list->nr_entries)
|
||||
target.system_wide = true;
|
||||
}
|
||||
}
|
||||
|
||||
int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
{
|
||||
const char * const stat_usage[] = {
|
||||
|
@ -2456,9 +2485,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
|
|||
} else if (big_num_opt == 0) /* User passed --no-big-num */
|
||||
big_num = false;
|
||||
|
||||
/* Make system wide (-a) the default target. */
|
||||
if (!argc && target__none(&target))
|
||||
target.system_wide = true;
|
||||
setup_system_wide(argc);
|
||||
|
||||
if (run_count < 0) {
|
||||
pr_err("Run count must be a positive number\n");
|
||||
|
|
|
@ -316,8 +316,9 @@ __add_event(struct list_head *list, int *idx,
|
|||
return NULL;
|
||||
|
||||
(*idx)++;
|
||||
evsel->cpus = cpu_map__get(cpus);
|
||||
evsel->own_cpus = cpu_map__get(cpus);
|
||||
evsel->cpus = cpu_map__get(cpus);
|
||||
evsel->own_cpus = cpu_map__get(cpus);
|
||||
evsel->system_wide = !!cpus;
|
||||
|
||||
if (name)
|
||||
evsel->name = strdup(name);
|
||||
|
|
Загрузка…
Ссылка в новой задаче