diff mbox series

io_uring: make sqpoll wakeup possible with getevents

Message ID c9084c96-1771-6b7e-affb-2ac2e09e827d@kernel.dk (mailing list archive)
State New, archived
Headers show
Series io_uring: make sqpoll wakeup possible with getevents | expand

Commit Message

Jens Axboe Sept. 12, 2019, 4:08 p.m. UTC
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>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

--

Comments

Jeff Moyer Sept. 12, 2019, 8:15 p.m. UTC | #1
Jens Axboe <axboe@kernel.dk> writes:

> 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>
> Signed-off-by: Jens Axboe <axboe@kernel.dk>

Reviewed-by: Jeff Moyer <jmoyer@redhat.com>

>
> --
>
> diff --git a/fs/io_uring.c b/fs/io_uring.c
> index 4bc3ee4ea81f..3c8859d417eb 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);
diff mbox series

Patch

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 4bc3ee4ea81f..3c8859d417eb 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);