Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9497df88 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller
Browse files

rhashtable: Fix reader/rehash race



There is a potential race condition between readers and the rehasher.
In particular, the rehasher could have started a rehash while the
reader finishes a scan of the old table but fails to see the new
table pointer.

This patch closes this window by adding smp_wmb/smp_rmb.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5ff0d16a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -271,6 +271,9 @@ static void rhashtable_rehash(struct rhashtable *ht,
	 */
	rcu_assign_pointer(ht->future_tbl, new_tbl);

	/* Ensure the new table is visible to readers. */
	smp_wmb();

	for (old_hash = 0; old_hash < old_tbl->size; old_hash++)
		rhashtable_rehash_chain(ht, old_hash);

@@ -618,6 +621,9 @@ void *rhashtable_lookup_compare(struct rhashtable *ht, const void *key,
		return rht_obj(ht, he);
	}

	/* Ensure we see any new tables. */
	smp_rmb();

	old_tbl = tbl;
	tbl = rht_dereference_rcu(ht->future_tbl, ht);
	if (unlikely(tbl != old_tbl))