]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ipv6: Hold rtnl_net_lock() in addrconf_init() and addrconf_cleanup().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 15 Jan 2025 08:06:02 +0000 (17:06 +0900)
committerJakub Kicinski <kuba@kernel.org>
Mon, 20 Jan 2025 20:16:05 +0000 (12:16 -0800)
addrconf_init() holds RTNL for blackhole_netdev, which is the global
device in init_net.

addrconf_cleanup() holds RTNL to clean up devices in init_net too.

Let's use rtnl_net_lock(&init_net) there.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250115080608.28127-6-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/addrconf.c

index e297cd6f9fd23f9d18b34ad23fd129b91c82480b..4d1ec290a259c3d88ad3a5575dde896a5217441f 100644 (file)
@@ -7460,9 +7460,9 @@ int __init addrconf_init(void)
                goto out_nowq;
        }
 
-       rtnl_lock();
+       rtnl_net_lock(&init_net);
        idev = ipv6_add_dev(blackhole_netdev);
-       rtnl_unlock();
+       rtnl_net_unlock(&init_net);
        if (IS_ERR(idev)) {
                err = PTR_ERR(idev);
                goto errlo;
@@ -7512,17 +7512,17 @@ void addrconf_cleanup(void)
 
        rtnl_af_unregister(&inet6_ops);
 
-       rtnl_lock();
+       rtnl_net_lock(&init_net);
 
        /* clean dev list */
        for_each_netdev(&init_net, dev) {
-               if (__in6_dev_get(dev) == NULL)
+               if (!__in6_dev_get_rtnl_net(dev))
                        continue;
                addrconf_ifdown(dev, true);
        }
        addrconf_ifdown(init_net.loopback_dev, true);
 
-       rtnl_unlock();
+       rtnl_net_unlock(&init_net);
 
        destroy_workqueue(addrconf_wq);
 }