• N
    rhashtable: detect when object movement between tables might have invalidated a lookup · 82208d0d
    NeilBrown 提交于
    Some users of rhashtables might need to move an object from one table
    to another -  this appears to be the reason for the incomplete usage
    of NULLS markers.
    
    To support these, we store a unique NULLS_MARKER at the end of
    each chain, and when a search fails to find a match, we check
    if the NULLS marker found was the expected one.  If not, the search
    may not have examined all objects in the target bucket, so it is
    repeated.
    
    The unique NULLS_MARKER is derived from the address of the
    head of the chain.  As this cannot be derived at load-time the
    static rhnull in rht_bucket_nested() needs to be initialised
    at run time.
    
    Any caller of a lookup function must still be prepared for the
    possibility that the object returned is in a different table - it
    might have been there for some time.
    
    Note that this does NOT provide support for other uses of
    NULLS_MARKERs such as allocating with SLAB_TYPESAFE_BY_RCU or changing
    the key of an object and re-inserting it in the same table.
    These could only be done safely if new objects were inserted
    at the *start* of a hash chain, and that is not currently the case.
    Signed-off-by: NNeilBrown <neilb@suse.com>
    Acked-by: NHerbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    82208d0d
rhashtable.c 29.4 KB