Messages in this thread | | | Date | Sun, 6 Feb 2005 17:51:17 +1100 | Subject | Re: PROBLEM: 2.6.11-rc2 hangs on bridge shutdown (br0) | From | Herbert Xu <> |
| |
On Sat, Feb 05, 2005 at 08:10:44PM -0800, David S. Miller wrote: > > > Alternatively we can > > remove the dst->dev == dev check in dst_dev_event and dst_ifdown > > and move that test down to the individual ifdown functions. > > I think there is a hole in this idea.... maybe. > > If the idea is to scan dst_garbage_list down in ipv6 specific code, > you can't do that since 'dst' objects from every pool in the kernel > get put onto the dst_garbage_list. It is generic.
The idea is to move the check into dst->ops->ifdown. By definition ipv6_dst_ifdown will only see rt6_info entries. So dst_dev_event will become
for (dst = dst_garbage_list; dst; dst = dst->next) { dst_ifdown(dst, event != NETDEV_DOWN); }
dst_ifdown will become
...
do { if (dst->dev == dev && unregister) { ... }
dst->ops->ifdown(dst, dev, unregister); } while ((dst = dst->child) && dst->flags & DST_NOHASH);
...
Note the extra dev argument to ifdown. ipv6_dst_ifdown will be
static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, int how) { struct rt6_info *rt = (struct rt6_info *)dst; struct inet6_dev *idev = rt->rt6i_idev;
if (idev != NULL && idev->dev != &loopback_dev && idev->dev == dev) { struct inet6_dev *loopback_idev = in6_dev_get(&loopback_dev); if (loopback_idev != NULL) { rt->rt6i_idev = loopback_idev; in6_dev_put(idev); } } }
Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |