Em Fri, Feb 24, 2017 at 11:17:14AM +0100, Jiri Olsa escreveu: > Adding system_wide flag to uncore pmu objects and passing > this flag along to the their events.
Boris, ack? Tested-by? - Arnaldo > Making 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 events > > 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 > > Suggested-by: Borislav Petkov <b...@alien8.de> > Signed-off-by: Jiri Olsa <jo...@kernel.org> > Cc: Namhyung Kim <namhy...@kernel.org> > Cc: Peter Zijlstra <a.p.zijls...@chello.nl> > Cc: Adrian Hunter <adrian.hun...@intel.com> > Cc: Borislav Petkov <b...@alien8.de> > Link: http://lkml.kernel.org/n/tip-rh8kybg6xdadfrw6x6uj3...@git.kernel.org > --- > tools/perf/arch/x86/util/pmu.c | 6 +++++- > tools/perf/builtin-stat.c | 32 +++++++++++++++++++++++++++++--- > tools/perf/util/parse-events.c | 1 + > tools/perf/util/pmu.h | 1 + > 4 files changed, 36 insertions(+), 4 deletions(-) > > diff --git a/tools/perf/arch/x86/util/pmu.c b/tools/perf/arch/x86/util/pmu.c > index 79fe07158d00..654290f87a19 100644 > --- a/tools/perf/arch/x86/util/pmu.c > +++ b/tools/perf/arch/x86/util/pmu.c > @@ -11,8 +11,12 @@ struct perf_event_attr > *perf_pmu__get_default_config(struct perf_pmu *pmu __mayb > #ifdef HAVE_AUXTRACE_SUPPORT > if (!strcmp(pmu->name, INTEL_PT_PMU_NAME)) > return intel_pt_pmu_default_config(pmu); > - if (!strcmp(pmu->name, INTEL_BTS_PMU_NAME)) > + if (!strcmp(pmu->name, INTEL_BTS_PMU_NAME)) { > pmu->selectable = true; > + return NULL; > + } > #endif > + /* All uncore PMUs are monitored system wide. */ > + pmu->system_wide = !strncmp(pmu->name, "uncore", 6); > return NULL; > } > diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c > index 13b54999ad79..c32c7fa6f092 100644 > --- a/tools/perf/builtin-stat.c > +++ b/tools/perf/builtin-stat.c > @@ -2339,6 +2339,34 @@ 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; > + } > + > + target.system_wide = true; > + } > +} > + > int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) > { > const char * const stat_usage[] = { > @@ -2445,9 +2473,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"); > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c > index 67a8aebc67ab..8b06b21f1bbc 100644 > --- a/tools/perf/util/parse-events.c > +++ b/tools/perf/util/parse-events.c > @@ -1254,6 +1254,7 @@ int parse_events_add_pmu(struct parse_events_evlist > *data, > evsel->scale = info.scale; > evsel->per_pkg = info.per_pkg; > evsel->snapshot = info.snapshot; > + evsel->system_wide = pmu->system_wide; > } > > return evsel ? 0 : -ENOMEM; > diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h > index 00852ddc7741..0ce3ffacbf92 100644 > --- a/tools/perf/util/pmu.h > +++ b/tools/perf/util/pmu.h > @@ -21,6 +21,7 @@ struct perf_pmu { > char *name; > __u32 type; > bool selectable; > + bool system_wide; > struct perf_event_attr *default_config; > struct cpu_map *cpus; > struct list_head format; /* HEAD struct perf_pmu_format -> list */ > -- > 2.7.4