perf/core: Don't allow grouping events from different hw pmus
authorRavi Bangoria <ravi.bangoria@amd.com>
Tue, 22 Nov 2022 08:03:26 +0000 (13:33 +0530)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 24 Nov 2022 10:09:19 +0000 (11:09 +0100)
Event group from different hw pmus does not make sense and thus perf
has never allowed it. However, with recent rewrite that restriction
has been inadvertently removed. Fix it.

Fixes: bd2756811766 ("perf: Rewrite core context handling")
Signed-off-by: Ravi Bangoria <ravi.bangoria@amd.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20221122080326.228-1-ravi.bangoria@amd.com
kernel/events/core.c

index f2b865c0e182c7e2c329bfd3a5104eff741eaf00..65e20c5c3c44e38ac18645e29fe32e1b13275633 100644 (file)
@@ -12503,15 +12503,21 @@ SYSCALL_DEFINE5(perf_event_open,
                         * perf_event_pmu_context.
                         */
                        pmu = group_leader->pmu_ctx->pmu;
-               } else if (!is_software_event(event) &&
-                       is_software_event(group_leader) &&
-                       (group_leader->group_caps & PERF_EV_CAP_SOFTWARE)) {
-                       /*
-                        * In case the group is a pure software group, and we
-                        * try to add a hardware event, move the whole group to
-                        * the hardware context.
-                        */
-                       move_group = 1;
+               } else if (!is_software_event(event)) {
+                       if (is_software_event(group_leader) &&
+                           (group_leader->group_caps & PERF_EV_CAP_SOFTWARE)) {
+                               /*
+                                * In case the group is a pure software group, and we
+                                * try to add a hardware event, move the whole group to
+                                * the hardware context.
+                                */
+                               move_group = 1;
+                       }
+
+                       /* Don't allow group of multiple hw events from different pmus */
+                       if (!in_software_context(group_leader) &&
+                           group_leader->pmu_ctx->pmu != pmu)
+                               goto err_locked;
                }
        }