io_uring: optimise io_dismantle_req() fast path
authorPavel Begunkov <asml.silence@gmail.com>
Fri, 19 Mar 2021 17:22:42 +0000 (17:22 +0000)
committerJens Axboe <axboe@kernel.dk>
Sun, 11 Apr 2021 23:41:59 +0000 (17:41 -0600)
Reshuffle io_dismantle_req() checks to put most of slow path stuff under
a single if.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 00860dc..8522475 100644 (file)
@@ -1705,28 +1705,32 @@ static inline void io_put_file(struct io_kiocb *req, struct file *file,
 
 static void io_dismantle_req(struct io_kiocb *req)
 {
-       if (req->flags & (REQ_F_NEED_CLEANUP | REQ_F_BUFFER_SELECTED))
-               io_clean_op(req);
-       if (req->async_data)
-               kfree(req->async_data);
+       unsigned int flags = req->flags;
+
        if (req->file)
-               io_put_file(req, req->file, (req->flags & REQ_F_FIXED_FILE));
+               io_put_file(req, req->file, (flags & REQ_F_FIXED_FILE));
+       if (flags & (REQ_F_NEED_CLEANUP | REQ_F_BUFFER_SELECTED |
+                    REQ_F_INFLIGHT)) {
+               io_clean_op(req);
+
+               if (req->flags & REQ_F_INFLIGHT) {
+                       struct io_ring_ctx *ctx = req->ctx;
+                       unsigned long flags;
+
+                       spin_lock_irqsave(&ctx->inflight_lock, flags);
+                       list_del(&req->inflight_entry);
+                       spin_unlock_irqrestore(&ctx->inflight_lock, flags);
+                       req->flags &= ~REQ_F_INFLIGHT;
+               }
+       }
        if (req->fixed_rsrc_refs)
                percpu_ref_put(req->fixed_rsrc_refs);
+       if (req->async_data)
+               kfree(req->async_data);
        if (req->work.creds) {
                put_cred(req->work.creds);
                req->work.creds = NULL;
        }
-
-       if (req->flags & REQ_F_INFLIGHT) {
-               struct io_ring_ctx *ctx = req->ctx;
-               unsigned long flags;
-
-               spin_lock_irqsave(&ctx->inflight_lock, flags);
-               list_del(&req->inflight_entry);
-               spin_unlock_irqrestore(&ctx->inflight_lock, flags);
-               req->flags &= ~REQ_F_INFLIGHT;
-       }
 }
 
 /* must to be called somewhat shortly after putting a request */