summaryrefslogtreecommitdiff
path: root/drivers/perf/arm_dmc620_pmu.c
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2024-05-14 21:00:50 +0300
committerWill Deacon <will@kernel.org>2024-05-17 18:48:05 +0300
commita4c5a457c6107dfe9dc65a104af1634811396bac (patch)
treeebe67cbdd9c91d2e5184cba73b5fbe8086cf4d4a /drivers/perf/arm_dmc620_pmu.c
parentb8995a18417088bb53f87c49d200ec72a9dd4ec1 (diff)
downloadlinux-a4c5a457c6107dfe9dc65a104af1634811396bac.tar.xz
perf/arm-dmc620: Fix lockdep assert in ->event_init()
for_each_sibling_event() checks leader's ctx but it doesn't have the ctx yet if it's the leader. Like in perf_event_validate_size(), we should skip checking siblings in that case. Acked-by: Mark Rutland <mark.rutland@arm.com> Fixes: f3c0eba28704 ("perf: Add a few assertions") Reported-by: Greg Thelen <gthelen@google.com> Cc: Robin Murphy <robin.murphy@arm.com> Cc: Tuan Phan <tuanphan@os.amperecomputing.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Reviewed-by: Robin Murphy <robin.murphy@arm.com> Link: https://lore.kernel.org/r/20240514180050.182454-1-namhyung@kernel.org Signed-off-by: Will Deacon <will@kernel.org>
Diffstat (limited to 'drivers/perf/arm_dmc620_pmu.c')
-rw-r--r--drivers/perf/arm_dmc620_pmu.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/perf/arm_dmc620_pmu.c b/drivers/perf/arm_dmc620_pmu.c
index 2ec96e204c40..7e5f1d4fca0f 100644
--- a/drivers/perf/arm_dmc620_pmu.c
+++ b/drivers/perf/arm_dmc620_pmu.c
@@ -542,12 +542,16 @@ static int dmc620_pmu_event_init(struct perf_event *event)
if (event->cpu < 0)
return -EINVAL;
+ hwc->idx = -1;
+
+ if (event->group_leader == event)
+ return 0;
+
/*
* We can't atomically disable all HW counters so only one event allowed,
* although software events are acceptable.
*/
- if (event->group_leader != event &&
- !is_software_event(event->group_leader))
+ if (!is_software_event(event->group_leader))
return -EINVAL;
for_each_sibling_event(sibling, event->group_leader) {
@@ -556,7 +560,6 @@ static int dmc620_pmu_event_init(struct perf_event *event)
return -EINVAL;
}
- hwc->idx = -1;
return 0;
}