From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753287AbdARMKR (ORCPT ); Wed, 18 Jan 2017 07:10:17 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53348 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752203AbdARMKQ (ORCPT ); Wed, 18 Jan 2017 07:10:16 -0500 Date: Wed, 18 Jan 2017 13:10:13 +0100 From: Jiri Olsa To: Andi Kleen Cc: acme@kernel.org, jolsa@kernel.org, linux-kernel@vger.kernel.org, mingo@kernel.org, Andi Kleen Subject: Re: [PATCH 05/11] perf, tools: Support event aliases for non cpu// pmus Message-ID: <20170118121013.GB11946@krava> References: <20170103150833.6694-1-andi@firstfloor.org> <20170103150833.6694-6-andi@firstfloor.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170103150833.6694-6-andi@firstfloor.org> User-Agent: Mutt/1.7.1 (2016-10-04) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 18 Jan 2017 12:10:17 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jan 03, 2017 at 07:08:27AM -0800, Andi Kleen wrote: > From: Andi Kleen > > 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 Acked-by: Jiri Olsa 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 > #include > #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 >