On Tue, Feb 25, 2025 at 5:03 AM Hou Tao <houtao@xxxxxxxxxxxxxxx> wrote: > > Hi, > > On 2/25/2025 6:16 AM, Alexei Starovoitov wrote: > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > > > Fix the following deadlock: > > CPU A > > _free_event() > > perf_kprobe_destroy() > > mutex_lock(&event_mutex) > > perf_trace_event_unreg() > > synchronize_rcu_tasks_trace() > > > > There are several paths where _free_event() grabs event_mutex > > and calls sync_rcu_tasks_trace. Above is one such case. > > > > CPU B > > bpf_prog_test_run_syscall() > > rcu_read_lock_trace() > > bpf_prog_run_pin_on_cpu() > > bpf_prog_load() > > bpf_tracing_func_proto() > > trace_set_clr_event() > > mutex_lock(&event_mutex) > > Considering the unregistered case is not so frequency, would it better > to use mutex_trylock firstly, then fallback to workqueue when the > event_mutex is busy ? No. That would be an unnecessary complication.