Skip to content

Commit e54155d

Browse files
committed
perf: Fix dangling cgroup pointer in cpuctx
JIRA: https://issues.redhat.com/browse/RHEL-78197 upstream ======== commit 3b7a34a Author: Yeoreum Yun <yeoreum.yun@arm.com> Date: Mon Jun 2 19:40:49 2025 +0100 description =========== Commit a3c3c66("perf/core: Fix child_total_time_enabled accounting bug at task exit") moves the event->state update to before list_del_event(). This makes the event->state test in list_del_event() always false; never calling perf_cgroup_event_disable(). As a result, cpuctx->cgrp won't be cleared properly; causing havoc. Fixes: a3c3c66("perf/core: Fix child_total_time_enabled accounting bug at task exit") Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: David Wang <00107082@163.com> Link: https://lore.kernel.org/all/aD2TspKH%2F7yvfYoO@e129823.arm.com/ Conflicts: ========== Different context due to not (yet) backported da916e9 ("perf: Make perf_pmu_unregister() useable") Signed-off-by: Michael Petlan <mpetlan@redhat.com>
1 parent dfd884f commit e54155d

File tree

1 file changed

+6
-15
lines changed

1 file changed

+6
-15
lines changed

kernel/events/core.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2120,18 +2120,6 @@ list_del_event(struct perf_event *event, struct perf_event_context *ctx)
21202120
if (event->group_leader == event)
21212121
del_event_from_groups(event, ctx);
21222122

2123-
/*
2124-
* If event was in error state, then keep it
2125-
* that way, otherwise bogus counts will be
2126-
* returned on read(). The only way to get out
2127-
* of error state is by explicit re-enabling
2128-
* of the event
2129-
*/
2130-
if (event->state > PERF_EVENT_STATE_OFF) {
2131-
perf_cgroup_event_disable(event, ctx);
2132-
perf_event_set_state(event, PERF_EVENT_STATE_OFF);
2133-
}
2134-
21352123
ctx->generation++;
21362124
event->pmu_ctx->nr_events--;
21372125
}
@@ -2481,11 +2469,14 @@ __perf_remove_from_context(struct perf_event *event,
24812469
*/
24822470
if (flags & DETACH_EXIT)
24832471
state = PERF_EVENT_STATE_EXIT;
2484-
if (flags & DETACH_DEAD) {
2485-
event->pending_disable = 1;
2472+
if (flags & DETACH_DEAD)
24862473
state = PERF_EVENT_STATE_DEAD;
2487-
}
2474+
24882475
event_sched_out(event, ctx);
2476+
2477+
if (event->state > PERF_EVENT_STATE_OFF)
2478+
perf_cgroup_event_disable(event, ctx);
2479+
24892480
perf_event_set_state(event, min(event->state, state));
24902481
if (flags & DETACH_GROUP)
24912482
perf_group_detach(event);

0 commit comments

Comments
 (0)