@@ -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);
}
@@ -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;
Committing the selected ring buffer is currently done in two different spots, combine it into a helper and just call that. Signed-off-by: Jens Axboe <axboe@kernel.dk> --- io_uring/kbuf.c | 3 +-- io_uring/kbuf.h | 14 ++++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-)