--- x/kernel/events/core.c +++ c/kernel/events/core.c @@ -2291,6 +2291,7 @@ event_sched_out(struct perf_event *event !event->pending_work) { event->pending_work = 1; dec = false; + atomic_long_inc(&event->refcount); task_work_add(current, &event->pending_task, TWA_RESUME); } if (dec) @@ -6561,6 +6562,8 @@ static void perf_pending_task(struct cal struct perf_event *event = container_of(head, struct perf_event, pending_task); int rctx; + if (event->state == PERF_EVENT_STATE_DEAD) + goto out; /* * If we 'fail' here, that's OK, it means recursion is already disabled * and we won't recurse 'further'. @@ -6577,6 +6580,8 @@ static void perf_pending_task(struct cal if (rctx >= 0) perf_swevent_put_recursion_context(rctx); preempt_enable_notrace(); +out: + put_event(event); } #ifdef CONFIG_GUEST_PERF_EVENTS