]> www.infradead.org Git - users/hch/misc.git/commitdiff
io_uring: add io_submit_fail_link() helper
authorMing Lei <ming.lei@redhat.com>
Fri, 25 Oct 2024 12:22:39 +0000 (20:22 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 7 Nov 2024 22:24:33 +0000 (15:24 -0700)
Add io_submit_fail_link() helper and put linking fail logic into this
helper.

This way simplifies io_submit_fail_init(), and becomes easier to add
sqe group failing logic.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20241025122247.3709133-3-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index 24495ddfe4832f9ed310d6385dc02f592da41c25..3d19023e5d9d8c7c02a7cbbb5f418d6c459a3b9a 100644 (file)
@@ -2093,22 +2093,17 @@ static int io_init_req(struct io_ring_ctx *ctx, struct io_kiocb *req,
        return def->prep(req, sqe);
 }
 
-static __cold int io_submit_fail_init(const struct io_uring_sqe *sqe,
+static __cold int io_submit_fail_link(struct io_submit_link *link,
                                      struct io_kiocb *req, int ret)
 {
-       struct io_ring_ctx *ctx = req->ctx;
-       struct io_submit_link *link = &ctx->submit_state.link;
        struct io_kiocb *head = link->head;
 
-       trace_io_uring_req_failed(sqe, req, ret);
-
        /*
         * Avoid breaking links in the middle as it renders links with SQPOLL
         * unusable. Instead of failing eagerly, continue assembling the link if
         * applicable and mark the head with REQ_F_FAIL. The link flushing code
         * should find the flag and handle the rest.
         */
-       req_fail_link_node(req, ret);
        if (head && !(head->flags & REQ_F_FAIL))
                req_fail_link_node(head, -ECANCELED);
 
@@ -2127,9 +2122,24 @@ static __cold int io_submit_fail_init(const struct io_uring_sqe *sqe,
        else
                link->head = req;
        link->last = req;
+
        return 0;
 }
 
+static __cold int io_submit_fail_init(const struct io_uring_sqe *sqe,
+                                     struct io_kiocb *req, int ret)
+{
+       struct io_ring_ctx *ctx = req->ctx;
+       struct io_submit_link *link = &ctx->submit_state.link;
+
+       trace_io_uring_req_failed(sqe, req, ret);
+
+       req_fail_link_node(req, ret);
+
+       /* cover both linked and non-linked request */
+       return io_submit_fail_link(link, req, ret);
+}
+
 /*
  * Return NULL if nothing to be queued, otherwise return request for queueing */
 static struct io_kiocb *io_link_sqe(struct io_submit_link *link,