On Tue, Jan 29, 2019 at 08:04:57PM -0800, Alexei Starovoitov wrote: > Lockdep warns about false positive:
The report reads like: tracepoint_probe_register() #0 mutex_lock(&tracepoint_mutex) tracepoint_add_func() static_key_slow_inc() #1 cpus_read_lock(); _cpu_up() #1 cpus_write_lock(); ... perf_event_init_cpu() #2 mutex_lock(&pmus_lock); #3 mutex_lock(&ctx->mutex); perf_ioctl() #4 perf_event_ctx_lock(); _perf_ioctl(IOC_QUERY_BPF) perf_event_query_prog_array() #5 mutex_lock(&bpf_event_mutex); bpf_probe_register() #5 mutex_lock(&bpf_event_mutex); __bpf_probe_register() tracepoint_probe_register() #0 mutex_lock(&tracepoint_mutex); Which to me reads like an entirely valid deadlock scenario. And note that the first and last can be combined to give: bpf_probe_register() #5 mutex_lock(&bpf_event_mutex); __bpf_probe_register() tracepoint_probe_register() #0 mutex_lock(&tracepoint_mutex); tracepoint_add_func() static_key_slow_inc() #1 cpus_read_lock(); Which generates a deadlock even without #0. Why do you say this is not possible? All you need is 3 CPUs, one doing a CPU online, one doing a perf ioctl() and one doing that bpf_probe_register().