io_uring: limit {io|sq}poll submit locking scope
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 17 Dec 2020 00:24:39 +0000 (00:24 +0000)
committerJens Axboe <axboe@kernel.dk>
Thu, 17 Dec 2020 15:40:52 +0000 (08:40 -0700)
We don't need to take uring_lock for SQPOLL|IOPOLL to do
io_cqring_overflow_flush() when cq_overflow_list is empty, remove it
from the hot path.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 5c9aa8b..8cf6f22 100644 (file)
@@ -9154,10 +9154,13 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
         */
        ret = 0;
        if (ctx->flags & IORING_SETUP_SQPOLL) {
-               io_ring_submit_lock(ctx, (ctx->flags & IORING_SETUP_IOPOLL));
-               if (!list_empty_careful(&ctx->cq_overflow_list))
+               if (!list_empty_careful(&ctx->cq_overflow_list)) {
+                       bool needs_lock = ctx->flags & IORING_SETUP_IOPOLL;
+
+                       io_ring_submit_lock(ctx, needs_lock);
                        io_cqring_overflow_flush(ctx, false, NULL, NULL);
-               io_ring_submit_unlock(ctx, (ctx->flags & IORING_SETUP_IOPOLL));
+                       io_ring_submit_unlock(ctx, needs_lock);
+               }
                if (flags & IORING_ENTER_SQ_WAKEUP)
                        wake_up(&ctx->sq_data->wait);
                if (flags & IORING_ENTER_SQ_WAIT)