Skip to content
  • Peter Zijlstra's avatar
    perf/core: Fix ctx::mutex deadlock · 0c7296ca
    Peter Zijlstra authored
    
    
    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: default avatarPeter 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: default avatarIngo Molnar <mingo@kernel.org>
    0c7296ca