summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorStefan Bühler <source@stbuehler.de>2019-04-19 11:57:45 +0200
committerJens Axboe <axboe@kernel.dk>2019-04-22 19:00:56 +0200
commit0d7bae69c574c5f25802f8a71252e7d66933a3ab (patch)
tree9c6bd0dd0456a51080c7ed95350768452385aecb /fs
parentio_uring: fix race condition reading SQ entries (diff)
downloadlinux-0d7bae69c574c5f25802f8a71252e7d66933a3ab.tar.xz
linux-0d7bae69c574c5f25802f8a71252e7d66933a3ab.zip
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/io_uring.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 41e3a6f6a096..69910fd9ccca 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()) {