dev: Hold per-netns RTNL in (un)?register_netdev().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Sat, 4 Jan 2025 08:21:49 +0000 (17:21 +0900)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 7 Jan 2025 12:45:53 +0000 (13:45 +0100)
Let's hold per-netns RTNL of dev_net(dev) in register_netdev()
and unregister_netdev().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/core/dev.c

index e7223972b9aafea345ea55c576231be3bf1cef02..073f682a9653a212198b12bae17fafe7b46f96e9 100644 (file)
@@ -10731,12 +10731,16 @@ EXPORT_SYMBOL_GPL(init_dummy_netdev);
  */
 int register_netdev(struct net_device *dev)
 {
+       struct net *net = dev_net(dev);
        int err;
 
-       if (rtnl_lock_killable())
+       if (rtnl_net_lock_killable(net))
                return -EINTR;
+
        err = register_netdevice(dev);
-       rtnl_unlock();
+
+       rtnl_net_unlock(net);
+
        return err;
 }
 EXPORT_SYMBOL(register_netdev);
@@ -11606,9 +11610,11 @@ EXPORT_SYMBOL(unregister_netdevice_many);
  */
 void unregister_netdev(struct net_device *dev)
 {
-       rtnl_lock();
+       struct net *net = dev_net(dev);
+
+       rtnl_net_lock(net);
        unregister_netdevice(dev);
-       rtnl_unlock();
+       rtnl_net_unlock(net);
 }
 EXPORT_SYMBOL(unregister_netdev);