Commit fbc79831 authored by Dapeng Mi's avatar Dapeng Mi Committed by Namhyung Kim
Browse files

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: default avatarIan Rogers <irogers@google.com>
Signed-off-by: default avatarDapeng Mi <dapeng1.mi@linux.intel.com>
Reviewed-by: default avatarIan Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20241011110207.1032235-2-dapeng1.mi@linux.intel.com


Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent b68b5b36
Loading
Loading
Loading
Loading
+9 −30
Original line number Diff line number Diff line
@@ -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;

	name_from_config = perf_pmu__name_from_config(pmu, config);
	return name_from_config && strcasestr(name_from_config, "topdown");
}

/*