Commit 3cb614a2 authored by Ian Rogers's avatar Ian Rogers Committed by Namhyung Kim
Browse files

perf pmus: Factor perf_pmus__find_by_attr out of evsel__find_pmu



Allow a PMU to be found by a perf_event_attr, useful when creating
evsels.

Reviewed-by: default avatarThomas Falcon <thomas.falcon@intel.com>
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarJames Clark <james.clark@linaro.org>
Link: https://lore.kernel.org/r/20250719030517.1990983-10-irogers@google.com


Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent f958537f
Loading
Loading
Loading
Loading
+17 −12
Original line number Diff line number Diff line
@@ -814,24 +814,18 @@ bool perf_pmus__supports_extended_type(void)
	return perf_pmus__do_support_extended_type;
}

struct perf_pmu *evsel__find_pmu(const struct evsel *evsel)
struct perf_pmu *perf_pmus__find_by_attr(const struct perf_event_attr *attr)
{
	struct perf_pmu *pmu = evsel->pmu;
	bool legacy_core_type;

	if (pmu)
		return pmu;
	struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type);
	u32 type = attr->type;
	bool legacy_core_type = type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE;

	pmu = perf_pmus__find_by_type(evsel->core.attr.type);
	legacy_core_type =
		evsel->core.attr.type == PERF_TYPE_HARDWARE ||
		evsel->core.attr.type == PERF_TYPE_HW_CACHE;
	if (!pmu && legacy_core_type && perf_pmus__supports_extended_type()) {
		u32 type = evsel->core.attr.config >> PERF_PMU_TYPE_SHIFT;
		type = attr->config >> PERF_PMU_TYPE_SHIFT;

		pmu = perf_pmus__find_by_type(type);
	}
	if (!pmu && (legacy_core_type || evsel->core.attr.type == PERF_TYPE_RAW)) {
	if (!pmu && (legacy_core_type || type == PERF_TYPE_RAW)) {
		/*
		 * For legacy events, if there was no extended type info then
		 * assume the PMU is the first core PMU.
@@ -842,6 +836,17 @@ struct perf_pmu *evsel__find_pmu(const struct evsel *evsel)
		 */
		pmu = perf_pmus__find_core_pmu();
	}
	return pmu;
}

struct perf_pmu *evsel__find_pmu(const struct evsel *evsel)
{
	struct perf_pmu *pmu = evsel->pmu;

	if (pmu)
		return pmu;

	pmu = perf_pmus__find_by_attr(&evsel->core.attr);
	((struct evsel *)evsel)->pmu = pmu;
	return pmu;
}
+2 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#include <stdbool.h>
#include <stddef.h>

struct perf_event_attr;
struct perf_pmu;
struct print_callbacks;

@@ -16,6 +17,7 @@ void perf_pmus__destroy(void);

struct perf_pmu *perf_pmus__find(const char *name);
struct perf_pmu *perf_pmus__find_by_type(unsigned int type);
struct perf_pmu *perf_pmus__find_by_attr(const struct perf_event_attr *attr);

struct perf_pmu *perf_pmus__scan(struct perf_pmu *pmu);
struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu);