diff options
author | Dapeng Mi <dapeng1.mi@linux.intel.com> | 2024-10-11 13:02:07 +0200 |
---|---|---|
committer | Namhyung Kim <namhyung@kernel.org> | 2024-10-16 22:36:47 +0200 |
commit | fbc798316bef1b143e2cd0665cc6079529d6b0db (patch) | |
tree | bff5c6944865d0218e36f6ce9628561b4954e68f /tools | |
parent | perf x86/topdown: Make topdown metrics comparators be symmetric (diff) | |
download | linux-fbc798316bef1b143e2cd0665cc6079529d6b0db.tar.xz linux-fbc798316bef1b143e2cd0665cc6079529d6b0db.zip |
perf x86/topdown: Refine helper arch_is_topdown_metrics()
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>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/arch/x86/util/topdown.c | 39 |
1 files changed, 9 insertions, 30 deletions
diff --git a/tools/perf/arch/x86/util/topdown.c b/tools/perf/arch/x86/util/topdown.c index cb2c64928bc4..f63747d0abdf 100644 --- a/tools/perf/arch/x86/util/topdown.c +++ b/tools/perf/arch/x86/util/topdown.c @@ -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"); } /* |