mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
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:
parent
b68b5b36c7
commit
fbc798316b
1 changed files with 9 additions and 30 deletions
|
@ -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");
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Reference in a new issue