[PATCH 1/2] tracing/perf: Clear stop state in perf_trace_add()

From: Paolo Bertinetti

Date: Tue Nov 03 2026 - 08:48:22 EST


Since commit 18dbcbfabfff ("perf: Fix the POLL_HUP delivery breakage"),
__perf_event_overflow() stops the event with pmu->stop() and disables
it when the PERF_EVENT_IOC_REFRESH limit is reached. When userspace
re-arms the event with PERF_EVENT_IOC_REFRESH, the event is enabled
again and pmu->add() is called with PERF_EF_START.

perf_trace_add() sets PERF_HES_STOPPED when PERF_EF_START is missing,
but never clears it. The flag set by pmu->stop() stays, and
perf_tp_event_match() drops every later hit. A tracepoint, kprobe or
uprobe event re-armed this way delivers only its first overflow. This
breaks self-profilers such as async-profiler, and the "Event re-armed
with PERF_EVENT_IOC_REFRESH" perf test fails:

1000 events, count 1, 1 overflows (1 POLL_HUP), re-arm errno 0
Tracepoint event : FAILED!

Set the state from PERF_EF_START on every add, as perf_swevent_add()
does.

Fixes: 18dbcbfabfff ("perf: Fix the POLL_HUP delivery breakage")
Reported-by: Francesco Nigro <nigro.fra@xxxxxxxxx>
Closes: https://lore.kernel.org/r/20261021131006.2101248-1-nigro.fra@xxxxxxxxx/
Assisted-by: LLM
Signed-off-by: Paolo Bertinetti <paolobertinetti200f4@xxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
Link: https://github.com/async-profiler/async-profiler/issues/1813
---
kernel/trace/trace_event_perf.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
index 5b272856e5ab..a549897ee408 100644
--- a/kernel/trace/trace_event_perf.c
+++ b/kernel/trace/trace_event_perf.c
@@ -354,8 +354,7 @@ int perf_trace_add(struct perf_event *p_event, int flags)
struct trace_event_call *tp_event = p_event->tp_event;
struct hw_perf_event *hwc = &p_event->hw;

- if (!(flags & PERF_EF_START))
- p_event->hw.state = PERF_HES_STOPPED;
+ hwc->state = (flags & PERF_EF_START) ? 0 : PERF_HES_STOPPED;

if (is_sampling_event(p_event)) {
hwc->last_period = hwc->sample_period;
--
2.53.0