perf: Annotate cpuctx->ctx.mutex to avoid a lockdep splat
Commit-ID: 547e9fd7d328af261f184bf66effc5033c886498 Gitweb: http://git.kernel.org/tip/547e9fd7d328af261f184bf66effc5033c886498 Author: Peter Zijlstra <[email protected]> AuthorDate: Wed, 19 Jan 2011 12:51:39 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 21 Jan 2011 16:32:42 +0100
perf: Annotate cpuctx->ctx.mutex to avoid a lockdep splat
Lockdep spotted:
loop_1b_instruc/1899 is trying to acquire lock:
(event_mutex){+.+.+.}, at: [<ffffffff810e1908>] perf_trace_init+0x3b/0x2f7
but task is already holding lock:
(&ctx->mutex){+.+.+.}, at: [<ffffffff810eb45b>] perf_event_init_context+0xc0/0x218
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #3 (&ctx->mutex){+.+.+.}:
-> #2 (cpu_hotplug.lock){+.+.+.}:
-> #1 (module_mutex){+.+...}:
-> #0 (event_mutex){+.+.+.}:But because the deadlock would be cpuhotplug (cpu-event) vs fork (task-event) it cannot, in fact, happen. We can annotate this by giving the perf_event_context used for the cpuctx a different lock class from those used by tasks.
Signed-off-by Peter Zijlstra <[email protected]>
LKML-Reference: <new-submission>
Signed-off-by Ingo Molnar <[email protected]>
--- kernel/perf_event.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
kernel/perf_event.c +3 -0
@@ -5380,6 +5380,8 @@ free_dev: goto out; } +static struct lock_class_key cpuctx_mutex; +int perf_pmu_register (struct pmu *pmu,char *name,int type) {int cpu, ret;
@@ -5428,6 +5430,7 @@ skip_type: cpuctx =per_cpu_ptr (pmu->pmu_cpu_context, cpu);__perf_event_init_context (&cpuctx->ctx); +lockdep_set_class (&cpuctx->ctx.mutex, &cpuctx_mutex); cpuctx->ctx.type = cpu_context; cpuctx->ctx.pmu = pmu; cpuctx->jiffies_interval =1 ;