net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Mon, 6 Jan 2025 07:07:51 +0000 (16:07 +0900)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 Jan 2025 01:49:20 +0000 (17:49 -0800)
(un)?register_netdevice_notifier_dev_net() hold RTNL before triggering
the notifier for all netdev in the netns.

Let's convert the RTNL to rtnl_net_lock().

Note that move_netdevice_notifiers_dev_net() is assumed to be (but not
yet) protected by per-netns RTNL of both src and dst netns; we need to
convert wireless and hyperv drivers that call dev_change_net_namespace().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250106070751.63146-4-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/dev.c

index 06a5c11..efbe2c4 100644 (file)
@@ -1946,15 +1946,17 @@ int register_netdevice_notifier_dev_net(struct net_device *dev,
                                        struct notifier_block *nb,
                                        struct netdev_net_notifier *nn)
 {
+       struct net *net = dev_net(dev);
        int err;
 
-       rtnl_lock();
-       err = __register_netdevice_notifier_net(dev_net(dev), nb, false);
+       rtnl_net_lock(net);
+       err = __register_netdevice_notifier_net(net, nb, false);
        if (!err) {
                nn->nb = nb;
                list_add(&nn->list, &dev->net_notifier_list);
        }
-       rtnl_unlock();
+       rtnl_net_unlock(net);
+
        return err;
 }
 EXPORT_SYMBOL(register_netdevice_notifier_dev_net);
@@ -1963,12 +1965,14 @@ int unregister_netdevice_notifier_dev_net(struct net_device *dev,
                                          struct notifier_block *nb,
                                          struct netdev_net_notifier *nn)
 {
+       struct net *net = dev_net(dev);
        int err;
 
-       rtnl_lock();
+       rtnl_net_lock(net);
        list_del(&nn->list);
-       err = __unregister_netdevice_notifier_net(dev_net(dev), nb);
-       rtnl_unlock();
+       err = __unregister_netdevice_notifier_net(net, nb);
+       rtnl_net_unlock(net);
+
        return err;
 }
 EXPORT_SYMBOL(unregister_netdevice_notifier_dev_net);