mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 15:06:46 +07:00
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:
parent
d0e02579c2
commit
e3ba76deef
@ -2350,6 +2350,35 @@ static int __cmd_report(int argc, const char **argv)
|
|||||||
return 0;
|
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)
|
int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
{
|
{
|
||||||
const char * const stat_usage[] = {
|
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 */
|
} else if (big_num_opt == 0) /* User passed --no-big-num */
|
||||||
big_num = false;
|
big_num = false;
|
||||||
|
|
||||||
/* Make system wide (-a) the default target. */
|
setup_system_wide(argc);
|
||||||
if (!argc && target__none(&target))
|
|
||||||
target.system_wide = true;
|
|
||||||
|
|
||||||
if (run_count < 0) {
|
if (run_count < 0) {
|
||||||
pr_err("Run count must be a positive number\n");
|
pr_err("Run count must be a positive number\n");
|
||||||
|
@ -318,6 +318,7 @@ __add_event(struct list_head *list, int *idx,
|
|||||||
(*idx)++;
|
(*idx)++;
|
||||||
evsel->cpus = cpu_map__get(cpus);
|
evsel->cpus = cpu_map__get(cpus);
|
||||||
evsel->own_cpus = cpu_map__get(cpus);
|
evsel->own_cpus = cpu_map__get(cpus);
|
||||||
|
evsel->system_wide = !!cpus;
|
||||||
|
|
||||||
if (name)
|
if (name)
|
||||||
evsel->name = strdup(name);
|
evsel->name = strdup(name);
|
||||||
|
Loading…
Reference in New Issue
Block a user