ipv6: Hold rtnl_net_lock() in addrconf_init() and addrconf_cleanup().

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>
This commit is contained in:
Kuniyuki Iwashima 2025-01-15 17:06:02 +09:00 committed by Jakub Kicinski
parent 02cdd78b4e
commit cdc5c1196e

View 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);
}