netns: foreach_netdev_safe is insufficient in default_device_exit
Subsystems (2)
PATCH 1/1 netns: foreach_netdev_safe is insufficient in default_device_exit
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.
--- net/core/dev.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-)
net/core/dev.c +5 -3
@@ -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 (); }
Signature · 1 line
1.5.3.rc6.17.g1911
David Miller
maintainerFrom: [email protected] (Eric W. Biederman)
Date: Sun, 28 Dec 2008 00:10:35 -0800
Quoted 11 lines
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_safeis insufficient as next may point to the second veth device we have deleted.To avoid problems I do what we do in
__rtnl_kill_linksand restart the scan of the device list, after we have deleted a device.
Quoted 7 lines
Currently
dev_change_netnamespacedoes 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 <[email protected]>
Looks good, applied.
Thanks Eric.