Skip to content

Commit c5c833f

Browse files
Alexei Starovoitovgregkh
authored andcommitted
bpf: Fix deadlock between rcu_tasks_trace and event_mutex.
[ Upstream commit 4580f4e ] 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) Delegate trace_set_clr_event() to workqueue to avoid such lock dependency. Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20250224221637.4780-1-alexei.starovoitov@gmail.com Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 7758e30 commit c5c833f

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

kernel/trace/bpf_trace.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ static const struct bpf_func_proto bpf_trace_printk_proto = {
403403
.arg2_type = ARG_CONST_SIZE,
404404
};
405405

406-
static void __set_printk_clr_event(void)
406+
static void __set_printk_clr_event(struct work_struct *work)
407407
{
408408
/*
409409
* This program might be calling bpf_trace_printk,
@@ -416,10 +416,11 @@ static void __set_printk_clr_event(void)
416416
if (trace_set_clr_event("bpf_trace", "bpf_trace_printk", 1))
417417
pr_warn_ratelimited("could not enable bpf_trace_printk events");
418418
}
419+
static DECLARE_WORK(set_printk_work, __set_printk_clr_event);
419420

420421
const struct bpf_func_proto *bpf_get_trace_printk_proto(void)
421422
{
422-
__set_printk_clr_event();
423+
schedule_work(&set_printk_work);
423424
return &bpf_trace_printk_proto;
424425
}
425426

@@ -462,7 +463,7 @@ static const struct bpf_func_proto bpf_trace_vprintk_proto = {
462463

463464
const struct bpf_func_proto *bpf_get_trace_vprintk_proto(void)
464465
{
465-
__set_printk_clr_event();
466+
schedule_work(&set_printk_work);
466467
return &bpf_trace_vprintk_proto;
467468
}
468469

0 commit comments

Comments
 (0)