Skip to content

Commit

Permalink
sbitmap: use smp_mb__after_atomic() in sbq_wake_up()
Browse files Browse the repository at this point in the history
We always do an atomic clear_bit() right before we call sbq_wake_up(),
so we can use smp_mb__after_atomic(). While we're here, comment the
memory barriers in here a little more.

Signed-off-by: Omar Sandoval <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
osandov authored and axboe committed Jan 18, 2017
1 parent 4d199c6 commit f66227d
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions lib/sbitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,8 +299,14 @@ static void sbq_wake_up(struct sbitmap_queue *sbq)
struct sbq_wait_state *ws;
int wait_cnt;

/* Ensure that the wait list checks occur after clear_bit(). */
smp_mb();
/*
* Pairs with the memory barrier in set_current_state() to ensure the
* proper ordering of clear_bit()/waitqueue_active() in the waker and
* test_and_set_bit()/prepare_to_wait()/finish_wait() in the waiter. See
* the comment on waitqueue_active(). This is __after_atomic because we
* just did clear_bit() in the caller.
*/
smp_mb__after_atomic();

ws = sbq_wake_ptr(sbq);
if (!ws)
Expand Down Expand Up @@ -331,7 +337,8 @@ void sbitmap_queue_wake_all(struct sbitmap_queue *sbq)
int i, wake_index;

/*
* Make sure all changes prior to this are visible from other CPUs.
* Pairs with the memory barrier in set_current_state() like in
* sbq_wake_up().
*/
smp_mb();
wake_index = atomic_read(&sbq->wake_index);
Expand Down

0 comments on commit f66227d

Please sign in to comment.