Message ID | 20091204112734.24535.86096.sendpatchset@localhost.localdomain |
---|---|
State | Rejected, archived |
Delegated to: | David Miller |
Headers | show |
Krishna Kumar a écrit : > From: Krishna Kumar <krkumar2@in.ibm.com> > > (From code-walkthrough, and untested) > > Fix "waiting for %s to become free" hang. dev has an > extra hold (by ip6mr_reg_vif) which was not dropped > before calling unregister_netdevice. > > Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com> > --- > net/ipv6/ip6mr.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff -ruNp org/net/ipv6/ip6mr.c new/net/ipv6/ip6mr.c > --- org/net/ipv6/ip6mr.c 2009-12-04 16:08:07.000000000 +0530 > +++ new/net/ipv6/ip6mr.c 2009-12-04 16:09:56.000000000 +0530 > @@ -648,8 +648,8 @@ static int mif6_add(struct net *net, str > return -ENOBUFS; > err = dev_set_allmulti(dev, 1); > if (err) { > - unregister_netdevice(dev); > dev_put(dev); > + unregister_netdevice(dev); > return err; > } > break; This changes nothing, since we hold rtnl at this point. unregister_netdevice() only queues the device (net_set_todo()) in a list. And we process this list later, when renl_unlock() is finally called. -- 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
> Eric Dumazet <eric.dumazet@gmail.com> > > Re: [PATCH] ipv6: Fix "waiting for %s to become free" hang > > Krishna Kumar a écrit : > > From: Krishna Kumar <krkumar2@in.ibm.com> > > > > (From code-walkthrough, and untested) > > > > Fix "waiting for %s to become free" hang. dev has an > > extra hold (by ip6mr_reg_vif) which was not dropped > > before calling unregister_netdevice. > > > > Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com> > > --- > > net/ipv6/ip6mr.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff -ruNp org/net/ipv6/ip6mr.c new/net/ipv6/ip6mr.c > > --- org/net/ipv6/ip6mr.c 2009-12-04 16:08:07.000000000 +0530 > > +++ new/net/ipv6/ip6mr.c 2009-12-04 16:09:56.000000000 +0530 > > @@ -648,8 +648,8 @@ static int mif6_add(struct net *net, str > > return -ENOBUFS; > > err = dev_set_allmulti(dev, 1); > > if (err) { > > - unregister_netdevice(dev); > > dev_put(dev); > > + unregister_netdevice(dev); > > return err; > > } > > break; > > This changes nothing, since we hold rtnl at this point. > > unregister_netdevice() only queues the device (net_set_todo()) in a list. > > And we process this list later, when renl_unlock() is finally called. Yes, you are right. I sent the patch on my memory of unregister_netdev, which gets the rtnl and drops it, and that would have caused this problem. Please drop the patch. thanks, - KK -- 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 -ruNp org/net/ipv6/ip6mr.c new/net/ipv6/ip6mr.c --- org/net/ipv6/ip6mr.c 2009-12-04 16:08:07.000000000 +0530 +++ new/net/ipv6/ip6mr.c 2009-12-04 16:09:56.000000000 +0530 @@ -648,8 +648,8 @@ static int mif6_add(struct net *net, str return -ENOBUFS; err = dev_set_allmulti(dev, 1); if (err) { - unregister_netdevice(dev); dev_put(dev); + unregister_netdevice(dev); return err; } break;