perf parse-events: Avoid copying an empty list
authorIan Rogers <irogers@google.com>
Tue, 16 Apr 2024 06:15:19 +0000 (23:15 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sat, 27 Apr 2024 01:07:20 +0000 (22:07 -0300)
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>
tools/perf/util/parse-events.c

index 2d5a275dd257ef533bf8e1cc2cc8bdefcb958f33..3b1f767039fa66f255954284aeb8026684f3030c 100644 (file)
@@ -1398,29 +1398,21 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state,
        struct parse_events_terms parsed_terms;
        bool alias_rewrote_terms = false;
 
-       parse_events_terms__init(&parsed_terms);
-       if (const_parsed_terms) {
-               int ret = parse_events_terms__copy(const_parsed_terms, &parsed_terms);
-
-               if (ret)
-                       return ret;
-       }
-
        if (verbose > 1) {
                struct strbuf sb;
 
                strbuf_init(&sb, /*hint=*/ 0);
-               if (pmu->selectable && list_empty(&parsed_terms.terms)) {
+               if (pmu->selectable && const_parsed_terms &&
+                   list_empty(&const_parsed_terms->terms)) {
                        strbuf_addf(&sb, "%s//", pmu->name);
                } else {
                        strbuf_addf(&sb, "%s/", pmu->name);
-                       parse_events_terms__to_strbuf(&parsed_terms, &sb);
+                       parse_events_terms__to_strbuf(const_parsed_terms, &sb);
                        strbuf_addch(&sb, '/');
                }
                fprintf(stderr, "Attempt to add: %s\n", sb.buf);
                strbuf_release(&sb);
        }
-       fix_raw(&parsed_terms, pmu);
 
        memset(&attr, 0, sizeof(attr));
        if (pmu->perf_event_attr_init_default)
@@ -1428,7 +1420,7 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state,
 
        attr.type = pmu->type;
 
-       if (list_empty(&parsed_terms.terms)) {
+       if (!const_parsed_terms || list_empty(&const_parsed_terms->terms)) {
                evsel = __add_event(list, &parse_state->idx, &attr,
                                    /*init_attr=*/true, /*name=*/NULL,
                                    /*metric_id=*/NULL, pmu,
@@ -1437,6 +1429,15 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state,
                return evsel ? 0 : -ENOMEM;
        }
 
+       parse_events_terms__init(&parsed_terms);
+       if (const_parsed_terms) {
+               int ret = parse_events_terms__copy(const_parsed_terms, &parsed_terms);
+
+               if (ret)
+                       return ret;
+       }
+       fix_raw(&parsed_terms, pmu);
+
        /* Configure attr/terms with a known PMU, this will set hardcoded terms. */
        if (config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu)) {
                parse_events_terms__exit(&parsed_terms);