Skip to content

Commit b4a7276

Browse files
John Garryacmel
authored andcommitted
perf test: Add parse-events test for aliases with hyphens
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 <[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 34fa67e commit b4a7276

File tree

2 files changed

+82
-9
lines changed

2 files changed

+82
-9
lines changed

tools/perf/tests/parse-events.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2069,6 +2069,31 @@ static int test_event(struct evlist_test *e)
20692069
return ret;
20702070
}
20712071

2072+
static int test_event_fake_pmu(const char *str)
2073+
{
2074+
struct parse_events_error err;
2075+
struct evlist *evlist;
2076+
int ret;
2077+
2078+
evlist = evlist__new();
2079+
if (!evlist)
2080+
return -ENOMEM;
2081+
2082+
parse_events_error__init(&err);
2083+
perf_pmu__test_parse_init();
2084+
ret = __parse_events(evlist, str, &err, &perf_pmu__fake);
2085+
if (ret) {
2086+
pr_debug("failed to parse event '%s', err %d, str '%s'\n",
2087+
str, ret, err.str);
2088+
parse_events_error__print(&err, str);
2089+
}
2090+
2091+
parse_events_error__exit(&err);
2092+
evlist__delete(evlist);
2093+
2094+
return ret;
2095+
}
2096+
20722097
static int test_events(struct evlist_test *events, unsigned cnt)
20732098
{
20742099
int ret1, ret2 = 0;
@@ -2276,6 +2301,26 @@ static int test_pmu_events_alias(char *event, char *alias)
22762301
return test_event(&e);
22772302
}
22782303

2304+
static int test_pmu_events_alias2(void)
2305+
{
2306+
static const char events[][30] = {
2307+
"event-hyphen",
2308+
"event-two-hyph",
2309+
};
2310+
unsigned long i;
2311+
int ret = 0;
2312+
2313+
for (i = 0; i < ARRAY_SIZE(events); i++) {
2314+
ret = test_event_fake_pmu(&events[i][0]);
2315+
if (ret) {
2316+
pr_err("check_parse_fake %s failed\n", &events[i][0]);
2317+
break;
2318+
}
2319+
}
2320+
2321+
return ret;
2322+
}
2323+
22792324
static int test__parse_events(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
22802325
{
22812326
int ret1, ret2 = 0;
@@ -2313,6 +2358,10 @@ do { \
23132358
return ret;
23142359
}
23152360

2361+
ret1 = test_pmu_events_alias2();
2362+
if (!ret2)
2363+
ret2 = ret1;
2364+
23162365
ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
23172366
if (!ret2)
23182367
ret2 = ret1;

tools/perf/util/parse-events.c

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,15 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
16971697
}
16981698
}
16991699
}
1700+
1701+
if (parse_state->fake_pmu) {
1702+
if (!parse_events_add_pmu(parse_state, list, str, head,
1703+
true, true)) {
1704+
pr_debug("%s -> %s/%s/\n", str, "fake_pmu", str);
1705+
ok++;
1706+
}
1707+
}
1708+
17001709
out_err:
17011710
if (ok)
17021711
*listp = list;
@@ -2168,23 +2177,38 @@ static void perf_pmu__parse_init(void)
21682177
*/
21692178
int perf_pmu__test_parse_init(void)
21702179
{
2171-
struct perf_pmu_event_symbol *list;
2180+
struct perf_pmu_event_symbol *list, *tmp, symbols[] = {
2181+
{(char *)"read", PMU_EVENT_SYMBOL},
2182+
{(char *)"event", PMU_EVENT_SYMBOL_PREFIX},
2183+
{(char *)"two", PMU_EVENT_SYMBOL_SUFFIX},
2184+
{(char *)"hyphen", PMU_EVENT_SYMBOL_SUFFIX},
2185+
{(char *)"hyph", PMU_EVENT_SYMBOL_SUFFIX2},
2186+
};
2187+
unsigned long i, j;
21722188

2173-
list = malloc(sizeof(*list) * 1);
2189+
tmp = list = malloc(sizeof(*list) * ARRAY_SIZE(symbols));
21742190
if (!list)
21752191
return -ENOMEM;
21762192

2177-
list->type = PMU_EVENT_SYMBOL;
2178-
list->symbol = strdup("read");
2179-
2180-
if (!list->symbol) {
2181-
free(list);
2182-
return -ENOMEM;
2193+
for (i = 0; i < ARRAY_SIZE(symbols); i++, tmp++) {
2194+
tmp->type = symbols[i].type;
2195+
tmp->symbol = strdup(symbols[i].symbol);
2196+
if (!list->symbol)
2197+
goto err_free;
21832198
}
21842199

21852200
perf_pmu_events_list = list;
2186-
perf_pmu_events_list_num = 1;
2201+
perf_pmu_events_list_num = ARRAY_SIZE(symbols);
2202+
2203+
qsort(perf_pmu_events_list, ARRAY_SIZE(symbols),
2204+
sizeof(struct perf_pmu_event_symbol), comp_pmu);
21872205
return 0;
2206+
2207+
err_free:
2208+
for (j = 0, tmp = list; j < i; j++, tmp++)
2209+
free(tmp->symbol);
2210+
free(list);
2211+
return -ENOMEM;
21882212
}
21892213

21902214
enum perf_pmu_event_symbol_type

0 commit comments

Comments
 (0)