• Thomas Graf's avatar
    rhashtable: Fix remove logic to avoid cross references between buckets · 020219a6
    Thomas Graf authored
    The remove logic properly searched the remaining chain for a matching
    entry with an identical hash but it did this while searching from both
    the old and new table. Instead in order to not leave stale references
    behind we need to:
    
     1. When growing and searching from the new table:
        Search remaining chain for entry with same hash to avoid having
        the new table directly point to a entry with a different hash.
    
     2. When shrinking and searching from the old table:
        Check if the element after the removed would create a cross
        reference and avoid it if so.
    
    These bugs were present from the beginning in nft_hash.
    
    Also, both insert functions calculated the hash based on the mask of
    the new table. This worked while growing. Wwhile shrinking, the mask
    of the inew table is smaller than the mask of the old table. This lead
    to a bit not being taken into account when selecting the bucket lock
    and thus caused the wrong bucket to be locked eventually.
    
    Fixes: 7e1e7763 ("lib: Resizable, Scalable, Concurrent Hash Table")
    Fixes: 97defe1e ("rhashtable: Per bucket locks & deferred expansion/shrinking")
    Reported-by: default avatarYing Xue <ying.xue@windriver.com>
    Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    020219a6
rhashtable.c 30.5 KB