From: Stefan Bühler Date: Fri, 19 Apr 2019 09:57:45 +0000 (+0200) Subject: io_uring: fix race condition when sq threads goes sleeping X-Git-Tag: v5.1-rc7~3^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0d7bae69c574c5f25802f8a71252e7d66933a3ab;p=thirdparty%2Flinux.git 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 Signed-off-by: Jens Axboe --- diff --git a/fs/io_uring.c b/fs/io_uring.c index 41e3a6f6a096a..69910fd9ccca0 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1865,7 +1865,8 @@ static int io_sq_thread(void *data) /* Tell userspace we may need a wakeup call */ 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 (kthread_should_stop()) {