[PATCH v3 0/2] perf/core: Fix sigtrap task_work races

From: Tengda Wu

Date: Thu Nov 05 2026 - 04:35:09 EST


Two fixes for sigtrap task_work handling since the switch to always
enqueue SIGTRAP via task_work.

The warning splats and PoCs for both patches are too long to inline in
the commit messages. They are sent as separate replies to this cover
letter, one per patch.

Patch 1 fixes a re-entrancy race in __perf_event_overflow(): pending_work
was set only after task_work_add(), so an NMI could re-enter and enqueue
the same pending_task twice, creating a cycle in the task work list and
unbalancing the event refcount. Claim pending_work with cmpxchg() before
enqueuing, and clear it if the enqueue fails.

Patch 2 fixes a WARN_ON_ONCE() in perf_sigtrap() triggered by the context
fast-swap path swapping ctx->task while a sigtrap event has pending task
work. SIGTRAP is targeted at ctx->task, so exclude sigtrap events from
fast-swap alongside inherit+sample-read events.

Changelog
=========
v2 -> v3:
- v2: https://lore.kernel.org/all/20261102021355.650671-1-wutengda@xxxxxxxxxxxxxxx/
- Added Patch 2 to fix WARN_ON_ONCE() in perf_sigtrap()
v1 -> v2:
- v1: https://lore.kernel.org/all/20261031114520.642476-1-wutengda@xxxxxxxxxxxxxxx/
- Drop the redundant event->pending_work assignment. (Sashiko)

Tengda Wu (2):
perf/core: Prevent duplicate sigtrap task work enqueue
perf/core: Disable context fast-swap for sigtrap events

include/linux/perf_event.h | 6 ++----
kernel/events/core.c | 30 ++++++++++++++++++------------
2 files changed, 20 insertions(+), 16 deletions(-)

--
2.34.1