diff mbox

netns: foreach_netdev_safe is insufficient in default_device_exit

Message ID m1y6y04t50.fsf@frodo.ebiederm.org
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Eric W. Biederman Dec. 28, 2008, 8:10 a.m. UTC
During network namespace teardown we either move or delete
all of the network devices associated with a network namespace.
In the case of veth devices deleting one will also delete it's
pair device.  If both devices are in the same network namespace
then for_each_netdev_safe is insufficient as next may point
to the second veth device we have deleted.

To avoid problems I do what we do in __rtnl_kill_links and
restart the scan of the device list, after we have deleted
a device.

Currently dev_change_netnamespace does not appear to suffer from
this problem, but wireless devices are also paired and likely
should be moved between network namespaces together.  So I have
errored on the side of caution and restart the scan of the network
devices in that case as well.

Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
---
 net/core/dev.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

Comments

David Miller Dec. 30, 2008, 2:21 a.m. UTC | #1
From: ebiederm@xmission.com (Eric W. Biederman)
Date: Sun, 28 Dec 2008 00:10:35 -0800

> During network namespace teardown we either move or delete
> all of the network devices associated with a network namespace.
> In the case of veth devices deleting one will also delete it's
> pair device.  If both devices are in the same network namespace
> then for_each_netdev_safe is insufficient as next may point
> to the second veth device we have deleted.
> 
> To avoid problems I do what we do in __rtnl_kill_links and
> restart the scan of the device list, after we have deleted
> a device.
> 
> Currently dev_change_netnamespace does not appear to suffer from
> this problem, but wireless devices are also paired and likely
> should be moved between network namespaces together.  So I have
> errored on the side of caution and restart the scan of the network
> devices in that case as well.
> 
> Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>

Looks good, applied.

Thanks Eric.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/core/dev.c b/net/core/dev.c
index daca72e..1f154d2 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5059,13 +5059,14 @@  static struct pernet_operations __net_initdata netdev_net_ops = {
 
 static void __net_exit default_device_exit(struct net *net)
 {
-	struct net_device *dev, *next;
+	struct net_device *dev;
 	/*
 	 * Push all migratable of the network devices back to the
 	 * initial network namespace
 	 */
 	rtnl_lock();
-	for_each_netdev_safe(net, dev, next) {
+restart:
+	for_each_netdev(net, dev) {
 		int err;
 		char fb_name[IFNAMSIZ];
 
@@ -5076,7 +5077,7 @@  static void __net_exit default_device_exit(struct net *net)
 		/* Delete virtual devices */
 		if (dev->rtnl_link_ops && dev->rtnl_link_ops->dellink) {
 			dev->rtnl_link_ops->dellink(dev);
-			continue;
+			goto restart;
 		}
 
 		/* Push remaing network devices to init_net */
@@ -5087,6 +5088,7 @@  static void __net_exit default_device_exit(struct net *net)
 				__func__, dev->name, err);
 			BUG();
 		}
+		goto restart;
 	}
 	rtnl_unlock();
 }