Skip to content

Commit

Permalink
perf test: Add parse-events test for aliases with hyphens
Browse files Browse the repository at this point in the history
Add a test which allows us to test parsing an event alias with hyphens.

Since these events typically do not exist on most host systems, add the
alias to the fake pmu.

Function perf_pmu__test_parse_init() has terms added to match known test
aliases.

Signed-off-by: John Garry <john.garry@huawei.com>
Acked-by: Ian Rogers <irogers@google.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Qi Liu <liuqi115@huawei.com>
Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
Cc: linuxarm@huawei.com
Link: https://lore.kernel.org/r/1642432215-234089-4-git-send-email-john.garry@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
John Garry authored and Arnaldo Carvalho de Melo committed Jan 22, 2022
1 parent 34fa67e commit b4a7276
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 9 deletions.
49 changes: 49 additions & 0 deletions tools/perf/tests/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -2069,6 +2069,31 @@ static int test_event(struct evlist_test *e)
return ret;
}

static int test_event_fake_pmu(const char *str)
{
struct parse_events_error err;
struct evlist *evlist;
int ret;

evlist = evlist__new();
if (!evlist)
return -ENOMEM;

parse_events_error__init(&err);
perf_pmu__test_parse_init();
ret = __parse_events(evlist, str, &err, &perf_pmu__fake);
if (ret) {
pr_debug("failed to parse event '%s', err %d, str '%s'\n",
str, ret, err.str);
parse_events_error__print(&err, str);
}

parse_events_error__exit(&err);
evlist__delete(evlist);

return ret;
}

static int test_events(struct evlist_test *events, unsigned cnt)
{
int ret1, ret2 = 0;
Expand Down Expand Up @@ -2276,6 +2301,26 @@ static int test_pmu_events_alias(char *event, char *alias)
return test_event(&e);
}

static int test_pmu_events_alias2(void)
{
static const char events[][30] = {
"event-hyphen",
"event-two-hyph",
};
unsigned long i;
int ret = 0;

for (i = 0; i < ARRAY_SIZE(events); i++) {
ret = test_event_fake_pmu(&events[i][0]);
if (ret) {
pr_err("check_parse_fake %s failed\n", &events[i][0]);
break;
}
}

return ret;
}

static int test__parse_events(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
{
int ret1, ret2 = 0;
Expand Down Expand Up @@ -2313,6 +2358,10 @@ do { \
return ret;
}

ret1 = test_pmu_events_alias2();
if (!ret2)
ret2 = ret1;

ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
if (!ret2)
ret2 = ret1;
Expand Down
42 changes: 33 additions & 9 deletions tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -1697,6 +1697,15 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
}
}
}

if (parse_state->fake_pmu) {
if (!parse_events_add_pmu(parse_state, list, str, head,
true, true)) {
pr_debug("%s -> %s/%s/\n", str, "fake_pmu", str);
ok++;
}
}

out_err:
if (ok)
*listp = list;
Expand Down Expand Up @@ -2168,23 +2177,38 @@ static void perf_pmu__parse_init(void)
*/
int perf_pmu__test_parse_init(void)
{
struct perf_pmu_event_symbol *list;
struct perf_pmu_event_symbol *list, *tmp, symbols[] = {
{(char *)"read", PMU_EVENT_SYMBOL},
{(char *)"event", PMU_EVENT_SYMBOL_PREFIX},
{(char *)"two", PMU_EVENT_SYMBOL_SUFFIX},
{(char *)"hyphen", PMU_EVENT_SYMBOL_SUFFIX},
{(char *)"hyph", PMU_EVENT_SYMBOL_SUFFIX2},
};
unsigned long i, j;

list = malloc(sizeof(*list) * 1);
tmp = list = malloc(sizeof(*list) * ARRAY_SIZE(symbols));
if (!list)
return -ENOMEM;

list->type = PMU_EVENT_SYMBOL;
list->symbol = strdup("read");

if (!list->symbol) {
free(list);
return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(symbols); i++, tmp++) {
tmp->type = symbols[i].type;
tmp->symbol = strdup(symbols[i].symbol);
if (!list->symbol)
goto err_free;
}

perf_pmu_events_list = list;
perf_pmu_events_list_num = 1;
perf_pmu_events_list_num = ARRAY_SIZE(symbols);

qsort(perf_pmu_events_list, ARRAY_SIZE(symbols),
sizeof(struct perf_pmu_event_symbol), comp_pmu);
return 0;

err_free:
for (j = 0, tmp = list; j < i; j++, tmp++)
free(tmp->symbol);
free(list);
return -ENOMEM;
}

enum perf_pmu_event_symbol_type
Expand Down

0 comments on commit b4a7276

Please sign in to comment.