diff options
-rw-r--r-- | tools/perf/util/evsel.c | 1 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 7 | ||||
-rw-r--r-- | tools/perf/util/parse-events.c | 10 |
3 files changed, 18 insertions, 0 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index c974e08d07ab..63cadaf3e208 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -86,6 +86,7 @@ void perf_evsel__delete(struct perf_evsel *evsel) | |||
86 | { | 86 | { |
87 | perf_evsel__exit(evsel); | 87 | perf_evsel__exit(evsel); |
88 | close_cgroup(evsel->cgrp); | 88 | close_cgroup(evsel->cgrp); |
89 | free(evsel->name); | ||
89 | free(evsel); | 90 | free(evsel); |
90 | } | 91 | } |
91 | 92 | ||
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 1d3d5a3dbe60..f6fc8f651a25 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -37,6 +37,12 @@ struct perf_sample_id { | |||
37 | struct perf_evsel *evsel; | 37 | struct perf_evsel *evsel; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | /** struct perf_evsel - event selector | ||
41 | * | ||
42 | * @name - Can be set to retain the original event name passed by the user, | ||
43 | * so that when showing results in tools such as 'perf stat', we | ||
44 | * show the name used, not some alias. | ||
45 | */ | ||
40 | struct perf_evsel { | 46 | struct perf_evsel { |
41 | struct list_head node; | 47 | struct list_head node; |
42 | struct perf_event_attr attr; | 48 | struct perf_event_attr attr; |
@@ -45,6 +51,7 @@ struct perf_evsel { | |||
45 | struct xyarray *id; | 51 | struct xyarray *id; |
46 | struct perf_counts *counts; | 52 | struct perf_counts *counts; |
47 | int idx; | 53 | int idx; |
54 | char *name; | ||
48 | void *priv; | 55 | void *priv; |
49 | struct cgroup_sel *cgrp; | 56 | struct cgroup_sel *cgrp; |
50 | }; | 57 | }; |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index cf082daa43e3..80a3dd5ef573 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -268,6 +268,9 @@ const char *event_name(struct perf_evsel *evsel) | |||
268 | u64 config = evsel->attr.config; | 268 | u64 config = evsel->attr.config; |
269 | int type = evsel->attr.type; | 269 | int type = evsel->attr.type; |
270 | 270 | ||
271 | if (evsel->name) | ||
272 | return evsel->name; | ||
273 | |||
271 | return __event_name(type, config); | 274 | return __event_name(type, config); |
272 | } | 275 | } |
273 | 276 | ||
@@ -782,8 +785,10 @@ int parse_events(const struct option *opt, const char *str, int unset __used) | |||
782 | struct perf_evlist *evlist = *(struct perf_evlist **)opt->value; | 785 | struct perf_evlist *evlist = *(struct perf_evlist **)opt->value; |
783 | struct perf_event_attr attr; | 786 | struct perf_event_attr attr; |
784 | enum event_result ret; | 787 | enum event_result ret; |
788 | const char *ostr; | ||
785 | 789 | ||
786 | for (;;) { | 790 | for (;;) { |
791 | ostr = str; | ||
787 | memset(&attr, 0, sizeof(attr)); | 792 | memset(&attr, 0, sizeof(attr)); |
788 | ret = parse_event_symbols(opt, &str, &attr); | 793 | ret = parse_event_symbols(opt, &str, &attr); |
789 | if (ret == EVT_FAILED) | 794 | if (ret == EVT_FAILED) |
@@ -798,6 +803,11 @@ int parse_events(const struct option *opt, const char *str, int unset __used) | |||
798 | if (evsel == NULL) | 803 | if (evsel == NULL) |
799 | return -1; | 804 | return -1; |
800 | perf_evlist__add(evlist, evsel); | 805 | perf_evlist__add(evlist, evsel); |
806 | |||
807 | evsel->name = calloc(str - ostr + 1, 1); | ||
808 | if (!evsel->name) | ||
809 | return -1; | ||
810 | strncpy(evsel->name, ostr, str - ostr); | ||
801 | } | 811 | } |
802 | 812 | ||
803 | if (*str == 0) | 813 | if (*str == 0) |