Jens Axboe <axboe@xxxxxxxxx> 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@xxxxxx> > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> Reviewed-by: Jeff Moyer <jmoyer@xxxxxxxxxx> > > -- > > 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);