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;
|
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)
|
bool arch_is_topdown_metrics(const struct evsel *evsel)
|
||||||
{
|
{
|
||||||
struct perf_pmu *pmu = evsel__find_pmu(evsel);
|
|
||||||
int config = evsel->core.attr.config;
|
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)
|
if (!pmu || !pmu->is_core)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (perf_pmu__for_each_event(pmu, false, &config,
|
name_from_config = perf_pmu__name_from_config(pmu, config);
|
||||||
compare_topdown_event))
|
return name_from_config && strcasestr(name_from_config, "topdown");
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue