Skip to content

Commit 90b2c21

Browse files
captain5050acmel
authored andcommitted
perf parse-events: Avoid copying an empty list
In parse_events_add_pmu, delay copying the list of terms until it is known the list contains terms. 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-4-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent 63dfcde commit 90b2c21

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

tools/perf/util/parse-events.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,37 +1398,29 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state,
13981398
struct parse_events_terms parsed_terms;
13991399
bool alias_rewrote_terms = false;
14001400

1401-
parse_events_terms__init(&parsed_terms);
1402-
if (const_parsed_terms) {
1403-
int ret = parse_events_terms__copy(const_parsed_terms, &parsed_terms);
1404-
1405-
if (ret)
1406-
return ret;
1407-
}
1408-
14091401
if (verbose > 1) {
14101402
struct strbuf sb;
14111403

14121404
strbuf_init(&sb, /*hint=*/ 0);
1413-
if (pmu->selectable && list_empty(&parsed_terms.terms)) {
1405+
if (pmu->selectable && const_parsed_terms &&
1406+
list_empty(&const_parsed_terms->terms)) {
14141407
strbuf_addf(&sb, "%s//", pmu->name);
14151408
} else {
14161409
strbuf_addf(&sb, "%s/", pmu->name);
1417-
parse_events_terms__to_strbuf(&parsed_terms, &sb);
1410+
parse_events_terms__to_strbuf(const_parsed_terms, &sb);
14181411
strbuf_addch(&sb, '/');
14191412
}
14201413
fprintf(stderr, "Attempt to add: %s\n", sb.buf);
14211414
strbuf_release(&sb);
14221415
}
1423-
fix_raw(&parsed_terms, pmu);
14241416

14251417
memset(&attr, 0, sizeof(attr));
14261418
if (pmu->perf_event_attr_init_default)
14271419
pmu->perf_event_attr_init_default(pmu, &attr);
14281420

14291421
attr.type = pmu->type;
14301422

1431-
if (list_empty(&parsed_terms.terms)) {
1423+
if (!const_parsed_terms || list_empty(&const_parsed_terms->terms)) {
14321424
evsel = __add_event(list, &parse_state->idx, &attr,
14331425
/*init_attr=*/true, /*name=*/NULL,
14341426
/*metric_id=*/NULL, pmu,
@@ -1437,6 +1429,15 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state,
14371429
return evsel ? 0 : -ENOMEM;
14381430
}
14391431

1432+
parse_events_terms__init(&parsed_terms);
1433+
if (const_parsed_terms) {
1434+
int ret = parse_events_terms__copy(const_parsed_terms, &parsed_terms);
1435+
1436+
if (ret)
1437+
return ret;
1438+
}
1439+
fix_raw(&parsed_terms, pmu);
1440+
14401441
/* Configure attr/terms with a known PMU, this will set hardcoded terms. */
14411442
if (config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu)) {
14421443
parse_events_terms__exit(&parsed_terms);

0 commit comments

Comments
 (0)