• David S. Miller's avatar
    [XFRM]: Kill excessive refcounting of xfrm_state objects. · a47f0ce0
    David S. Miller authored
    The refcounting done for timers and hash table insertions
    are just wasted cycles.  We can eliminate all of this
    refcounting because:
    
    1) The implicit refcount when the xfrm_state object is active
       will always be held while the object is in the hash tables.
       We never kfree() the xfrm_state until long after we've made
       sure that it has been unhashed.
    
    2) Timers are even easier.  Once we mark that x->km.state as
       anything other than XFRM_STATE_VALID (__xfrm_state_delete
       sets it to XFRM_STATE_DEAD), any timer that fires will
       do nothing and return without rearming the timer.
    
       Therefore we can defer the del_timer calls until when the
       object is about to be freed up during GC.  We have to use
       del_timer_sync() and defer it to GC because we can't do
       a del_timer_sync() while holding x->lock which all callers
       of __xfrm_state_delete hold.
    
    This makes SA changes even more light-weight.
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a47f0ce0
xfrm_state.c 37.5 KB