提交 f66227de 编写于 作者: O Omar Sandoval 提交者: Jens Axboe

sbitmap: use smp_mb__after_atomic() in sbq_wake_up()

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: NOmar Sandoval <osandov@fb.com>
Signed-off-by: NJens Axboe <axboe@fb.com>
上级 4d199c6f
...@@ -299,8 +299,14 @@ static void sbq_wake_up(struct sbitmap_queue *sbq) ...@@ -299,8 +299,14 @@ static void sbq_wake_up(struct sbitmap_queue *sbq)
struct sbq_wait_state *ws; struct sbq_wait_state *ws;
int wait_cnt; 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); ws = sbq_wake_ptr(sbq);
if (!ws) if (!ws)
...@@ -331,7 +337,8 @@ void sbitmap_queue_wake_all(struct sbitmap_queue *sbq) ...@@ -331,7 +337,8 @@ void sbitmap_queue_wake_all(struct sbitmap_queue *sbq)
int i, wake_index; 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(); smp_mb();
wake_index = atomic_read(&sbq->wake_index); wake_index = atomic_read(&sbq->wake_index);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册