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>
This commit is contained in:
Dapeng Mi 2024-10-11 11:02:07 +00:00 committed by Namhyung Kim
parent b68b5b36c7
commit fbc798316b

View 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;
/* All topdown events have an event code of 0. */
if ((config & 0xFF) != 0)
return false;
pmu = evsel__find_pmu(evsel);
if (!pmu || !pmu->is_core)
return false;
if (perf_pmu__for_each_event(pmu, false, &config,
compare_topdown_event))
return true;
return false;
name_from_config = perf_pmu__name_from_config(pmu, config);
return name_from_config && strcasestr(name_from_config, "topdown");
}
/*