• Eric Dumazet's avatar
    neigh: speedup neigh_hh_init() · 34d101dd
    Eric Dumazet authored
    When a new dst is used to send a frame, neigh_resolve_output() tries to
    associate an struct hh_cache to this dst, calling neigh_hh_init() with
    the neigh rwlock write locked.
    
    Most of the time, hh_cache is already known and linked into neighbour,
    so we find it and increment its refcount.
    
    This patch changes the logic so that we call neigh_hh_init() with
    neighbour lock read locked only, so that fast path can be run in
    parallel by concurrent cpus.
    
    This brings part of the speedup we got with commit c7d4426a
    (introduce DST_NOCACHE flag) for non cached dsts, even for cached ones,
    removing one of the contention point that routers hit on multiqueue
    enabled machines.
    
    Further improvements would need to use a seqlock instead of an rwlock to
    protect neigh->ha[], to not dirty neigh too often and remove two atomic
    ops.
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    34d101dd
netdevice.h 73.1 KB