diff options
author | Jiri Olsa <jolsa@kernel.org> | 2016-02-24 03:46:42 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-02-24 08:10:59 -0500 |
commit | 54fbad54ebcde9db9c7459e9e379f2350c25e1f1 (patch) | |
tree | dc1ea35ca55cd0dfd2220aa0e061cc5ee1731304 /tools/perf/builtin-mem.c | |
parent | c2b8d8c55c0235e21c563283f634bcfd2ba7bc1e (diff) |
perf mem record: Check for memory events support
Check if current kernel support available memory events and display the
status within -e list option:
$ perf mem record -e list
ldlat-loads : available
ldlat-stores : available
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1456303616-26926-2-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-mem.c')
-rw-r--r-- | tools/perf/builtin-mem.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index b3f8a89ede40..f1fa7b8d1f69 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c | |||
@@ -40,10 +40,11 @@ static int parse_record_events(const struct option *opt, | |||
40 | for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) { | 40 | for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) { |
41 | struct perf_mem_event *e = &perf_mem_events[j]; | 41 | struct perf_mem_event *e = &perf_mem_events[j]; |
42 | 42 | ||
43 | fprintf(stderr, "%-20s%s", | 43 | fprintf(stderr, "%-13s%-*s%s\n", |
44 | e->tag, verbose ? "" : "\n"); | 44 | e->tag, |
45 | if (verbose) | 45 | verbose ? 25 : 0, |
46 | fprintf(stderr, " [%s]\n", e->name); | 46 | verbose ? e->name : "", |
47 | e->supported ? ": available" : ""); | ||
47 | } | 48 | } |
48 | exit(0); | 49 | exit(0); |
49 | } | 50 | } |
@@ -92,6 +93,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) | |||
92 | if (!perf_mem_events[j].record) | 93 | if (!perf_mem_events[j].record) |
93 | continue; | 94 | continue; |
94 | 95 | ||
96 | if (!perf_mem_events[j].supported) { | ||
97 | pr_err("failed: event '%s' not supported\n", | ||
98 | perf_mem_events[j].name); | ||
99 | return -1; | ||
100 | } | ||
101 | |||
95 | rec_argv[i++] = "-e"; | 102 | rec_argv[i++] = "-e"; |
96 | rec_argv[i++] = perf_mem_events[j].name; | 103 | rec_argv[i++] = perf_mem_events[j].name; |
97 | }; | 104 | }; |
@@ -355,6 +362,11 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused) | |||
355 | NULL | 362 | NULL |
356 | }; | 363 | }; |
357 | 364 | ||
365 | if (perf_mem_events__init()) { | ||
366 | pr_err("failed: memory events not supported\n"); | ||
367 | return -1; | ||
368 | } | ||
369 | |||
358 | argc = parse_options_subcommand(argc, argv, mem_options, mem_subcommands, | 370 | argc = parse_options_subcommand(argc, argv, mem_options, mem_subcommands, |
359 | mem_usage, PARSE_OPT_STOP_AT_NON_OPTION); | 371 | mem_usage, PARSE_OPT_STOP_AT_NON_OPTION); |
360 | 372 | ||