From: Jens Axboe Date: Thu, 12 Sep 2019 20:19:16 +0000 (-0600) Subject: io_uring: make sqpoll wakeup possible with getevents X-Git-Tag: v5.4-rc1~150^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b2a9eadab85730935f5a6fe19f3f61faaaced601;p=thirdparty%2Fkernel%2Flinux.git io_uring: make sqpoll wakeup possible with getevents 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 Reviewed-by: Jeff Moyer Signed-off-by: Jens Axboe --- diff --git a/fs/io_uring.c b/fs/io_uring.c index 4bc3ee4ea81ff..3c8859d417eb5 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -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);