io_uring/kbuf: introduce io_kbuf_drop_legacy()
authorPavel Begunkov <asml.silence@gmail.com>
Wed, 5 Feb 2025 11:36:48 +0000 (11:36 +0000)
committerJens Axboe <axboe@kernel.dk>
Mon, 17 Feb 2025 12:34:45 +0000 (05:34 -0700)
io_kbuf_drop() is only used for legacy provided buffers, and so
__io_put_kbuf_list() is never called for REQ_F_BUFFER_RING. Remove the
dead branch out of __io_put_kbuf_list(), rename it into
io_kbuf_drop_legacy() and use it directly instead of io_kbuf_drop().

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/c8cc73e2272f09a86ecbdad9ebdd8304f8e583c0.1738724373.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c
io_uring/kbuf.c
io_uring/kbuf.h

index 969caac..ec98a0e 100644 (file)
@@ -397,7 +397,7 @@ static bool req_need_defer(struct io_kiocb *req, u32 seq)
 static void io_clean_op(struct io_kiocb *req)
 {
        if (unlikely(req->flags & REQ_F_BUFFER_SELECTED))
-               io_kbuf_drop(req);
+               io_kbuf_drop_legacy(req);
 
        if (req->flags & REQ_F_NEED_CLEANUP) {
                const struct io_cold_def *def = &io_cold_defs[req->opcode];
index d612e4c..815fb58 100644 (file)
@@ -50,6 +50,16 @@ static int io_buffer_add_list(struct io_ring_ctx *ctx,
        return xa_err(xa_store(&ctx->io_bl_xa, bgid, bl, GFP_KERNEL));
 }
 
+void io_kbuf_drop_legacy(struct io_kiocb *req)
+{
+       if (WARN_ON_ONCE(!(req->flags & REQ_F_BUFFER_SELECTED)))
+               return;
+       req->buf_index = req->kbuf->bgid;
+       req->flags &= ~REQ_F_BUFFER_SELECTED;
+       kfree(req->kbuf);
+       req->kbuf = NULL;
+}
+
 bool io_kbuf_recycle_legacy(struct io_kiocb *req, unsigned issue_flags)
 {
        struct io_ring_ctx *ctx = req->ctx;
index 055b7a6..3e18c91 100644 (file)
@@ -75,6 +75,7 @@ int io_unregister_pbuf_ring(struct io_ring_ctx *ctx, void __user *arg);
 int io_register_pbuf_status(struct io_ring_ctx *ctx, void __user *arg);
 
 bool io_kbuf_recycle_legacy(struct io_kiocb *req, unsigned issue_flags);
+void io_kbuf_drop_legacy(struct io_kiocb *req);
 
 struct io_mapped_region *io_pbuf_get_region(struct io_ring_ctx *ctx,
                                            unsigned int bgid);
@@ -158,27 +159,6 @@ static inline bool __io_put_kbuf_ring(struct io_kiocb *req, int len, int nr)
        return ret;
 }
 
-static inline void __io_put_kbuf_list(struct io_kiocb *req, int len)
-{
-       if (req->flags & REQ_F_BUFFER_RING) {
-               __io_put_kbuf_ring(req, len, 1);
-       } else {
-               req->buf_index = req->kbuf->bgid;
-               req->flags &= ~REQ_F_BUFFER_SELECTED;
-               kfree(req->kbuf);
-               req->kbuf = NULL;
-       }
-}
-
-static inline void io_kbuf_drop(struct io_kiocb *req)
-{
-       if (!(req->flags & (REQ_F_BUFFER_SELECTED|REQ_F_BUFFER_RING)))
-               return;
-
-       /* len == 0 is fine here, non-ring will always drop all of it */
-       __io_put_kbuf_list(req, 0);
-}
-
 static inline unsigned int __io_put_kbufs(struct io_kiocb *req, int len,
                                          int nbufs, unsigned issue_flags)
 {
@@ -192,7 +172,7 @@ static inline unsigned int __io_put_kbufs(struct io_kiocb *req, int len,
                if (!__io_put_kbuf_ring(req, len, nbufs))
                        ret |= IORING_CQE_F_BUF_MORE;
        } else {
-               __io_put_kbuf_list(req, len);
+               io_kbuf_drop_legacy(req);
        }
        return ret;
 }