diff options
author | Stefan Bühler <source@stbuehler.de> | 2019-04-19 11:57:45 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-04-22 11:00:56 -0600 |
commit | 0d7bae69c574c5f25802f8a71252e7d66933a3ab (patch) | |
tree | 9c6bd0dd0456a51080c7ed95350768452385aecb /fs/io_uring.c | |
parent | e523a29c4f2703bdb98f68ce1bb256e259fd8d5f (diff) | |
download | lwn-0d7bae69c574c5f25802f8a71252e7d66933a3ab.tar.gz lwn-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/io_uring.c')
-rw-r--r-- | fs/io_uring.c | 3 |
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()) { |