io_uring: make sqpoll wakeup possible with getevents
authorJens Axboe <axboe@kernel.dk>
Thu, 12 Sep 2019 20:19:16 +0000 (14:19 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 12 Sep 2019 20:19:16 +0000 (14:19 -0600)
The way the logic is setup in io_uring_enter() means that you can't wake
up the SQ poller thread while at the same time waiting (or polling) for
completions afterwards. There's no reason for that to be the case.

Reported-by: Lewis Baker <lbaker@fb.com>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 4bc3ee4ea81ffd815c1dac521a2866a64fc0bf24..3c8859d417eb56a0c76e41115ef6fe3b6a77d71d 100644 (file)
@@ -3356,15 +3356,12 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
         * Just return the requested submit count, and wake the thread if
         * we were asked to.
         */
+       ret = 0;
        if (ctx->flags & IORING_SETUP_SQPOLL) {
                if (flags & IORING_ENTER_SQ_WAKEUP)
                        wake_up(&ctx->sqo_wait);
                submitted = to_submit;
-               goto out_ctx;
-       }
-
-       ret = 0;
-       if (to_submit) {
+       } else if (to_submit) {
                bool block_for_last = false;
 
                to_submit = min(to_submit, ctx->sq_entries);
@@ -3394,7 +3391,6 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
                }
        }
 
-out_ctx:
        io_ring_drop_ctx_refs(ctx, 1);
 out_fput:
        fdput(f);