Re: [PATCH v2] wireguard: device: use exit_rtnl callback instead of manual rtnl_lock in pre_exit
"Jason A. Donenfeld" <[email protected]> Tue, 14 Apr 2026 15:28:37 +0200
| Newsgroups | com.zx2c4.lists.wireguard,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <CAHmME9oXoXykXq_emkA3v8nG2VR28CmRP2+WmhrvGJc0ZbPfpA@mail.gmail.com> |
Hi Shardul, On Mon, Apr 13, 2026 at 5:13=E2=80=AFPM Shardul Bankar <[email protected]> wrote: > > wg_netns_pre_exit() manually acquires rtnl_lock() inside the > pernet .pre_exit callback. This causes a hung task when another > thread holds rtnl_mutex - the cleanup_net workqueue (or the > setup_net failure rollback path) blocks indefinitely in > wg_netns_pre_exit() waiting to acquire the lock. > > Convert to .exit_rtnl, introduced in commit 7a60d91c690b ("net: > Add ->exit_rtnl() hook to struct pernet_operations."), where the > framework already holds RTNL and batches all callbacks under a > single rtnl_lock()/rtnl_unlock() pair, eliminating the contention > window. > > The rcu_assign_pointer(wg->creating_net, NULL) is safe to move > from .pre_exit to .exit_rtnl (which runs after synchronize_rcu()) > because all RCU readers of creating_net either use maybe_get_net() > - which returns NULL for a dying namespace with zero refcount - or > access net->user_ns which remains valid throughout the entire > ops_undo_list sequence. > > Reported-by: [email protected] > Closes: https://syzkaller.appspot.com/bug?id=3Dcb64c22a492202ca929e18262f= db8cb89e635c70 > Signed-off-by: Shardul Bankar <[email protected]> Thanks. Applied to the wireguard tree, and also added the missing __net_exit and __read_mostly annotations in the process. Jason