Commit cdc5c119 authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Jakub Kicinski
Browse files

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: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250115080608.28127-6-kuniyu@amazon.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 02cdd78b
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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);
}