Message ID | m1639wjshq.fsf_-_@fess.ebiederm.org |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Eric W. Biederman a écrit : > I tested the recent unregister many changes and got a weird, > nasty and seemingly unrelasted kernel oops. Changing > unregister_netdevice_queue to use list_move_tail fixes > the problem for me. > > ip link add type veth > rmmod veth > > ls /sys/class/net/ > showed one of the veth devices still present. > > A subsequent ip link oopsed the box. > > Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> > Yes, problem is __rtnl_kill_links() doesnt anymore restart its loop and does : for_each_netdev(net, dev) { if (dev->rtnl_link_ops == ops) ops->dellink(dev, &list_kill); } unregister_netdevice_many(&list_kill); As veth wants in its dellink() method to unregister two netdevices, we really want your fix or corrupt list_kill Acked-by: Eric Dumazet <eric.dumazet@gmail.com> 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
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Sat, 31 Oct 2009 10:41:39 +0100 > Eric W. Biederman a écrit : >> I tested the recent unregister many changes and got a weird, >> nasty and seemingly unrelasted kernel oops. Changing >> unregister_netdevice_queue to use list_move_tail fixes >> the problem for me. >> >> ip link add type veth >> rmmod veth >> >> ls /sys/class/net/ >> showed one of the veth devices still present. >> >> A subsequent ip link oopsed the box. >> >> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> ... > Acked-by: Eric Dumazet <eric.dumazet@gmail.com> Applied, thanks everyone. -- 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 --git a/net/core/dev.c b/net/core/dev.c index 94f42a1..9c0b202 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5227,6 +5227,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, netdev_init_queues(dev); INIT_LIST_HEAD(&dev->napi_list); + INIT_LIST_HEAD(&dev->unreg_list); dev->priv_flags = IFF_XMIT_DST_RELEASE; setup(dev); strcpy(dev->name, name); @@ -5308,7 +5309,7 @@ void unregister_netdevice_queue(struct net_device *dev, struct list_head *head) ASSERT_RTNL(); if (head) { - list_add_tail(&dev->unreg_list, head); + list_move_tail(&dev->unreg_list, head); } else { rollback_registered(dev); /* Finish processing unregister after unlock */
I tested the recent unregister many changes and got a weird, nasty and seemingly unrelasted kernel oops. Changing unregister_netdevice_queue to use list_move_tail fixes the problem for me. ip link add type veth rmmod veth ls /sys/class/net/ showed one of the veth devices still present. A subsequent ip link oopsed the box. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> --- -- 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