Commit 08e9f2d5 authored by Cosmin Ratiu's avatar Cosmin Ratiu Committed by Jakub Kicinski
Browse files

net: Lock netdevices during dev_shutdown



__qdisc_destroy() calls into various qdiscs .destroy() op, which in turn
can call .ndo_setup_tc(), which requires the netdev instance lock.

This commit extends the critical section in
unregister_netdevice_many_notify() to cover dev_shutdown() (and
dev_tcx_uninstall() as a side-effect) and acquires the netdev instance
lock in __dev_change_net_namespace() for the other dev_shutdown() call.

This should now guarantee that for all qdisc ops, the netdev instance
lock is held during .ndo_setup_tc().

Fixes: a0527ee2 ("net: hold netdev instance lock during qdisc ndo_setup_tc")
Signed-off-by: default avatarCosmin Ratiu <cratiu@nvidia.com>
Acked-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250505194713.1723399-1-cratiu@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 0093cb19
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -11966,9 +11966,9 @@ void unregister_netdevice_many_notify(struct list_head *head,
		struct sk_buff *skb = NULL;

		/* Shutdown queueing discipline. */
		netdev_lock_ops(dev);
		dev_shutdown(dev);
		dev_tcx_uninstall(dev);
		netdev_lock_ops(dev);
		dev_xdp_uninstall(dev);
		dev_memory_provider_uninstall(dev);
		netdev_unlock_ops(dev);
@@ -12161,7 +12161,9 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
	synchronize_net();

	/* Shutdown queueing discipline. */
	netdev_lock_ops(dev);
	dev_shutdown(dev);
	netdev_unlock_ops(dev);

	/* Notify protocols, that we are about to destroy
	 * this device. They should clean all the things.