mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
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:
parent
5af68ef733
commit
0ad66449aa
@ -297,21 +297,14 @@ static int rhashtable_rehash_attach(struct rhashtable *ht,
|
||||
struct bucket_table *old_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
|
||||
* 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user