| From e5c23779f93d45e39a52758ca593bd7e62e9b4be Mon Sep 17 00:00:00 2001 |
| From: Rob Herring <robh@kernel.org> |
| Date: Fri, 8 Apr 2022 15:33:30 -0500 |
| Subject: arm_pmu: Validate single/group leader events |
| |
| From: Rob Herring <robh@kernel.org> |
| |
| commit e5c23779f93d45e39a52758ca593bd7e62e9b4be upstream. |
| |
| In the case where there is only a cycle counter available (i.e. |
| PMCR_EL0.N is 0) and an event other than CPU cycles is opened, the open |
| should fail as the event can never possibly be scheduled. However, the |
| event validation when an event is opened is skipped when the group |
| leader is opened. Fix this by always validating the group leader events. |
| |
| Reported-by: Al Grant <al.grant@arm.com> |
| Cc: Will Deacon <will@kernel.org> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Signed-off-by: Rob Herring <robh@kernel.org> |
| Acked-by: Mark Rutland <mark.rutland@arm.com> |
| Link: https://lore.kernel.org/r/20220408203330.4014015-1-robh@kernel.org |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Will Deacon <will@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/perf/arm_pmu.c | 10 ++++------ |
| 1 file changed, 4 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/perf/arm_pmu.c |
| +++ b/drivers/perf/arm_pmu.c |
| @@ -322,6 +322,9 @@ validate_group(struct perf_event *event) |
| if (!validate_event(event->pmu, &fake_pmu, leader)) |
| return -EINVAL; |
| |
| + if (event == leader) |
| + return 0; |
| + |
| for_each_sibling_event(sibling, leader) { |
| if (!validate_event(event->pmu, &fake_pmu, sibling)) |
| return -EINVAL; |
| @@ -411,12 +414,7 @@ __hw_perf_event_init(struct perf_event * |
| local64_set(&hwc->period_left, hwc->sample_period); |
| } |
| |
| - if (event->group_leader != event) { |
| - if (validate_group(event) != 0) |
| - return -EINVAL; |
| - } |
| - |
| - return 0; |
| + return validate_group(event); |
| } |
| |
| static int armpmu_event_init(struct perf_event *event) |