--- y/include/linux/sched.h +++ x/include/linux/sched.h @@ -944,6 +944,9 @@ struct task_struct { #ifdef CONFIG_CPU_SUP_INTEL unsigned reported_split_lock:1; #endif +#ifdef CONFIG_BPF_EVENTS + unsigned in_bpf_trace_printk:1; +#endif unsigned long atomic_flags; /* Flags requiring atomic access. */ --- y/kernel/trace/bpf_trace.c +++ x/kernel/trace/bpf_trace.c @@ -380,15 +380,19 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt unsigned long flags; int ret; + if (current->in_bpf_trace_printk) + return -EDEADLK; ret = bpf_bprintf_prepare(fmt, fmt_size, args, &bin_args, MAX_TRACE_PRINTK_VARARGS); if (ret < 0) return ret; raw_spin_lock_irqsave(&trace_printk_lock, flags); + current->in_bpf_trace_printk = 1; ret = bstr_printf(buf, sizeof(buf), fmt, bin_args); trace_bpf_trace_printk(buf); + current->in_bpf_trace_printk = 0; raw_spin_unlock_irqrestore(&trace_printk_lock, flags); bpf_bprintf_cleanup();