lkml.org 
[lkml]   [2004]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
SubjectRe: 2.6.7-rc3: waiting for eth0 to become free
From
Date
On Tue, 2004-06-08 at 14:02 -0700, Stephen Hemminger wrote:
> On Tue, 08 Jun 2004 22:09:29 +0200
> Felipe Alfaro Solana <felipe_alfaro@linuxmail.org> wrote:
>
> > On Tue, 2004-06-08 at 12:42 -0700, Stephen Hemminger wrote:
> > > On Tue, 08 Jun 2004 21:18:30 +0200
> > > Felipe Alfaro Solana <felipe_alfaro@linuxmail.org> wrote:
> > >
> > > > Hi!
> > > >
> > > > On my laptop, when using a CardBus 3c59x-based NIC, I need to run
> > > > "cardctl eject" so the system won't freeze when resuming. "cardctl
> > > > eject" worked fine in 2.6.7-rc2-mm2, even when there were programs with
> > > > network sockets opened (for example, Evolution mantaining a connection
> > > > against an IMAP server): the card is ejected (well, not physically),
> > > > even when there are ESTABLISHED connections.
> > > >
> > > > However, starting with 2.6.7-rc3, "cardctl eject" hangs if a program
> > > > holds any socket open. After a while the "unregister_netdevice: waiting
> > > > for eth0 to become free" message starts appearing on the kernel message
> > > > ring. The only apparent solution is killing that program, ejecting the
> > > > card from its slot and wait until 3c59x.o usage count reaches zero.
> > > >
> > > > Can someone tell me what's going on here?
> > > > Thank you very much.
> > >
> > > What protocols are you running? Is IPV6 loaded?
> >
> > I'm using IPv4, IPv6 and IPSec ESP with AES/CBC.
> > Do you want .config?
>
> Not really, could you see if it is an IPv6 vs IPSec problem by not running/loading
> one or the other.
>
> What is happening is that some subsystem is holding a reference to the device (calling dev_hold())
> but not cleaning up (calling dev_put). It can be a hard to track which of the many
> things routing, etc are not being cleared properly. Look for routes that still
> get stuck (ip route) and neighbor cache entries. Most of these end up being
> protocol bugs.

The two attached patches, one for net/ipv4/route.c, the other for net/
ipv6/route.c fix all my problems when running "cardctl eject" while a
program mantains an open network socket (ESTABLISHED).

Both patches apply cleanly against 2.6.7-rc3 and 2.6.7-rc3-mm1.
I'm not completely sure what has changed in 2.6.7-rc3 that is breaking
cardctl for me, as it Just Worked(TM) fine in 2.6.7-rc2.

Hope this can throw some light at this issue.
Thanks!

--- linux/net/ipv4/route.c 2004-06-09 16:10:40.612487739 +0200
+++ linux/net/ipv4/route.c 2004-06-09 16:47:34.927939813 +0200
@@ -1040,8 +1040,6 @@
rt->u.dst.child = NULL;
if (rt->u.dst.dev)
dev_hold(rt->u.dst.dev);
- if (rt->idev)
- in_dev_hold(rt->idev);
rt->u.dst.obsolete = 0;
rt->u.dst.lastuse = jiffies;
rt->u.dst.path = &rt->u.dst;
@@ -1496,7 +1494,6 @@
rth->fl.iif = dev->ifindex;
rth->u.dst.dev = &loopback_dev;
dev_hold(rth->u.dst.dev);
- rth->idev = in_dev_get(rth->u.dst.dev);
rth->fl.oif = 0;
rth->rt_gateway = daddr;
rth->rt_spec_dst= spec_dst;
@@ -1706,7 +1703,6 @@
rth->fl.iif = dev->ifindex;
rth->u.dst.dev = out_dev->dev;
dev_hold(rth->u.dst.dev);
- rth->idev = in_dev_get(rth->u.dst.dev);
rth->fl.oif = 0;
rth->rt_spec_dst= spec_dst;

@@ -1786,7 +1782,6 @@
rth->fl.iif = dev->ifindex;
rth->u.dst.dev = &loopback_dev;
dev_hold(rth->u.dst.dev);
- rth->idev = in_dev_get(rth->u.dst.dev);
rth->rt_gateway = daddr;
rth->rt_spec_dst= spec_dst;
rth->u.dst.input= ip_local_deliver;
@@ -2170,7 +2165,6 @@
rth->rt_iif = oldflp->oif ? : dev_out->ifindex;
rth->u.dst.dev = dev_out;
dev_hold(dev_out);
- rth->idev = in_dev_get(dev_out);
rth->rt_gateway = fl.fl4_dst;
rth->rt_spec_dst= fl.fl4_src;
--- linux/net/ipv6/route.c 2004-06-09 15:10:03.000000000 +0200
+++ linux/net/ipv6/route.c 2004-06-09 16:52:51.219867318 +0200
@@ -584,14 +584,14 @@
if (unlikely(rt == NULL))
goto out;

- dev_hold(dev);
+ if(dev)
+ dev_hold(dev);
if (neigh)
neigh_hold(neigh);
else
neigh = ndisc_get_neigh(dev, addr);

rt->rt6i_dev = dev;
- rt->rt6i_idev = in6_dev_get(dev);
rt->rt6i_nexthop = neigh;
rt->rt6i_expires = 0;
rt->rt6i_flags = RTF_LOCAL;
@@ -882,7 +882,6 @@
if (!rt->u.dst.metrics[RTAX_ADVMSS-1])
rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dst_pmtu(&rt->u.dst));
rt->u.dst.dev = dev;
- rt->rt6i_idev = in6_dev_get(dev);
return rt6_ins(rt, nlh, _rtattr);

out:
@@ -1301,7 +1300,6 @@
rt->u.dst.input = ip6_input;
rt->u.dst.output = ip6_output;
rt->rt6i_dev = &loopback_dev;
- rt->rt6i_idev = in6_dev_get(&loopback_dev);
rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev);
rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dst_pmtu(&rt->u.dst));
rt->u.dst.metrics[RTAX_HOPLIMIT-1] = ipv6_get_hoplimit(rt->rt6i_dev);
\
 
 \ /
  Last update: 2005-03-22 14:03    [W:0.119 / U:0.592 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site