If work completes inline, then we should pick up a dependent link item in __io_queue_sqe() as well. If we don't do so, we're forced to go async with that item, which is suboptimal. Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> --- diff --git a/fs/io_uring.c b/fs/io_uring.c index ffd9bfa84d86..160cf1b0f478 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -4531,8 +4531,15 @@ static void io_wq_submit_work(struct io_wq_work **workptr) } while (1); } - /* drop submission reference */ - io_put_req(req); + /* + * Drop submission reference. In case the handler already dropped the + * completion reference, then it didn't pick up any potential link + * work. If 'nxt' isn't set, try and do that here. + */ + if (nxt) + io_put_req(req); + else + io_put_req_find_next(req, &nxt); if (ret) { req_set_fail_links(req); -- Jens Axboe