Skip to content

Commit 8b734ea

Browse files
captain5050acmel
authored andcommitted
perf parse-events: Factor out '<event_or_pmu>/.../' parsing
Factor out the case of an event or PMU name followed by a slash based term list. This is with a view to sharing the code with new legacy hardware parsing. Use early return to reduce indentation in the code. Make parse_events_add_pmu static now it doesn't need sharing with parse-events.y. Signed-off-by: Ian Rogers <irogers@google.com> Reviewed-by: Kan Liang <kan.liang@linux.intel.com> Tested-by: Atish Patra <atishp@rivosinc.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Beeman Strong <beeman@rivosinc.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/r/20240416061533.921723-2-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent e0c48bf commit 8b734ea

File tree

3 files changed

+80
-73
lines changed

3 files changed

+80
-73
lines changed

tools/perf/util/parse-events.c

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1385,7 +1385,7 @@ static bool config_term_percore(struct list_head *config_terms)
13851385
return false;
13861386
}
13871387

1388-
int parse_events_add_pmu(struct parse_events_state *parse_state,
1388+
static int parse_events_add_pmu(struct parse_events_state *parse_state,
13891389
struct list_head *list, const char *name,
13901390
const struct parse_events_terms *const_parsed_terms,
13911391
bool auto_merge_stats, void *loc_)
@@ -1618,6 +1618,74 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
16181618
return ok ? 0 : -1;
16191619
}
16201620

1621+
int parse_events_multi_pmu_add_or_add_pmu(struct parse_events_state *parse_state,
1622+
const char *event_or_pmu,
1623+
const struct parse_events_terms *const_parsed_terms,
1624+
struct list_head **listp,
1625+
void *loc_)
1626+
{
1627+
char *pattern = NULL;
1628+
YYLTYPE *loc = loc_;
1629+
struct perf_pmu *pmu = NULL;
1630+
int ok = 0;
1631+
char *help;
1632+
1633+
*listp = malloc(sizeof(**listp));
1634+
if (!*listp)
1635+
return -ENOMEM;
1636+
1637+
INIT_LIST_HEAD(*listp);
1638+
1639+
/* Attempt to add to list assuming event_or_pmu is a PMU name. */
1640+
if (!parse_events_add_pmu(parse_state, *listp, event_or_pmu, const_parsed_terms,
1641+
/*auto_merge_stats=*/false, loc))
1642+
return 0;
1643+
1644+
/* Failed to add, try wildcard expansion of event_or_pmu as a PMU name. */
1645+
if (asprintf(&pattern, "%s*", event_or_pmu) < 0) {
1646+
zfree(listp);
1647+
return -ENOMEM;
1648+
}
1649+
1650+
while ((pmu = perf_pmus__scan(pmu)) != NULL) {
1651+
const char *name = pmu->name;
1652+
1653+
if (parse_events__filter_pmu(parse_state, pmu))
1654+
continue;
1655+
1656+
if (!strncmp(name, "uncore_", 7) &&
1657+
strncmp(event_or_pmu, "uncore_", 7))
1658+
name += 7;
1659+
if (!perf_pmu__match(pattern, name, event_or_pmu) ||
1660+
!perf_pmu__match(pattern, pmu->alias_name, event_or_pmu)) {
1661+
bool auto_merge_stats = perf_pmu__auto_merge_stats(pmu);
1662+
1663+
if (!parse_events_add_pmu(parse_state, *listp, pmu->name,
1664+
const_parsed_terms,
1665+
auto_merge_stats, loc)) {
1666+
ok++;
1667+
parse_state->wild_card_pmus = true;
1668+
}
1669+
}
1670+
}
1671+
zfree(&pattern);
1672+
if (ok)
1673+
return 0;
1674+
1675+
/* Failure to add, assume event_or_pmu is an event name. */
1676+
zfree(listp);
1677+
if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, const_parsed_terms, listp, loc))
1678+
return 0;
1679+
1680+
if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", event_or_pmu) < 0)
1681+
help = NULL;
1682+
parse_events_error__handle(parse_state->error, loc->first_column,
1683+
strdup("Bad event or PMU"),
1684+
help);
1685+
zfree(listp);
1686+
return -EINVAL;
1687+
}
1688+
16211689
int parse_events__modifier_group(struct list_head *list,
16221690
char *event_mod)
16231691
{

tools/perf/util/parse-events.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,6 @@ int parse_events_add_breakpoint(struct parse_events_state *parse_state,
209209
struct list_head *list,
210210
u64 addr, char *type, u64 len,
211211
struct parse_events_terms *head_config);
212-
int parse_events_add_pmu(struct parse_events_state *parse_state,
213-
struct list_head *list, const char *name,
214-
const struct parse_events_terms *const_parsed_terms,
215-
bool auto_merge_stats, void *loc);
216212

217213
struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
218214
const char *name, const char *metric_id,
@@ -223,6 +219,12 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
223219
const struct parse_events_terms *const_parsed_terms,
224220
struct list_head **listp, void *loc);
225221

