Skip to content

Commit 864bc8c

Browse files
John Garryacmel
authored andcommitted
perf parse-events: Support event alias in form foo-bar-baz
Event aliasing for events whose name in the form foo-bar-baz is not supported, while foo-bar, foo_bar_baz, and other combinations are, i.e. two hyphens are not supported. The HiSilicon D06 platform has events in such form: $ ./perf list sdir-home-migrate List of pre-defined events (to be used in -e): uncore hha: sdir-home-migrate [Unit: hisi_sccl,hha] $ sudo ./perf stat -e sdir-home-migrate event syntax error: 'sdir-home-migrate' \___ parser error Run 'perf list' for a list of valid events Usage: perf stat [<options>] [<command>] -e, --event <event>event selector. use 'perf list' to list available events To support, add an extra PMU event symbol type for "baz", and add a new rule in the bison file. Signed-off-by: John Garry <[email protected]> Acked-by: Ian Rogers <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Kajol Jain <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Qi Liu <[email protected]> Cc: Shaokun Zhang <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 3606c0e commit 864bc8c

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

tools/perf/util/parse-events.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2098,8 +2098,17 @@ static void perf_pmu__parse_init(void)
20982098
pmu = NULL;
20992099
while ((pmu = perf_pmu__scan(pmu)) != NULL) {
21002100
list_for_each_entry(alias, &pmu->aliases, list) {
2101-
if (strchr(alias->name, '-'))
2101+
char *tmp = strchr(alias->name, '-');
2102+
2103+
if (tmp) {
2104+
char *tmp2 = NULL;
2105+
2106+
tmp2 = strchr(tmp + 1, '-');
21022107
len++;
2108+
if (tmp2)
2109+
len++;
2110+
}
2111+
21032112
len++;
21042113
}
21052114
}
@@ -2119,8 +2128,20 @@ static void perf_pmu__parse_init(void)
21192128
list_for_each_entry(alias, &pmu->aliases, list) {
21202129
struct perf_pmu_event_symbol *p = perf_pmu_events_list + len;
21212130
char *tmp = strchr(alias->name, '-');
2131+
char *tmp2 = NULL;
21222132

2123-
if (tmp != NULL) {
2133+
if (tmp)
2134+
tmp2 = strchr(tmp + 1, '-');
2135+
if (tmp2) {
2136+
SET_SYMBOL(strndup(alias->name, tmp - alias->name),
2137+
PMU_EVENT_SYMBOL_PREFIX);
2138+
p++;
2139+
tmp++;
2140+
SET_SYMBOL(strndup(tmp, tmp2 - tmp), PMU_EVENT_SYMBOL_SUFFIX);
2141+
p++;
2142+
SET_SYMBOL(strdup(++tmp2), PMU_EVENT_SYMBOL_SUFFIX2);
2143+
len += 3;
2144+
} else if (tmp) {
21242145
SET_SYMBOL(strndup(alias->name, tmp - alias->name),
21252146
PMU_EVENT_SYMBOL_PREFIX);
21262147
p++;

tools/perf/util/parse-events.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ enum perf_pmu_event_symbol_type {
5353
PMU_EVENT_SYMBOL, /* normal style PMU event */
5454
PMU_EVENT_SYMBOL_PREFIX, /* prefix of pre-suf style event */
5555
PMU_EVENT_SYMBOL_SUFFIX, /* suffix of pre-suf style event */
56+
PMU_EVENT_SYMBOL_SUFFIX2, /* suffix of pre-suf2 style event */
5657
};
5758

5859
struct perf_pmu_event_symbol {

tools/perf/util/parse-events.l

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ static int pmu_str_check(yyscan_t scanner, struct parse_events_state *parse_stat
149149
return PE_PMU_EVENT_PRE;
150150
case PMU_EVENT_SYMBOL_SUFFIX:
151151
return PE_PMU_EVENT_SUF;
152+
case PMU_EVENT_SYMBOL_SUFFIX2:
153+
return PE_PMU_EVENT_SUF2;
152154
case PMU_EVENT_SYMBOL:
153155
return parse_state->fake_pmu
154156
? PE_PMU_EVENT_FAKE : PE_KERNEL_PMU_EVENT;

tools/perf/util/parse-events.y

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static void inc_group_count(struct list_head *list,
6969
%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
7070
%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
7171
%token PE_ERROR
72-
%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
72+
%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_PMU_EVENT_SUF2 PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
7373
%token PE_ARRAY_ALL PE_ARRAY_RANGE
7474
%token PE_DRV_CFG_TERM
7575
%type <num> PE_VALUE
@@ -87,7 +87,7 @@ static void inc_group_count(struct list_head *list,
8787
%type <str> PE_MODIFIER_EVENT
8888
%type <str> PE_MODIFIER_BP
8989
%type <str> PE_EVENT_NAME
90-
%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
90+
%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_PMU_EVENT_SUF2 PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
9191
%type <str> PE_DRV_CFG_TERM
9292
%type <str> event_pmu_name
9393
%destructor { free ($$); } <str>
@@ -372,6 +372,19 @@ PE_KERNEL_PMU_EVENT opt_pmu_config
372372
$$ = list;
373373
}
374374
|
375+
PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF '-' PE_PMU_EVENT_SUF2 sep_dc
376+
{
377+
struct list_head *list;
378+
char pmu_name[128];
379+
snprintf(pmu_name, sizeof(pmu_name), "%s-%s-%s", $1, $3, $5);
380+
free($1);
381+
free($3);
382+
free($5);
383+
if (parse_events_multi_pmu_add(_parse_state, pmu_name, NULL, &list) < 0)
384+
YYABORT;
385+
$$ = list;
386+
}
387+
|
375388
PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
376389
{
377390
struct list_head *list;

0 commit comments

Comments
 (0)