[PATCH NET-PREV 48/51] default_device: Call dev_change_net_namespace() under nd_lock

Kirill Tkhai posted 51 patches 9 months ago
[PATCH NET-PREV 48/51] default_device: Call dev_change_net_namespace() under nd_lock
Posted by Kirill Tkhai 9 months ago
We want to provide "nd_lock is locked" context during
NETDEV_REGISTER (and later for NETDEV_UNREGISTER)
events. When calling from __register_netdevice(),
notifiers are already in that context, and we do the
same for dev_change_net_namespace() here.

Signed-off-by: Kirill Tkhai <tkhai@ya.ru>
---
 net/core/dev.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/net/core/dev.c b/net/core/dev.c
index f0f93b5a2819..c477b39d08b9 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -12357,6 +12357,7 @@ static void __net_exit default_device_exit_net(struct net *net)
 {
 	struct netdev_name_node *name_node, *tmp;
 	struct net_device *dev, *aux;
+	struct nd_lock *nd_lock;
 	/*
 	 * Push all migratable network devices back to the
 	 * initial network namespace
@@ -12383,7 +12384,9 @@ static void __net_exit default_device_exit_net(struct net *net)
 			if (netdev_name_in_use(&init_net, name_node->name))
 				__netdev_name_node_alt_destroy(name_node);
 
+		lock_netdev(dev, &nd_lock);
 		err = dev_change_net_namespace(dev, &init_net, fb_name);
+		unlock_netdev(nd_lock);
 		if (err) {
 			pr_emerg("%s: failed to move %s to init_net: %d\n",
 				 __func__, dev->name, err);