Skip to content

Commit 3cb614a

Browse files
captain5050namhyung
authored andcommitted
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: Thomas Falcon <thomas.falcon@intel.com> Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: James Clark <james.clark@linaro.org> Link: https://lore.kernel.org/r/20250719030517.1990983-10-irogers@google.com Signed-off-by: Namhyung Kim <namhyung@kernel.org>
1 parent f958537 commit 3cb614a

2 files changed

Lines changed: 19 additions & 12 deletions

File tree

tools/perf/util/pmus.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -814,24 +814,18 @@ bool perf_pmus__supports_extended_type(void)
814814
return perf_pmus__do_support_extended_type;
815815
}
816816

817-
struct perf_pmu *evsel__find_pmu(const struct evsel *evsel)
817+
struct perf_pmu *perf_pmus__find_by_attr(const struct perf_event_attr *attr)
818818
{
819-
struct perf_pmu *pmu = evsel->pmu;
820-
bool legacy_core_type;
821-
822-
if (pmu)
823-
return pmu;
819+
struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type);
820+
u32 type = attr->type;
821+
bool legacy_core_type = type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE;
824822

825-
pmu = perf_pmus__find_by_type(evsel->core.attr.type);
826-
legacy_core_type =
827-
evsel->core.attr.type == PERF_TYPE_HARDWARE ||
828-
evsel->core.attr.type == PERF_TYPE_HW_CACHE;
829823
if (!pmu && legacy_core_type && perf_pmus__supports_extended_type()) {
830-
u32 type = evsel->core.attr.config >> PERF_PMU_TYPE_SHIFT;
824+
type = attr->config >> PERF_PMU_TYPE_SHIFT;
831825

832826
pmu = perf_pmus__find_by_type(type);
833827
}
834-
if (!pmu && (legacy_core_type || evsel->core.attr.type == PERF_TYPE_RAW)) {
828+
if (!pmu && (legacy_core_type || type == PERF_TYPE_RAW)) {
835829
/*
836830
* For legacy events, if there was no extended type info then
837831
* assume the PMU is the first core PMU.
@@ -842,6 +836,17 @@ struct perf_pmu *evsel__find_pmu(const struct evsel *evsel)
842836
*/
843837
pmu = perf_pmus__find_core_pmu();
844838
}
839+
return pmu;
840+
}
841+
842+
struct perf_pmu *evsel__find_pmu(const struct evsel *evsel)
843+
{
844+
struct perf_pmu *pmu = evsel->pmu;
845+
846+
if (pmu)
847+
return pmu;
848+
849+
pmu = perf_pmus__find_by_attr(&evsel->core.attr);
845850
((struct evsel *)evsel)->pmu = pmu;
846851
return pmu;
847852
}

tools/perf/util/pmus.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <stdbool.h>
66
#include <stddef.h>
77

8+
struct perf_event_attr;
89
struct perf_pmu;
910
struct print_callbacks;
1011

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

1718
struct perf_pmu *perf_pmus__find(const char *name);
1819
struct perf_pmu *perf_pmus__find_by_type(unsigned int type);
20+
struct perf_pmu *perf_pmus__find_by_attr(const struct perf_event_attr *attr);
1921

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

0 commit comments

Comments
 (0)