• Herbert Xu's avatar
    rhashtable: Prevent spurious EBUSY errors on insertion · 3cf92222
    Herbert Xu authored
    Thomas and Phil observed that under stress rhashtable insertion
    sometimes failed with EBUSY, even though this error should only
    ever been seen when we're under attack and our hash chain length
    has grown to an unacceptable level, even after a rehash.
    It turns out that the logic for detecting whether there is an
    existing rehash is faulty.  In particular, when two threads both
    try to grow the same table at the same time, one of them may see
    the newly grown table and thus erroneously conclude that it had
    been rehashed.  This is what leads to the EBUSY error.
    This patch fixes this by remembering the current last table we
    used during insertion so that rhashtable_insert_rehash can detect
    when another thread has also done a resize/rehash.  When this is
    detected we will give up our resize/rehash and simply retry the
    insertion with the new table.
    Reported-by: default avatarThomas Graf <tgraf@suug.ch>
    Reported-by: default avatarPhil Sutter <phil@nwl.cc>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    Tested-by: default avatarPhil Sutter <phil@nwl.cc>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
rhashtable.c 20.6 KB