| From e3265a4386428d3d157d9565bb520aabff8b4bf0 Mon Sep 17 00:00:00 2001 |
| From: Namhyung Kim <namhyung@kernel.org> |
| Date: Mon, 28 Mar 2022 13:01:12 -0700 |
| Subject: perf/core: Inherit event_caps |
| |
| From: Namhyung Kim <namhyung@kernel.org> |
| |
| commit e3265a4386428d3d157d9565bb520aabff8b4bf0 upstream. |
| |
| It was reported that some perf event setup can make fork failed on |
| ARM64. It was the case of a group of mixed hw and sw events and it |
| failed in perf_event_init_task() due to armpmu_event_init(). |
| |
| The ARM PMU code checks if all the events in a group belong to the |
| same PMU except for software events. But it didn't set the event_caps |
| of inherited events and no longer identify them as software events. |
| Therefore the test failed in a child process. |
| |
| A simple reproducer is: |
| |
| $ perf stat -e '{cycles,cs,instructions}' perf bench sched messaging |
| # Running 'sched/messaging' benchmark: |
| perf: fork(): Invalid argument |
| |
| The perf stat was fine but the perf bench failed in fork(). Let's |
| inherit the event caps from the parent. |
| |
| Signed-off-by: Namhyung Kim <namhyung@kernel.org> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lkml.kernel.org/r/20220328200112.457740-1-namhyung@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| kernel/events/core.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/kernel/events/core.c |
| +++ b/kernel/events/core.c |
| @@ -11626,6 +11626,9 @@ perf_event_alloc(struct perf_event_attr |
| |
| event->state = PERF_EVENT_STATE_INACTIVE; |
| |
| + if (parent_event) |
| + event->event_caps = parent_event->event_caps; |
| + |
| if (event->attr.sigtrap) |
| atomic_set(&event->event_limit, 1); |
| |