[PATCH 03/19] perf/imx8_ddr: Fix group validation
Robin Murphy <[email protected]>
| Newsgroups | gmane.comp.freedesktop.xorg.drivers.intel,gmane.linux.kernel.perf.user,gmane.linux.kernel,gmane.linux.ports.alpha,gmane.linux.kernel.arc,gmane.linux.ports.arm.kernel,gmane.linux.ports.mips,gmane.linux.ports.ppc64.devel,gmane.linux.ports.sh.devel,gmane.linux.ports.sparc,gmane.linux.power-management.general,gmane.linux.ports.arm.rockchip,gmane.comp.freedesktop.amd-gfx,gmane.comp.video.dri.devel,gmane.linux.ports.arm.msm,gmane.linux.ports.riscv |
|---|---|
| Message-ID | <bfb1445bc741a170302b77e3f513b01cd676c9d8.1755096883.git.robin.murphy@arm.com> |
The group validation here is erroneously inspecting software events, as well as other hardware siblings, which are only checked for *after* they've already been misinterpreted. Once again, just ignore events which don't belong to our PMU, and don't duplicate what perf_event_open() will already check for us. Signed-off-by: Robin Murphy <[email protected]> --- drivers/perf/fsl_imx8_ddr_perf.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c index b989ffa95d69..56fe281974d2 100644 --- a/drivers/perf/fsl_imx8_ddr_perf.c +++ b/drivers/perf/fsl_imx8_ddr_perf.c @@ -331,6 +331,9 @@ static u32 ddr_perf_filter_val(struct perf_event *event) static bool ddr_perf_filters_compatible(struct perf_event *a, struct perf_event *b) { + /* Ignore grouped events that aren't ours */ + if (a->pmu != b->pmu) + return true; if (!ddr_perf_is_filtered(a)) return true; if (!ddr_perf_is_filtered(b)) @@ -409,16 +412,8 @@ static int ddr_perf_event_init(struct perf_event *event) return -EOPNOTSUPP; } - /* - * We must NOT create groups containing mixed PMUs, although software - * events are acceptable (for example to create a CCN group - * periodically read when a hrtimer aka cpu-clock leader triggers). - */ - if (event->group_leader->pmu != event->pmu && - !is_software_event(event->group_leader)) - return -EINVAL; - - if (pmu->devtype_data->quirks & DDR_CAP_AXI_ID_FILTER) { + if (event != event->group_leader && + pmu->devtype_data->quirks & DDR_CAP_AXI_ID_FILTER) { if (!ddr_perf_filters_compatible(event, event->group_leader)) return -EINVAL; for_each_sibling_event(sibling, event->group_leader) { @@ -427,12 +422,6 @@ static int ddr_perf_event_init(struct perf_event *event) } } - for_each_sibling_event(sibling, event->group_leader) { - if (sibling->pmu != event->pmu && - !is_software_event(sibling)) - return -EINVAL; - } - event->cpu = pmu->cpu; hwc->idx = -1; -- 2.39.2.101.g768bb238c484.dirty