[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <8e86d5021812c720219c8843e5179fe03e5c4de4.1755096883.git.robin.murphy@arm.com>
Date: Wed, 13 Aug 2025 18:01:07 +0100
From: Robin Murphy <robin.murphy@....com>
To: peterz@...radead.org,
mingo@...hat.com,
will@...nel.org,
mark.rutland@....com,
acme@...nel.org,
namhyung@...nel.org,
alexander.shishkin@...ux.intel.com,
jolsa@...nel.org,
irogers@...gle.com,
adrian.hunter@...el.com,
kan.liang@...ux.intel.com
Cc: linux-perf-users@...r.kernel.org,
linux-kernel@...r.kernel.org,
linux-alpha@...r.kernel.org,
linux-snps-arc@...ts.infradead.org,
linux-arm-kernel@...ts.infradead.org,
imx@...ts.linux.dev,
linux-csky@...r.kernel.org,
loongarch@...ts.linux.dev,
linux-mips@...r.kernel.org,
linuxppc-dev@...ts.ozlabs.org,
linux-s390@...r.kernel.org,
linux-sh@...r.kernel.org,
sparclinux@...r.kernel.org,
linux-pm@...r.kernel.org,
linux-rockchip@...ts.infradead.org,
dmaengine@...r.kernel.org,
linux-fpga@...r.kernel.org,
amd-gfx@...ts.freedesktop.org,
dri-devel@...ts.freedesktop.org,
intel-gfx@...ts.freedesktop.org,
intel-xe@...ts.freedesktop.org,
coresight@...ts.linaro.org,
iommu@...ts.linux.dev,
linux-amlogic@...ts.infradead.org,
linux-cxl@...r.kernel.org,
linux-arm-msm@...r.kernel.org,
linux-riscv@...ts.infradead.org
Subject: [PATCH 15/19] perf: Simplify group validation
All of these drivers copy a pattern of actively policing cross-PMU
groups, which is redundant since commit bf480f938566 ("perf/core: Don't
allow grouping events from different hw pmus"). Clean up these checks to
simplfy matters, especially for thunderx2 which can reduce right down to
trivial counting.
Signed-off-by: Robin Murphy <robin.murphy@....com>
---
drivers/perf/arm_cspmu/arm_cspmu.c | 7 ++-----
drivers/perf/arm_dsu_pmu.c | 6 ++----
drivers/perf/arm_pmu.c | 11 ++---------
drivers/perf/thunderx2_pmu.c | 30 +++++++-----------------------
4 files changed, 13 insertions(+), 41 deletions(-)
diff --git a/drivers/perf/arm_cspmu/arm_cspmu.c b/drivers/perf/arm_cspmu/arm_cspmu.c
index efa9b229e701..7f5ea749b85c 100644
--- a/drivers/perf/arm_cspmu/arm_cspmu.c
+++ b/drivers/perf/arm_cspmu/arm_cspmu.c
@@ -561,12 +561,9 @@ static bool arm_cspmu_validate_event(struct pmu *pmu,
struct arm_cspmu_hw_events *hw_events,
struct perf_event *event)
{
- if (is_software_event(event))
- return true;
-
- /* Reject groups spanning multiple HW PMUs. */
+ /* Ignore grouped events that aren't ours */
if (event->pmu != pmu)
- return false;
+ return true;
return (arm_cspmu_get_event_idx(hw_events, event) >= 0);
}
diff --git a/drivers/perf/arm_dsu_pmu.c b/drivers/perf/arm_dsu_pmu.c
index cb4fb59fe04b..7480fd6fe377 100644
--- a/drivers/perf/arm_dsu_pmu.c
+++ b/drivers/perf/arm_dsu_pmu.c
@@ -492,11 +492,9 @@ static bool dsu_pmu_validate_event(struct pmu *pmu,
struct dsu_hw_events *hw_events,
struct perf_event *event)
{
- if (is_software_event(event))
- return true;
- /* Reject groups spanning multiple HW PMUs. */
+ /* Ignore grouped events that aren't ours */
if (event->pmu != pmu)
- return false;
+ return true;
return dsu_pmu_get_event_idx(hw_events, event) >= 0;
}
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
index e8a3c8e99da0..2c1af3a0207c 100644
--- a/drivers/perf/arm_pmu.c
+++ b/drivers/perf/arm_pmu.c
@@ -375,16 +375,9 @@ validate_event(struct pmu *pmu, struct pmu_hw_events *hw_events,
{
struct arm_pmu *armpmu;
- if (is_software_event(event))
- return 1;
-
- /*
- * Reject groups spanning multiple HW PMUs (e.g. CPU + CCI). The
- * core perf code won't check that the pmu->ctx == leader->ctx
- * until after pmu->event_init(event).
- */
+ /* Ignore grouped events that aren't ours */
if (event->pmu != pmu)
- return 0;
+ return 1;
armpmu = to_arm_pmu(event->pmu);
return armpmu->get_event_idx(hw_events, event) >= 0;
diff --git a/drivers/perf/thunderx2_pmu.c b/drivers/perf/thunderx2_pmu.c
index 6ed4707bd6bb..472eb4494fd1 100644
--- a/drivers/perf/thunderx2_pmu.c
+++ b/drivers/perf/thunderx2_pmu.c
@@ -519,19 +519,6 @@ static enum tx2_uncore_type get_tx2_pmu_type(struct acpi_device *adev)
return (enum tx2_uncore_type)id->driver_data;
}
-static bool tx2_uncore_validate_event(struct pmu *pmu,
- struct perf_event *event, int *counters)
-{
- if (is_software_event(event))
- return true;
- /* Reject groups spanning multiple HW PMUs. */
- if (event->pmu != pmu)
- return false;
-
- *counters = *counters + 1;
- return true;
-}
-
/*
* Make sure the group of events can be scheduled at once
* on the PMU.
@@ -539,23 +526,20 @@ static bool tx2_uncore_validate_event(struct pmu *pmu,
static bool tx2_uncore_validate_event_group(struct perf_event *event,
int max_counters)
{
- struct perf_event *sibling, *leader = event->group_leader;
- int counters = 0;
+ struct perf_event *sibling;
+ int counters = 1;
if (event->group_leader == event)
return true;
- if (!tx2_uncore_validate_event(event->pmu, leader, &counters))
- return false;
+ if (event->group_leader->pmu == event->pmu)
+ ++counters;
- for_each_sibling_event(sibling, leader) {
- if (!tx2_uncore_validate_event(event->pmu, sibling, &counters))
- return false;
+ for_each_sibling_event(sibling, event->group_leader) {
+ if (sibling->pmu == event->pmu)
+ ++counters;
}
- if (!tx2_uncore_validate_event(event->pmu, event, &counters))
- return false;
-
/*
* If the group requires more counters than the HW has,
* it cannot ever be scheduled.
--
2.39.2.101.g768bb238c484.dirty
Powered by blists - more mailing lists