Skip to content

Commit 1dfab14

Browse files
LeviYeoReumopsiff
authored andcommitted
perf: Fix dangling cgroup pointer in cpuctx
mainline inclusion from mainline-v6.16-rc3 commit 12b6c62 category: bugfix Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=12b6c62c038e85354154aee4eb2cf7a2168b3ecc -------------------------------- 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/ (cherry picked from commit 3b7a34a) Signed-off-by: Wentao Guan <guanwentao@uniontech.com> Conflicts: kernel/events/core.c
1 parent 19a90fb commit 1dfab14

1 file changed

Lines changed: 6 additions & 15 deletions

File tree

kernel/events/core.c

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

2059-
/*
2060-
* If event was in error state, then keep it
2061-
* that way, otherwise bogus counts will be
2062-
* returned on read(). The only way to get out
2063-
* of error state is by explicit re-enabling
2064-
* of the event
2065-
*/
2066-
if (event->state > PERF_EVENT_STATE_OFF) {
2067-
perf_cgroup_event_disable(event, ctx);
2068-
perf_event_set_state(event, PERF_EVENT_STATE_OFF);
2069-
}
2070-
20712059
ctx->generation++;
20722060
event->pmu_ctx->nr_events--;
20732061
}
@@ -2381,11 +2369,14 @@ __perf_remove_from_context(struct perf_event *event,
23812369
*/
23822370
if (flags & DETACH_EXIT)
23832371
state = PERF_EVENT_STATE_EXIT;
2384-
if (flags & DETACH_DEAD) {
2385-
event->pending_disable = 1;
2372+
if (flags & DETACH_DEAD)
23862373
state = PERF_EVENT_STATE_DEAD;
2387-
}
2374+
23882375
event_sched_out(event, ctx);
2376+
2377+
if (event->state > PERF_EVENT_STATE_OFF)
2378+
perf_cgroup_event_disable(event, ctx);
2379+
23892380
perf_event_set_state(event, min(event->state, state));
23902381
if (flags & DETACH_GROUP)
23912382
perf_group_detach(event);

0 commit comments

Comments
 (0)