222+
int parse_events_multi_pmu_add_or_add_pmu(struct parse_events_state *parse_state,
223+
const char *event_or_pmu,
224+
const struct parse_events_terms *const_parsed_terms,
225+
struct list_head **listp,
226+
void *loc_);
227+
226228
void parse_events__set_leader(char *name, struct list_head *list);
227229
void parse_events_update_lists(struct list_head *list_event,
228230
struct list_head *list_all);

tools/perf/util/parse-events.y

Lines changed: 5 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -273,78 +273,15 @@ event_def: event_pmu |
273273
event_pmu:
274274
PE_NAME opt_pmu_config
275275
{
276-
struct parse_events_state *parse_state = _parse_state;
277276
/* List of created evsels. */
278277
struct list_head *list = NULL;
279-
char *pattern = NULL;
280-
281-
#define CLEANUP \
282-
do { \
283-
parse_events_terms__delete($2); \
284-
free(list); \
285-
free($1); \
286-
free(pattern); \
287-
} while(0)
278+
int err = parse_events_multi_pmu_add_or_add_pmu(_parse_state, $1, $2, &list, &@1);
288279

289-
list = alloc_list();
290-
if (!list) {
291-
CLEANUP;
292-
YYNOMEM;
293-
}
294-
/* Attempt to add to list assuming $1 is a PMU name. */
295-
if (parse_events_add_pmu(parse_state, list, $1, $2, /*auto_merge_stats=*/false, &@1)) {
296-
struct perf_pmu *pmu = NULL;
297-
int ok = 0;
298-
299-
/* Failure to add, try wildcard expansion of $1 as a PMU name. */
300-
if (asprintf(&pattern, "%s*", $1) < 0) {
301-
CLEANUP;
302-
YYNOMEM;
303-
}
304-
305-
while ((pmu = perf_pmus__scan(pmu)) != NULL) {
306-
const char *name = pmu->name;
307-
308-
if (parse_events__filter_pmu(parse_state, pmu))
309-
continue;
310-
311-
if (!strncmp(name, "uncore_", 7) &&
312-
strncmp($1, "uncore_", 7))
313-
name += 7;
314-
if (!perf_pmu__match(pattern, name, $1) ||
315-
!perf_pmu__match(pattern, pmu->alias_name, $1)) {
316-
bool auto_merge_stats = perf_pmu__auto_merge_stats(pmu);
317-
318-
if (!parse_events_add_pmu(parse_state, list, pmu->name, $2,
319-
auto_merge_stats, &@1)) {
320-
ok++;
321-
parse_state->wild_card_pmus = true;
322-
}
323-
}
324-
}
325-
326-
if (!ok) {
327-
/* Failure to add, assume $1 is an event name. */
328-
zfree(&list);
329-
ok = !parse_events_multi_pmu_add(parse_state, $1, $2, &list, &@1);
330-
}
331-
if (!ok) {
332-
struct parse_events_error *error = parse_state->error;
333-
char *help;
334-
335-
if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", $1) < 0)
336-
help = NULL;
337-
parse_events_error__handle(error, @1.first_column,
338-
strdup("Bad event or PMU"),
339-
help);
340-
CLEANUP;
341-
YYABORT;
342-
}
343-
}
280+
parse_events_terms__delete($2);
281+
free($1);
282+
if (err)
283+
PE_ABORT(err);
344284
$$ = list;
345-
list = NULL;
346-
CLEANUP;
347-
#undef CLEANUP
348285
}
349286
|
350287
PE_NAME sep_dc

0 commit comments

Comments
 (0)