io_uring/kbuf: add io_kbuf_commit() helper
authorJens Axboe <axboe@kernel.dk>
Mon, 12 Aug 2024 15:18:35 +0000 (09:18 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 29 Aug 2024 14:44:38 +0000 (08:44 -0600)
Committing the selected ring buffer is currently done in three different
spots, combine it into a helper and just call that.

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

index a4bde99..c69f698 100644 (file)
@@ -171,9 +171,8 @@ static void __user *io_ring_buffer_select(struct io_kiocb *req, size_t *len,
                 * the transfer completes (or if we get -EAGAIN and must poll of
                 * retry).
                 */
-               req->flags &= ~REQ_F_BUFFERS_COMMIT;
+               io_kbuf_commit(req, bl, 1);
                req->buf_list = NULL;
-               bl->head++;
        }
        return u64_to_user_ptr(buf->addr);
 }
@@ -297,8 +296,8 @@ int io_buffers_select(struct io_kiocb *req, struct buf_sel_arg *arg,
                 * committed them, they cannot be put back in the queue.
                 */
                if (ret > 0) {
-                       req->flags |= REQ_F_BL_NO_RECYCLE;
-                       bl->head += ret;
+                       req->flags |= REQ_F_BUFFERS_COMMIT | REQ_F_BL_NO_RECYCLE;
+                       io_kbuf_commit(req, bl, ret);
                }
        } else {
                ret = io_provided_buffers_select(req, &arg->out_len, bl, arg->iovs);
index ab30aa1..43c7b18 100644 (file)
@@ -121,15 +121,21 @@ static inline bool io_kbuf_recycle(struct io_kiocb *req, unsigned issue_flags)
        return false;
 }
 
+static inline void io_kbuf_commit(struct io_kiocb *req,
+                                 struct io_buffer_list *bl, int nr)
+{
+       if (unlikely(!(req->flags & REQ_F_BUFFERS_COMMIT)))
+               return;
+       bl->head += nr;
+       req->flags &= ~REQ_F_BUFFERS_COMMIT;
+}
+
 static inline void __io_put_kbuf_ring(struct io_kiocb *req, int nr)
 {
        struct io_buffer_list *bl = req->buf_list;
 
        if (bl) {
-               if (req->flags & REQ_F_BUFFERS_COMMIT) {
-                       bl->head += nr;
-                       req->flags &= ~REQ_F_BUFFERS_COMMIT;
-               }
+               io_kbuf_commit(req, bl, nr);
                req->buf_index = bl->bgid;
        }
        req->flags &= ~REQ_F_BUFFER_RING;