Skip to content

Commit

Permalink
perf: Fix tear-down of inherited group events
Browse files Browse the repository at this point in the history
When destroying inherited events, we need to destroy groups too,
otherwise the event iteration in perf_event_exit_task_context() will
miss group siblings and we leak events with all the consequences.

Reported-and-tested-by: Vince Weaver <vweaver1@eecs.utk.edu>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: <stable@kernel.org> # .35+
LKML-Reference: <1300196470.2203.61.camel@twins>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed Mar 16, 2011
1 parent ee643c4 commit 38b435b
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions kernel/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -6722,17 +6722,20 @@ __perf_event_exit_task(struct perf_event *child_event,
struct perf_event_context *child_ctx,
struct task_struct *child)
{
struct perf_event *parent_event;
if (child_event->parent) {
raw_spin_lock_irq(&child_ctx->lock);
perf_group_detach(child_event);
raw_spin_unlock_irq(&child_ctx->lock);
}

perf_remove_from_context(child_event);

parent_event = child_event->parent;
/*
* It can happen that parent exits first, and has events
* It can happen that the parent exits first, and has events
* that are still around due to the child reference. These
* events need to be zapped - but otherwise linger.
* events need to be zapped.
*/
if (parent_event) {
if (child_event->parent) {
sync_child_event(child_event, child);
free_event(child_event);
}
Expand Down

0 comments on commit 38b435b

Please sign in to comment.