======================================================
WARNING: possible circular locking dependency detected
5.15.181-syzkaller #0 Not tainted
------------------------------------------------------
kworker/0:0/7 is trying to acquire lock:
ffff88801e867db8 (&trie->lock){..-.}-{2:2}, at: trie_delete_elem+0x90/0x710 kernel/bpf/lpm_trie.c:467
but task is already holding lock:
ffff8880b9028098 (&base->lock){-.-.}-{2:2}, at: __mod_timer+0x674/0xd20 kernel/time/timer.c:1043
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&base->lock){-.-.}-{2:2}:
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xa4/0xf0 kernel/locking/spinlock.c:162
lock_timer_base+0x123/0x270 kernel/time/timer.c:946
__mod_timer+0x117/0xd20 kernel/time/timer.c:1019
queue_delayed_work_on+0x126/0x1e0 kernel/workqueue.c:1715
queue_delayed_work include/linux/workqueue.h:527 [inline]
schedule_delayed_work include/linux/workqueue.h:631 [inline]
kvfree_call_rcu+0x4a9/0x7c0 kernel/rcu/tree.c:3625
rtnl_register_internal+0x44e/0x540 net/core/rtnetlink.c:223
rtnl_register+0x2e/0x70 net/core/rtnetlink.c:273
ip_rt_init+0x2e0/0x3a0 net/ipv4/route.c:3791
ip_init+0xa/0x20 net/ipv4/ip_output.c:1749
inet_init+0x28b/0x3a0 net/ipv4/af_inet.c:2007
do_one_initcall+0x1ee/0x680 init/main.c:1302
do_initcall_level+0x137/0x1f0 init/main.c:1375
do_initcalls+0x4b/0x90 init/main.c:1391
kernel_init_freeable+0x3ce/0x560 init/main.c:1615
kernel_init+0x19/0x1b0 init/main.c:1506
ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:287
-> #1 (krc.lock){..-.}-{2:2}:
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2a/0x40 kernel/locking/spinlock.c:154
krc_this_cpu_lock kernel/rcu/tree.c:3199 [inline]
add_ptr_to_bulk_krc_lock kernel/rcu/tree.c:3506 [inline]
kvfree_call_rcu+0x186/0x7c0 kernel/rcu/tree.c:3597
trie_delete_elem+0x58c/0x710 kernel/bpf/lpm_trie.c:-1
0xffffffffa002cf68
bpf_dispatcher_nop_func include/linux/bpf.h:790 [inline]
__bpf_prog_run include/linux/filter.h:628 [inline]
bpf_prog_run include/linux/filter.h:635 [inline]
__bpf_trace_run kernel/trace/bpf_trace.c:1878 [inline]
bpf_trace_run3+0x17e/0x320 kernel/trace/bpf_trace.c:1916
__traceiter_qdisc_create+0x73/0xc0 include/trace/events/qdisc.h:127
trace_qdisc_create include/trace/events/qdisc.h:127 [inline]
qdisc_create_dflt+0x3cc/0x430 net/sched/sch_generic.c:958
attach_one_default_qdisc net/sched/sch_generic.c:1113 [inline]
netdev_for_each_tx_queue include/linux/netdevice.h:2379 [inline]
attach_default_qdiscs net/sched/sch_generic.c:1131 [inline]
dev_activate+0x331/0x12b0 net/sched/sch_generic.c:1190
__dev_open+0x32c/0x420 net/core/dev.c:1546
__dev_change_flags+0x20a/0x6a0 net/core/dev.c:8853
dev_change_flags+0x82/0x1a0 net/core/dev.c:8924
dev_ifsioc+0x147/0xe70 net/core/dev_ioctl.c:324
dev_ioctl+0x55f/0xe50 net/core/dev_ioctl.c:587
sock_do_ioctl+0x222/0x2f0 net/socket.c:1154
sock_ioctl+0x4ed/0x6e0 net/socket.c:1257
vfs_ioctl fs/ioctl.c:51 [inline]
__do_sys_ioctl fs/ioctl.c:874 [inline]
__se_sys_ioctl+0xfa/0x170 fs/ioctl.c:860
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x4c/0xa0 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x66/0xd0
-> #0 (&trie->lock){..-.}-{2:2}:
check_prev_add kernel/locking/lockdep.c:3053 [inline]
check_prevs_add kernel/locking/lockdep.c:3172 [inline]
validate_chain kernel/locking/lockdep.c:3788 [inline]
__lock_acquire+0x2c33/0x7c60 kernel/locking/lockdep.c:5012
lock_acquire+0x197/0x3f0 kernel/locking/lockdep.c:5623
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xa4/0xf0 kernel/locking/spinlock.c:162
trie_delete_elem+0x90/0x710 kernel/bpf/lpm_trie.c:467
bpf_prog_cf8abee6043eb8c6+0x40/0xecc
bpf_dispatcher_nop_func include/linux/bpf.h:790 [inline]
__bpf_prog_run include/linux/filter.h:628 [inline]
bpf_prog_run include/linux/filter.h:635 [inline]
__bpf_trace_run kernel/trace/bpf_trace.c:1878 [inline]
bpf_trace_run3+0x17e/0x320 kernel/trace/bpf_trace.c:1916
trace_timer_start include/trace/events/timer.h:52 [inline]
enqueue_timer+0x394/0x520 kernel/time/timer.c:586
internal_add_timer kernel/time/timer.c:611 [inline]
__mod_timer+0x8e1/0xd20 kernel/time/timer.c:1062
mod_peer_timer+0x152/0x210 drivers/net/wireguard/timers.c:37
wg_packet_consume_data_done drivers/net/wireguard/receive.c:361 [inline]
wg_packet_rx_poll+0xcfa/0x2080 drivers/net/wireguard/receive.c:481
__napi_poll+0xc0/0x430 net/core/dev.c:7075
napi_poll net/core/dev.c:7142 [inline]
net_rx_action+0x4a8/0x9c0 net/core/dev.c:7232
handle_softirqs+0x328/0x820 kernel/softirq.c:558
do_softirq+0x13b/0x200 kernel/softirq.c:459
__local_bh_enable_ip+0x174/0x1b0 kernel/softirq.c:383
spin_unlock_bh include/linux/spinlock.h:408 [inline]
ptr_ring_consume_bh include/linux/ptr_ring.h:367 [inline]
wg_packet_decrypt_worker+0xcfc/0xda0 drivers/net/wireguard/receive.c:506
process_one_work+0x863/0x1000 kernel/workqueue.c:2310
worker_thread+0xaa8/0x12a0 kernel/workqueue.c:2457
kthread+0x436/0x520 kernel/kthread.c:334
ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:287
other info that might help us debug this:
Chain exists of:
&trie->lock --> krc.lock --> &base->lock
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&base->lock);
lock(krc.lock);
lock(&base->lock);
lock(&trie->lock);
*** DEADLOCK ***
5 locks held by kworker/0:0/7:
#0: ffff8880620a9d38 ((wq_completion)wg-crypt-wg1#3){+.+.}-{0:0}, at: process_one_work+0x760/0x1000 kernel/workqueue.c:-1
#1: ffffc90000cc7d00 ((work_completion)(&({ do { const void *__vpp_verify = (typeof((worker) + 0))((void *)0); (void)__vpp_verify; } while (0); ({ unsigned long __ptr; __ptr = (unsigned long) ((typeof(*((worker))) *)((worker))); (typeof((typeof(*((worker))) *)((worker)))) (__ptr + (((__per_cpu_offset[(cpu)])))); }); })->work)){+.+.}-{0:0}, at: process_one_work+0x7a3/0x1000 kernel/workqueue.c:2285
#2: ffffffff8c11bec0 (rcu_read_lock_bh){....}-{1:2}, at: rcu_lock_acquire+0x5/0x30 include/linux/rcupdate.h:311
#3: ffff8880b9028098 (&base->lock){-.-.}-{2:2}, at: __mod_timer+0x674/0xd20 kernel/time/timer.c:1043
#4: ffffffff8c11be60 (rcu_read_lock){....}-{1:2}, at: rcu_lock_acquire+0x5/0x30 include/linux/rcupdate.h:311
stack backtrace:
CPU: 0 PID: 7 Comm: kworker/0:0 Not tainted 5.15.181-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/19/2025
Workqueue: wg-crypt-wg1 wg_packet_decrypt_worker
Call Trace:
dump_stack_lvl+0x168/0x230 lib/dump_stack.c:106
check_noncircular+0x274/0x310 kernel/locking/lockdep.c:2133
check_prev_add kernel/locking/lockdep.c:3053 [inline]
check_prevs_add kernel/locking/lockdep.c:3172 [inline]
validate_chain kernel/locking/lockdep.c:3788 [inline]
__lock_acquire+0x2c33/0x7c60 kernel/locking/lockdep.c:5012
lock_acquire+0x197/0x3f0 kernel/locking/lockdep.c:5623
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xa4/0xf0 kernel/locking/spinlock.c:162
trie_delete_elem+0x90/0x710 kernel/bpf/lpm_trie.c:467
bpf_prog_cf8abee6043eb8c6+0x40/0xecc
bpf_dispatcher_nop_func include/linux/bpf.h:790 [inline]
__bpf_prog_run include/linux/filter.h:628 [inline]
bpf_prog_run include/linux/filter.h:635 [inline]
__bpf_trace_run kernel/trace/bpf_trace.c:1878 [inline]
bpf_trace_run3+0x17e/0x320 kernel/trace/bpf_trace.c:1916
trace_timer_start include/trace/events/timer.h:52 [inline]
enqueue_timer+0x394/0x520 kernel/time/timer.c:586
internal_add_timer kernel/time/timer.c:611 [inline]
__mod_timer+0x8e1/0xd20 kernel/time/timer.c:1062
mod_peer_timer+0x152/0x210 drivers/net/wireguard/timers.c:37
wg_packet_consume_data_done drivers/net/wireguard/receive.c:361 [inline]
wg_packet_rx_poll+0xcfa/0x2080 drivers/net/wireguard/receive.c:481
__napi_poll+0xc0/0x430 net/core/dev.c:7075
napi_poll net/core/dev.c:7142 [inline]
net_rx_action+0x4a8/0x9c0 net/core/dev.c:7232
handle_softirqs+0x328/0x820 kernel/softirq.c:558
do_softirq+0x13b/0x200 kernel/softirq.c:459
__local_bh_enable_ip+0x174/0x1b0 kernel/softirq.c:383
spin_unlock_bh include/linux/spinlock.h:408 [inline]
ptr_ring_consume_bh include/linux/ptr_ring.h:367 [inline]
wg_packet_decrypt_worker+0xcfc/0xda0 drivers/net/wireguard/receive.c:506
process_one_work+0x863/0x1000 kernel/workqueue.c:2310
worker_thread+0xaa8/0x12a0 kernel/workqueue.c:2457
kthread+0x436/0x520 kernel/kthread.c:334
ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:287