[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <ae74987481902e3937a8aa7ceaee4adcc681d7b4.1755096883.git.robin.murphy@arm.com>
Date: Wed, 13 Aug 2025 18:01:01 +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 09/19] perf/qcom: Improve group validation
The L3 driver's group validation is almost right, except for erroneously
counting a software group leader - which is benign other than
artificially limiting the maximum size of such a group to one less than
it could be. Correct that with the now-established pattern of simply
ignoring all events which do not belong to our PMU.
The L2 driver gets a cleanup of some slightly suspicious logic, and both
can have the same overall simplification to not duplicate things that perf
core will already do, and avoid racy access to the sibling list of group
leader events.
Signed-off-by: Robin Murphy <robin.murphy@....com>
---
drivers/perf/qcom_l2_pmu.c | 81 +++++++++++++++-----------------------
drivers/perf/qcom_l3_pmu.c | 14 +++----
2 files changed, 37 insertions(+), 58 deletions(-)
diff --git a/drivers/perf/qcom_l2_pmu.c b/drivers/perf/qcom_l2_pmu.c
index ea8c85729937..9c4e1d89718d 100644
--- a/drivers/perf/qcom_l2_pmu.c
+++ b/drivers/perf/qcom_l2_pmu.c
@@ -468,23 +468,6 @@ static int l2_cache_event_init(struct perf_event *event)
return -EINVAL;
}
- /* Don't allow groups with mixed PMUs, except for s/w events */
- if (event->group_leader->pmu != event->pmu &&
- !is_software_event(event->group_leader)) {
- dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
- "Can't create mixed PMU group\n");
- return -EINVAL;
- }
-
- for_each_sibling_event(sibling, event->group_leader) {
- if (sibling->pmu != event->pmu &&
- !is_software_event(sibling)) {
- dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
- "Can't create mixed PMU group\n");
- return -EINVAL;
- }
- }
-
cluster = get_cluster_pmu(l2cache_pmu, event->cpu);
if (!cluster) {
/* CPU has not been initialised */
@@ -493,39 +476,6 @@ static int l2_cache_event_init(struct perf_event *event)
return -EINVAL;
}
- /* Ensure all events in a group are on the same cpu */
- if ((event->group_leader != event) &&
- (cluster->on_cpu != event->group_leader->cpu)) {
- dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
- "Can't create group on CPUs %d and %d",
- event->cpu, event->group_leader->cpu);
- return -EINVAL;
- }
-
- if ((event != event->group_leader) &&
- !is_software_event(event->group_leader) &&
- (L2_EVT_GROUP(event->group_leader->attr.config) ==
- L2_EVT_GROUP(event->attr.config))) {
- dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
- "Column exclusion: conflicting events %llx %llx\n",
- event->group_leader->attr.config,
- event->attr.config);
- return -EINVAL;
- }
-
- for_each_sibling_event(sibling, event->group_leader) {
- if ((sibling != event) &&
- !is_software_event(sibling) &&
- (L2_EVT_GROUP(sibling->attr.config) ==
- L2_EVT_GROUP(event->attr.config))) {
- dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
- "Column exclusion: conflicting events %llx %llx\n",
- sibling->attr.config,
- event->attr.config);
- return -EINVAL;
- }
- }
-
hwc->idx = -1;
hwc->config_base = event->attr.config;
@@ -534,6 +484,37 @@ static int l2_cache_event_init(struct perf_event *event)
* same cpu context, to avoid races on pmu_enable etc.
*/
event->cpu = cluster->on_cpu;
+ if (event->cpu != event->group_leader->cpu) {
+ dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
+ "Can't create group on CPUs %d and %d",
+ event->cpu, event->group_leader->cpu);
+ return -EINVAL;
+ }
+
+ if (event == event->group_leader)
+ return 0;
+
+ if ((event->group_leader->pmu == event->pmu) &&
+ (L2_EVT_GROUP(event->group_leader->attr.config) ==
+ L2_EVT_GROUP(event->attr.config))) {
+ dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
+ "Column exclusion: conflicting events %llx %llx\n",
+ event->group_leader->attr.config,
+ event->attr.config);
+ return -EINVAL;
+ }
+
+ for_each_sibling_event(sibling, event->group_leader) {
+ if ((sibling->pmu == event->pmu) &&
+ (L2_EVT_GROUP(sibling->attr.config) ==
+ L2_EVT_GROUP(event->attr.config))) {
+ dev_dbg_ratelimited(&l2cache_pmu->pdev->dev,
+ "Column exclusion: conflicting events %llx %llx\n",
+ sibling->attr.config,
+ event->attr.config);
+ return -EINVAL;
+ }
+ }
return 0;
}
diff --git a/drivers/perf/qcom_l3_pmu.c b/drivers/perf/qcom_l3_pmu.c
index 66e6cabd6fff..f0cf6c33418d 100644
--- a/drivers/perf/qcom_l3_pmu.c
+++ b/drivers/perf/qcom_l3_pmu.c
@@ -454,18 +454,16 @@ static bool qcom_l3_cache__validate_event_group(struct perf_event *event)
struct perf_event *sibling;
int counters = 0;
- if (leader->pmu != event->pmu && !is_software_event(leader))
- return false;
+ if (leader == event)
+ return true;
counters = event_num_counters(event);
- counters += event_num_counters(leader);
+ if (leader->pmu == event->pmu)
+ counters += event_num_counters(leader);
for_each_sibling_event(sibling, leader) {
- if (is_software_event(sibling))
- continue;
- if (sibling->pmu != event->pmu)
- return false;
- counters += event_num_counters(sibling);
+ if (sibling->pmu == event->pmu)
+ counters += event_num_counters(sibling);
}
/*
--
2.39.2.101.g768bb238c484.dirty
Powered by blists - more mailing lists