It's not nice to hold @uring_lock for too long io_iopoll_reap_events(). For instance, the lock is needed to publish requests to @poll_list, and that locks out tasks doing that for no good reason. Loose it occasionally. Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> --- fs/io_uring.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/io_uring.c b/fs/io_uring.c index 020944a193d0..568e25bcadd6 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2059,11 +2059,14 @@ static void io_iopoll_reap_events(struct io_ring_ctx *ctx) io_iopoll_getevents(ctx, &nr_events, 1); + /* task_work takes the lock to publish a req to @poll_list */ + mutex_unlock(&ctx->uring_lock); /* * Ensure we allow local-to-the-cpu processing to take place, * in this case we need to ensure that we reap all events. */ cond_resched(); + mutex_lock(&ctx->uring_lock); } mutex_unlock(&ctx->uring_lock); } -- 2.24.0