dev: Use rtnl_net_dev_lock() in unregister_netdev().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Mon, 17 Feb 2025 19:11:29 +0000 (11:11 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 19 Feb 2025 02:33:30 +0000 (18:33 -0800)
The following sequence is basically illegal when dev was fetched
without lookup because dev_net(dev) might be different after holding
rtnl_net_lock():

  net = dev_net(dev);
  rtnl_net_lock(net);

Let's use rtnl_net_dev_lock() in unregister_netdev().

Note that there is no real bug in unregister_netdev() for now
because RTNL protects the scope even if dev_net(dev) is changed
before/after RTNL.

Fixes: 00fb9823939e ("dev: Hold per-netns RTNL in (un)?register_netdev().")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250217191129.19967-4-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/dev.c

index 19e268568282acbfdfe3ddebe007c48b20b9a60e..fafd2f4b5d5d7112aeb342aa42635bd2113e86cd 100644 (file)
@@ -11920,11 +11920,9 @@ EXPORT_SYMBOL(unregister_netdevice_many);
  */
 void unregister_netdev(struct net_device *dev)
 {
-       struct net *net = dev_net(dev);
-
-       rtnl_net_lock(net);
+       rtnl_net_dev_lock(dev);
        unregister_netdevice(dev);
-       rtnl_net_unlock(net);
+       rtnl_net_dev_unlock(dev);
 }
 EXPORT_SYMBOL(unregister_netdev);