]> www.infradead.org Git - linux.git/commitdiff
perf x86/topdown: Refine helper arch_is_topdown_metrics()
authorDapeng Mi <dapeng1.mi@linux.intel.com>
Fri, 11 Oct 2024 11:02:07 +0000 (11:02 +0000)
committerNamhyung Kim <namhyung@kernel.org>
Wed, 16 Oct 2024 20:36:47 +0000 (13:36 -0700)
Leverage the existed function perf_pmu__name_from_config() to check if
an event is topdown metrics event. perf_pmu__name_from_config() goes
through the defined formats and figures out the config of pre-defined
topdown events.

This avoids to figure out the config of topdown pre-defined events with
hard-coded format strings "event=" and "umask=" and provides more
flexibility.

Suggested-by: Ian Rogers <irogers@google.com>
Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20241011110207.1032235-2-dapeng1.mi@linux.intel.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/arch/x86/util/topdown.c

index cb2c64928bc4bd1dfc09105c8c968c7aac2f33c7..f63747d0abdf9e46ac41fb6b9faa54e115eed6b5 100644 (file)
@@ -41,43 +41,22 @@ bool arch_is_topdown_slots(const struct evsel *evsel)
        return false;
 }
 
-static int compare_topdown_event(void *vstate, struct pmu_event_info *info)
-{
-       int *config = vstate;
-       int event = 0;
-       int umask = 0;
-       char *str;
-
-       if (!strcasestr(info->name, "topdown"))
-               return 0;
-
-       str = strcasestr(info->str, "event=");
-       if (str)
-               sscanf(str, "event=%x", &event);
-
-       str = strcasestr(info->str, "umask=");
-       if (str)
-               sscanf(str, "umask=%x", &umask);
-
-       if (event == 0 && *config == (event | umask << 8))
-               return 1;
-
-       return 0;
-}
-
 bool arch_is_topdown_metrics(const struct evsel *evsel)
 {
-       struct perf_pmu *pmu = evsel__find_pmu(evsel);
        int config = evsel->core.attr.config;
+       const char *name_from_config;
+       struct perf_pmu *pmu;
 
-       if (!pmu || !pmu->is_core)
+       /* All topdown events have an event code of 0. */
+       if ((config & 0xFF) != 0)
                return false;
 
-       if (perf_pmu__for_each_event(pmu, false, &config,
-                                    compare_topdown_event))
-               return true;
+       pmu = evsel__find_pmu(evsel);
+       if (!pmu || !pmu->is_core)
+               return false;
 
-       return false;
+       name_from_config = perf_pmu__name_from_config(pmu, config);
+       return name_from_config && strcasestr(name_from_config, "topdown");
 }
 
 /*