perf/core: Fix ctx::mutex deadlock

Lockdep noticed the following 3-way lockup scenario:

sys_perf_event_open()
perf_event_alloc()
perf_try_init_event()
#0 ctx = perf_event_ctx_lock_nested(1)
perf_swevent_init()
swevent_hlist_get()
#1 mutex_lock(&pmus_lock)

perf_event_init_cpu()
#1 mutex_lock(&pmus_lock)
#2 mutex_lock(&ctx->mutex)

sys_perf_event_open()
mutex_lock_double()
#2 mutex_lock()
#0 mutex_lock_nested()

And while we need that perf_event_ctx_lock_nested() for HW PMUs such
that they can iterate the sibling list, trying to match it to the
available counters, the software PMUs need do no such thing. Exclude
them.

In particular the swevent triggers the above invertion, while the
tpevent PMU triggers a more elaborate one through their event_mutex.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by Peter Zijlstra and committed by Ingo Molnar 0c7296ca 43fa87f7

Changed files
+7 -1
kernel
events
+7 -1
kernel/events/core.c
··· 9199 9199 if (!try_module_get(pmu->module)) 9200 9200 return -ENODEV; 9201 9201 9202 - if (event->group_leader != event) { 9202 + /* 9203 + * A number of pmu->event_init() methods iterate the sibling_list to, 9204 + * for example, validate if the group fits on the PMU. Therefore, 9205 + * if this is a sibling event, acquire the ctx->mutex to protect 9206 + * the sibling_list. 9207 + */ 9208 + if (event->group_leader != event && pmu->task_ctx_nr != perf_sw_context) { 9203 9209 /* 9204 9210 * This ctx->mutex can nest when we're called through 9205 9211 * inheritance. See the perf_event_ctx_lock_nested() comment.