• Alexander Duyck's avatar
    fib_trie: Fix RCU bug and merge similar bits of inflate/halve · 69fa57b1
    Alexander Duyck authored
    This patch addresses two issues.
    
    The first issue is the fact that I believe I had the RCU freeing sequence
    slightly out of order.  As a result we could get into an issue if a caller
    went into a child of a child of the new node, then backtraced into the to be
    freed parent, and then attempted to access a child of a child that may have
    been consumed in a resize of one of the new nodes children.  To resolve this I
    have moved the resize after we have freed the oldtnode.  The only side effect
    of this is that we will now be calling resize on more nodes in the case of
    inflate due to the fact that we don't have a good way to test to see if a
    full_tnode on the new node was there before or after the allocation.  This
    should have minimal impact however since the node should already be
    correctly size so it is just the cost of calling should_inflate that we
    will be taking on the node which is only a couple of cycles.
    
    The second issue is the fact that inflate and halve were essentially doing
    the same thing after the new node was added to the trie replacing the old
    one.  As such it wasn't really necessary to keep the code in both functions
    so I have split it out into two other functions, called replace and
    update_children.
    Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    69fa57b1
fib_trie.c 58.7 KB