• Herbert Xu's avatar
    [NET]: Add reference counting to neigh_parms. · 10bc9563
    Herbert Xu authored
    I've added a refcnt on neigh_parms as well as a dead flag.  The latter
    is checked under the tbl_lock before adding a neigh entry to the hash
    table.
    
    The non-trivial bit of the patch is the first chunk of net/core/neighbour.c.
    I removed that line because not doing so would mean that I have to drop
    the reference to the parms right there.  That would've lead to race
    conditions since many places dereference neigh->parms without holding
    locks.  It's also unnecessary to reset n->parms since we're no longer
    in a hurry to see it go due to the new ref counting.
    
    You'll also notice that I've put all dereferences of dev->*_ptr under
    the rcu_read_lock().  Without this we may get a neigh_parms that's
    already been released.
    
    Incidentally a lot of these places were racy even before the RCU change.
    For example, in the IPv6 case neigh->parms may be set to a value that's
    just been released.
    
    Finally in order to make sure that all stale entries are purged as
    quickly as possible I've added neigh_ifdown/arp_ifdown calls after
    every neigh_parms_release call.  In many cases we now have multiple
    calls to neigh_ifdown in the shutdown path.  I didn't remove the
    earlier calls because there may be hidden dependencies for them to
    be there.  Once the respective maintainers have looked at them we
    can probably remove most of them.
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    10bc9563
neighbour.c 41 KB