rhashtable: use cmpxchg() to protect ->future_tbl.
Rather than borrowing one of the bucket locks to protect ->future_tbl updates, use cmpxchg(). This gives more freedom to change how bucket locking is implemented. Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
5af68ef733
commit
0ad66449aa
@@ -297,21 +297,14 @@ static int rhashtable_rehash_attach(struct rhashtable *ht,
|
|||||||
struct bucket_table *old_tbl,
|
struct bucket_table *old_tbl,
|
||||||
struct bucket_table *new_tbl)
|
struct bucket_table *new_tbl)
|
||||||
{
|
{
|
||||||
/* Protect future_tbl using the first bucket lock. */
|
|
||||||
spin_lock_bh(old_tbl->locks);
|
|
||||||
|
|
||||||
/* Did somebody beat us to it? */
|
|
||||||
if (rcu_access_pointer(old_tbl->future_tbl)) {
|
|
||||||
spin_unlock_bh(old_tbl->locks);
|
|
||||||
return -EEXIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make insertions go into the new, empty table right away. Deletions
|
/* Make insertions go into the new, empty table right away. Deletions
|
||||||
* and lookups will be attempted in both tables until we synchronize.
|
* and lookups will be attempted in both tables until we synchronize.
|
||||||
|
* As cmpxchg() provides strong barriers, we do not need
|
||||||
|
* rcu_assign_pointer().
|
||||||
*/
|
*/
|
||||||
rcu_assign_pointer(old_tbl->future_tbl, new_tbl);
|
|
||||||
|
|
||||||
spin_unlock_bh(old_tbl->locks);
|
if (cmpxchg(&old_tbl->future_tbl, NULL, new_tbl) != NULL)
|
||||||
|
return -EEXIST;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user