netdev
[Top] [All Lists]

Re: PROBLEM: 2.6.11-rc2 hangs on bridge shutdown (br0)

To: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Subject: Re: PROBLEM: 2.6.11-rc2 hangs on bridge shutdown (br0)
From: "David S. Miller" <davem@xxxxxxxxxxxxx>
Date: Fri, 4 Feb 2005 21:38:13 -0800
Cc: mirko.parthey@xxxxxxxxxxxxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, netdev@xxxxxxxxxxx, yoshfuji@xxxxxxxxxxxxxx, shemminger@xxxxxxxx
In-reply-to: <20050205052407.GA17266@gondor.apana.org.au>
References: <20050131162201.GA1000@stilzchen.informatik.tu-chemnitz.de> <20050205052407.GA17266@gondor.apana.org.au>
Sender: netdev-bounce@xxxxxxxxxxx
On Sat, 5 Feb 2005 16:24:07 +1100
Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> wrote:

> This is the key to the problem.
 ...
> All of these bugs stem from the idev reference held in rtable/rt6_info.
 ...
> Anyway, this particular problem is due to IPv6 adding local addresses
> with split devices.  That is, routes to local addresses are added with
> rt6i_dev set to &loopback_dev and rt6i_idev set to the idev of the
> device where the address is added.
 ...
> It also goes against the Linux philosophy where the addresses are owned
> by the host, not the interface.
> 
> Therefore I propose the simple solution of not doing the split device
> accounting in rt6_info.

I agree with your analysis, however... this change is not sufficient.
You have to then walk over all the uses of rt6i_dev and sanitize the
cases that still expect the split semantics.  For example, things like
this piece of coe in rt6_device_match():

                        if (dev->flags & IFF_LOOPBACK) {
                                if (sprt->rt6i_idev == NULL ||
                                    sprt->rt6i_idev->dev->ifindex != oif) {
                                        if (strict && oif)
                                                continue;
                                        if (local && (!oif || 
                                                      
local->rt6i_idev->dev->ifindex == oif))
                                                continue;
                                }
                                local = sprt;
                        }

It is just the first such thing I found, scanning rt6i_idev uses
will easily find several others.

<Prev in Thread] Current Thread [Next in Thread>