io_uring: fix race condition when sq threads goes sleeping
Reading the SQ tail needs to come after setting IORING_SQ_NEED_WAKEUP in flags; there is no cheap barrier for ordering a store before a load, a full memory barrier is required. Userspace needs a full memory barrier between updating SQ tail and checking for the IORING_SQ_NEED_WAKEUP too. Signed-off-by: Stefan Bühler <source@stbuehler.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
e523a29c4f
commit
0d7bae69c5
@ -1865,7 +1865,8 @@ static int io_sq_thread(void *data)
|
|||||||
|
|
||||||
/* Tell userspace we may need a wakeup call */
|
/* Tell userspace we may need a wakeup call */
|
||||||
ctx->sq_ring->flags |= IORING_SQ_NEED_WAKEUP;
|
ctx->sq_ring->flags |= IORING_SQ_NEED_WAKEUP;
|
||||||
smp_wmb();
|
/* make sure to read SQ tail after writing flags */
|
||||||
|
smp_mb();
|
||||||
|
|
||||||
if (!io_get_sqring(ctx, &sqes[0])) {
|
if (!io_get_sqring(ctx, &sqes[0])) {
|
||||||
if (kthread_should_stop()) {
|
if (kthread_should_stop()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user