Re: [syzbot ci] Re: net: Support per-netns device unregistration
Kuniyuki Iwashima <[email protected]>
| Newsgroups | dev.linux.lists.syzbot,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
From: syzbot ci <[email protected]> Date: Thu, 02 Jul 2026 00:45:10 -0700 > syzbot ci has tested the following series > > [v1] net: Support per-netns device unregistration > https://lore.kernel.org/all/[email protected] > * [PATCH v1 net-next 01/14] rtnetlink: Lock sock_net(skb->sk) in rtnl_newlink(). > * [PATCH v1 net-next 02/14] rtnetlink: Call unregister_netdevice_many() only once in rtnl_link_unregister(). > * [PATCH v1 net-next 03/14] rtnetlink: Add per-netns rtnl_work. > * [PATCH v1 net-next 04/14] net: Wrap default_device_exit_net() with __rtnl_net_lock(). > * [PATCH v1 net-next 05/14] net: Hold __rtnl_net_lock() in netdev_wait_allrefs_any(). > * [PATCH v1 net-next 06/14] net: Add per-netns netdev unregistration infra. > * [PATCH v1 net-next 07/14] net: Call unregister_netdevice_many() per netns. > * [PATCH v1 net-next 08/14] veth: Support per-netns device unregistration. > * [PATCH v1 net-next 09/14] bareudp: Protect bareudp_list with mutex. > * [PATCH v1 net-next 10/14] bareudp: Support per-netns netdev unregistration. > * [PATCH v1 net-next 11/14] ipvlan: Convert ipvl_port.count to refcount_t. > * [PATCH v1 net-next 12/14] ipvlan: Synchronise ipvlan_init() and ipvlan_uninit() for the same lower dev. > * [PATCH v1 net-next 13/14] ipvlan: Protect ipvl_port.ipvlans with mutex. > * [PATCH v1 net-next 14/14] ipvlan: Support per-netns netdev unregistration. > > and found the following issue: > possible deadlock in __dev_change_net_namespace > > Full report is available here: > https://ci.syzbot.org/series/a744b257-d741-4780-8a53-f156b2a7afc9 > > *** > > possible deadlock in __dev_change_net_namespace > > tree: net-next > URL: https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git > base: d6e81529749190123aa0040626c7e5dbc20fdc9a > arch: amd64 > compiler: Debian clang version 22.1.6 (++20260514074242+fc4aad7b5db3-1~exp1~20260514074407.73), Debian LLD 22.1.6 > config: https://ci.syzbot.org/builds/243cd0ec-28f9-4d21-8f16-3d2fbad8388d/config > syz repro: https://ci.syzbot.org/findings/a8a0740d-fdec-4a20-9aa5-7cb955707913/syz_repro > > veth0_macvtap: left promiscuous mode > ============================================ > WARNING: possible recursive locking detected > syzkaller #0 Not tainted > -------------------------------------------- > syz.1.18/5814 is trying to acquire lock: > ffffffff9a9b0418 (&net->dev_unreg_lock){+.+.}-{3:3}, at: spin_lock include/linux/spinlock.h:342 [inline] > ffffffff9a9b0418 (&net->dev_unreg_lock){+.+.}-{3:3}, at: unregister_netdevice_move_net net/core/dev.c:-1 [inline] > ffffffff9a9b0418 (&net->dev_unreg_lock){+.+.}-{3:3}, at: __dev_change_net_namespace+0x1479/0x2200 net/core/dev.c:12768 > > but task is already holding lock: > ffff88810b6cf8d8 (&net->dev_unreg_lock){+.+.}-{3:3}, at: spin_lock include/linux/spinlock.h:342 [inline] > ffff88810b6cf8d8 (&net->dev_unreg_lock){+.+.}-{3:3}, at: unregister_netdevice_move_net net/core/dev.c:-1 [inline] > ffff88810b6cf8d8 (&net->dev_unreg_lock){+.+.}-{3:3}, at: __dev_change_net_namespace+0x146a/0x2200 net/core/dev.c:12768 > > other info that might help us debug this: > Possible unsafe locking scenario: > > CPU0 > ---- > lock(&net->dev_unreg_lock); > lock(&net->dev_unreg_lock); > > *** DEADLOCK *** > > May be due to missing lock nesting notation Oh right, I'll squash this to patch 6. ---8<--- diff --git a/net/core/dev.c b/net/core/dev.c index 57fb4741d0ac..fcd58c2aa030 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -12574,10 +12574,10 @@ static void unregister_netdevice_move_net(struct net *net_old, { if (net_old > net) { spin_lock(&net->dev_unreg_lock); - spin_lock(&net_old->dev_unreg_lock); + spin_lock_nested(&net_old->dev_unreg_lock, SINGLE_DEPTH_NESTING); } else { spin_lock(&net_old->dev_unreg_lock); - spin_lock(&net->dev_unreg_lock); + spin_lock_nested(&net->dev_unreg_lock, SINGLE_DEPTH_NESTING); } if (!list_empty(&dev->unreg_list_net)) { ---8<---