b1507c04b2577493d48bc05cb048256f723f277e
[cascardo/linux.git] / tools / perf / util / mem-events.c
1 #include <stddef.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <errno.h>
5 #include "mem-events.h"
6 #include "debug.h"
7
8 #define E(t, n) { .tag = t, .name = n }
9
10 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
11         E("ldlat-loads",        "cpu/mem-loads,ldlat=30/P"),
12         E("ldlat-stores",       "cpu/mem-stores/P"),
13 };
14
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 }