On Tue, Jan 03, 2017 at 07:08:27AM -0800, Andi Kleen wrote: > From: Andi Kleen <[email protected]> > > The code for handling pmu aliases without specifying > the PMU hardcoded only supported the cpu PMU. > > This patch extends it to work for all PMUs. We always > duplicate the event for all PMUs that have an matching alias. > This allows to automatically expand an alias for all instances > of a PMU (so for example you can monitor all cache boxes with > a single event) > > Signed-off-by: Andi Kleen <[email protected]>
Acked-by: Jiri Olsa <[email protected]> thanks, jirka > --- > tools/perf/util/parse-events.c | 46 > ++++++++++++++++++++++++------------------ > tools/perf/util/parse-events.y | 32 ++++++++++++++++++++++------- > 2 files changed, 51 insertions(+), 27 deletions(-) > > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c > index 3c876b8ba4de..6dbcba7f0969 100644 > --- a/tools/perf/util/parse-events.c > +++ b/tools/perf/util/parse-events.c > @@ -1504,35 +1504,41 @@ static void perf_pmu__parse_init(void) > struct perf_pmu_alias *alias; > int len = 0; > > - pmu = perf_pmu__find("cpu"); > - if ((pmu == NULL) || list_empty(&pmu->aliases)) { > + pmu = NULL; > + while ((pmu = perf_pmu__scan(pmu)) != NULL) { > + list_for_each_entry(alias, &pmu->aliases, list) { > + if (strchr(alias->name, '-')) > + len++; > + len++; > + } > + } > + > + if (len == 0) { > perf_pmu_events_list_num = -1; > return; > } > - list_for_each_entry(alias, &pmu->aliases, list) { > - if (strchr(alias->name, '-')) > - len++; > - len++; > - } > perf_pmu_events_list = malloc(sizeof(struct perf_pmu_event_symbol) * > len); > if (!perf_pmu_events_list) > return; > perf_pmu_events_list_num = len; > > len = 0; > - list_for_each_entry(alias, &pmu->aliases, list) { > - struct perf_pmu_event_symbol *p = perf_pmu_events_list + len; > - char *tmp = strchr(alias->name, '-'); > - > - if (tmp != NULL) { > - SET_SYMBOL(strndup(alias->name, tmp - alias->name), > - PMU_EVENT_SYMBOL_PREFIX); > - p++; > - SET_SYMBOL(strdup(++tmp), PMU_EVENT_SYMBOL_SUFFIX); > - len += 2; > - } else { > - SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL); > - len++; > + pmu = NULL; > + while ((pmu = perf_pmu__scan(pmu)) != NULL) { > + list_for_each_entry(alias, &pmu->aliases, list) { > + struct perf_pmu_event_symbol *p = perf_pmu_events_list > + len; > + char *tmp = strchr(alias->name, '-'); > + > + if (tmp != NULL) { > + SET_SYMBOL(strndup(alias->name, tmp - > alias->name), > + PMU_EVENT_SYMBOL_PREFIX); > + p++; > + SET_SYMBOL(strdup(++tmp), > PMU_EVENT_SYMBOL_SUFFIX); > + len += 2; > + } else { > + SET_SYMBOL(strdup(alias->name), > PMU_EVENT_SYMBOL); > + len++; > + } > } > } > qsort(perf_pmu_events_list, len, > diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y > index 879115f93edc..f3b5ec901600 100644 > --- a/tools/perf/util/parse-events.y > +++ b/tools/perf/util/parse-events.y > @@ -12,6 +12,7 @@ > #include <linux/list.h> > #include <linux/types.h> > #include "util.h" > +#include "pmu.h" > #include "parse-events.h" > #include "parse-events-bison.h" > > @@ -236,15 +237,32 @@ PE_KERNEL_PMU_EVENT sep_dc > struct list_head *head; > struct parse_events_term *term; > struct list_head *list; > + struct perf_pmu *pmu = NULL; > + int ok = 0; > > - ALLOC_LIST(head); > - ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, > - $1, 1, &@1, NULL)); > - list_add_tail(&term->list, head); > - > + /* Add it for all PMUs that support the alias */ > ALLOC_LIST(list); > - ABORT_ON(parse_events_add_pmu(data, list, "cpu", head)); > - parse_events_terms__delete(head); > + while ((pmu = perf_pmu__scan(pmu)) != NULL) { > + struct perf_pmu_alias *alias; > + > + list_for_each_entry(alias, &pmu->aliases, list) { > + if (!strcasecmp(alias->name, $1)) { > + ALLOC_LIST(head); > + ABORT_ON(parse_events_term__num(&term, > PARSE_EVENTS__TERM_TYPE_USER, > + $1, 1, &@1, NULL)); > + list_add_tail(&term->list, head); > + > + if (!parse_events_add_pmu(data, list, > + pmu->name, head)) { > + ok++; > + } > + > + parse_events_terms__delete(head); > + } > + } > + } > + if (!ok) > + YYABORT; > $$ = list; > } > | > -- > 2.9.3 >

