diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-05-17 11:08:41 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-05-20 00:22:24 +0200 |
commit | 33b2fb303fe7f6b08bbb32f708e67b96eaa94a7a (patch) | |
tree | 32ab4cb3cca6c61a2d6cf351bb8f732045464e28 /kernel/perf_counter.c | |
parent | perf_counter, x86: speed up the scheduling fast-path (diff) | |
download | linux-dev-33b2fb303fe7f6b08bbb32f708e67b96eaa94a7a.tar.xz linux-dev-33b2fb303fe7f6b08bbb32f708e67b96eaa94a7a.zip |
perf_counter: fix counter freeing logic
Fix counter lifetime bugs which explain the crashes reported by
Marcelo Tosatti and Arnaldo Carvalho de Melo.
The new rule is: flushing + freeing is only done for a task's
own counters, never for other tasks.
[ Impact: fix crashes/lockups with inherited counters ]
Reported-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Reported-by: Marcelo Tosatti <mtosatti@redhat.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/perf_counter.c')
-rw-r--r-- | kernel/perf_counter.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 59a926d04baf..7af16d1c480f 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c @@ -3299,6 +3299,8 @@ void perf_counter_exit_task(struct task_struct *child) struct perf_counter *child_counter, *tmp; struct perf_counter_context *child_ctx; + WARN_ON_ONCE(child != current); + child_ctx = &child->perf_counter_ctx; if (likely(!child_ctx->nr_counters)) |