diff options
author | Jiri Olsa <jolsa@kernel.org> | 2016-02-15 03:34:35 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-02-23 10:15:59 -0500 |
commit | ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2 (patch) | |
tree | 284f4a451e2a6b01751532b02fa8daa1eb8e0ac4 /tools/perf/util/mem-events.c | |
parent | acbe613e0c03d59cab21aec3565cdb28c7df98c3 (diff) |
perf mem: Add -e record option
Adding -e option for perf mem record command, to be able to specify
memory event directly.
Get list of available events:
$ perf mem record -e list
ldlat-loads
ldlat-stores
Monitor ldlat-loads:
$ perf mem record -e ldlat-loads true
Committer notes:
Further testing:
# perf mem record -e ldlat-loads true
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.020 MB perf.data (10 samples) ]
# perf evlist
cpu/mem-loads,ldlat=30/P
#
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/1455525293-8671-6-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/mem-events.c')
-rw-r--r-- | tools/perf/util/mem-events.c | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c index c6ba0a19ec9a..b1507c04b257 100644 --- a/tools/perf/util/mem-events.c +++ b/tools/perf/util/mem-events.c | |||
@@ -1,10 +1,51 @@ | |||
1 | #include <stddef.h> | ||
2 | #include <stdlib.h> | ||
3 | #include <string.h> | ||
4 | #include <errno.h> | ||
1 | #include "mem-events.h" | 5 | #include "mem-events.h" |
6 | #include "debug.h" | ||
2 | 7 | ||
3 | #define E(n) { .name = n } | 8 | #define E(t, n) { .tag = t, .name = n } |
4 | 9 | ||
5 | struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = { | 10 | struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = { |
6 | E("cpu/mem-loads,ldlat=30/P"), | 11 | E("ldlat-loads", "cpu/mem-loads,ldlat=30/P"), |
7 | E("cpu/mem-stores/P"), | 12 | E("ldlat-stores", "cpu/mem-stores/P"), |
8 | }; | 13 | }; |
9 | 14 | ||
10 | #undef E | 15 | #undef E |
16 | |||
17 | int perf_mem_events__parse(const char *str) | ||
18 | { | ||
19 | char *tok, *saveptr = NULL; | ||
20 | bool found = false; | ||
21 | char *buf; | ||
22 | int j; | ||
23 | |||
24 | /* We need buffer that we know we can write to. */ | ||
25 | buf = malloc(strlen(str) + 1); | ||
26 | if (!buf) | ||
27 | return -ENOMEM; | ||
28 | |||
29 | strcpy(buf, str); | ||
30 | |||
31 | tok = strtok_r((char *)buf, ",", &saveptr); | ||
32 | |||
33 | while (tok) { | ||
34 | for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) { | ||
35 | struct perf_mem_event *e = &perf_mem_events[j]; | ||
36 | |||
37 | if (strstr(e->tag, tok)) | ||
38 | e->record = found = true; | ||
39 | } | ||
40 | |||
41 | tok = strtok_r(NULL, ",", &saveptr); | ||
42 | } | ||
43 | |||
44 | free(buf); | ||
45 | |||
46 | if (found) | ||
47 | return 0; | ||
48 | |||
49 | pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str); | ||
50 | return -1; | ||
51 | } | ||