Commit ecd5c9b2 authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring/kbuf: add io_kbuf_commit() helper



Committing the selected ring buffer is currently done in three different
spots, combine it into a helper and just call that.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 12044332
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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);
+10 −4
Original line number Diff line number Diff line
@@ -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;