• Eric Dumazet's avatar
    inetpeer: seqlock optimization · 65e8354e
    Eric Dumazet authored
    David noticed :
    
    ------------------
    Eric, I was profiling the non-routing-cache case and something that
    stuck out is the case of calling inet_getpeer() with create==0.
    
    If an entry is not found, we have to redo the lookup under a spinlock
    to make certain that a concurrent writer rebalancing the tree does
    not "hide" an existing entry from us.
    
    This makes the case of a create==0 lookup for a not-present entry
    really expensive.  It is on the order of 600 cpu cycles on my
    Niagara2.
    
    I added a hack to not do the relookup under the lock when create==0
    and it now costs less than 300 cycles.
    
    This is now a pretty common operation with the way we handle COW'd
    metrics, so I think it's definitely worth optimizing.
    -----------------
    
    One solution is to use a seqlock instead of a spinlock to protect struct
    inet_peer_base.
    
    After a failed avl tree lookup, we can easily detect if a writer did
    some changes during our lookup. Taking the lock and redo the lookup is
    only necessary in this case.
    
    Note: Add one private rcu_deref_locked() macro to place in one spot the
    access to spinlock included in seqlock.
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    65e8354e
inetpeer.c 19.1 KB