io_uring/uring_cmd: take advantage of completion batching
authorJens Axboe <axboe@kernel.dk>
Wed, 12 Apr 2023 18:07:36 +0000 (12:07 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 12 Apr 2023 18:07:36 +0000 (12:07 -0600)
We know now what the completion context is for the uring_cmd completion
handling, so use that to have io_req_task_complete() decide what the
best way to complete the request is. This allows batching of the posted
completions if we have multiple pending, rather than always doing them
one-by-one.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/uring_cmd.c

index f7a96bc76ea13625b9b956f02ebb71f1ef3cfed3..5113c9a48583bfa43a4698a988724d081f5349e7 100644 (file)
@@ -54,11 +54,15 @@ void io_uring_cmd_done(struct io_uring_cmd *ioucmd, ssize_t ret, ssize_t res2,
        io_req_set_res(req, ret, 0);
        if (req->ctx->flags & IORING_SETUP_CQE32)
                io_req_set_cqe32_extra(req, res2, 0);
-       if (req->ctx->flags & IORING_SETUP_IOPOLL)
+       if (req->ctx->flags & IORING_SETUP_IOPOLL) {
                /* order with io_iopoll_req_issued() checking ->iopoll_complete */
                smp_store_release(&req->iopoll_completed, 1);
-       else
-               io_req_complete_post(req, issue_flags);
+       } else {
+               struct io_tw_state ts = {
+                       .locked = !(issue_flags & IO_URING_F_UNLOCKED),
+               };
+               io_req_task_complete(req, &ts);
+       }
 }
 EXPORT_SYMBOL_GPL(io_uring_cmd_done);