Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tools: Default to cpu// for events v5

When an event fails to parse and it's not in a new style format,
try to parse it again as a cpu event.

This allows to use sysfs exported events directly without //, so you can use

perf record -e mem-loads ...

instead of

perf record -e cpu/mem-loads/

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Link: http://lkml.kernel.org/r/1366480949-32292-1-git-send-email-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Andi Kleen and committed by
Arnaldo Carvalho de Melo
50e200f0 38051234

+54 -1
+1
tools/perf/util/include/linux/string.h
··· 1 1 #include <string.h> 2 2 3 3 void *memdup(const void *src, size_t len); 4 + int str_append(char **s, int *len, const char *a);
+29 -1
tools/perf/util/parse-events.c
··· 6 6 #include "parse-options.h" 7 7 #include "parse-events.h" 8 8 #include "exec_cmd.h" 9 - #include "string.h" 9 + #include "linux/string.h" 10 10 #include "symbol.h" 11 11 #include "cache.h" 12 12 #include "header.h" ··· 823 823 return 0; 824 824 } 825 825 826 + static int parse_events__scanner(const char *str, void *data, int start_token); 827 + 828 + static int parse_events_fixup(int ret, const char *str, void *data, 829 + int start_token) 830 + { 831 + char *o = strdup(str); 832 + char *s = NULL; 833 + char *t = o; 834 + char *p; 835 + int len = 0; 836 + 837 + if (!o) 838 + return ret; 839 + while ((p = strsep(&t, ",")) != NULL) { 840 + if (s) 841 + str_append(&s, &len, ","); 842 + str_append(&s, &len, "cpu/"); 843 + str_append(&s, &len, p); 844 + str_append(&s, &len, "/"); 845 + } 846 + free(o); 847 + if (!s) 848 + return -ENOMEM; 849 + return parse_events__scanner(s, data, start_token); 850 + } 851 + 826 852 static int parse_events__scanner(const char *str, void *data, int start_token) 827 853 { 828 854 YY_BUFFER_STATE buffer; ··· 869 843 parse_events__flush_buffer(buffer, scanner); 870 844 parse_events__delete_buffer(buffer, scanner); 871 845 parse_events_lex_destroy(scanner); 846 + if (ret && !strchr(str, '/')) 847 + ret = parse_events_fixup(ret, str, data, start_token); 872 848 return ret; 873 849 } 874 850
+24
tools/perf/util/string.c
··· 387 387 388 388 return p; 389 389 } 390 + 391 + /** 392 + * str_append - reallocate string and append another 393 + * @s: pointer to string pointer 394 + * @len: pointer to len (initialized) 395 + * @a: string to append. 396 + */ 397 + int str_append(char **s, int *len, const char *a) 398 + { 399 + int olen = *s ? strlen(*s) : 0; 400 + int nlen = olen + strlen(a) + 1; 401 + if (*len < nlen) { 402 + *len = *len * 2; 403 + if (*len < nlen) 404 + *len = nlen; 405 + *s = realloc(*s, *len); 406 + if (!*s) 407 + return -ENOMEM; 408 + if (olen == 0) 409 + **s = 0; 410 + } 411 + strcat(*s, a); 412 + return 0; 413 + }