Skip to content

Commit

Permalink
rhashtable: use cmpxchg() to protect ->future_tbl.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
NeilBrown authored and David S. Miller committed Jun 22, 2018
1 parent 5af68ef commit 0ad6644
Showing 1 changed file with 4 additions and 11 deletions.
15 changes: 4 additions & 11 deletions lib/rhashtable.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 0ad6644

Please sign in to comment.