Commit 73b6dacb authored by Caleb Sander Mateos's avatar Caleb Sander Mateos Committed by Jens Axboe
Browse files

io_uring/net: use REQ_F_IMPORT_BUFFER for send_zc



Instead of a bool field in struct io_sr_msg, use REQ_F_IMPORT_BUFFER to
track whether io_send_zc() has already imported the buffer. This flag
already serves a similar purpose for sendmsg_zc and {read,write}v_fixed.

Signed-off-by: default avatarCaleb Sander Mateos <csander@purestorage.com>
Suggested-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Reviewed-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/20250325143943.1226467-1-csander@purestorage.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 81661978
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -585,7 +585,10 @@ enum {
	REQ_F_BUF_NODE		= IO_REQ_FLAG(REQ_F_BUF_NODE_BIT),
	/* request has read/write metadata assigned */
	REQ_F_HAS_METADATA	= IO_REQ_FLAG(REQ_F_HAS_METADATA_BIT),
	/* resolve padded iovec to registered buffers */
	/*
	 * For vectored fixed buffers, resolve iovec to registered buffers.
	 * For SEND_ZC, whether to import buffers (i.e. the first issue).
	 */
	REQ_F_IMPORT_BUFFER	= IO_REQ_FLAG(REQ_F_IMPORT_BUFFER_BIT),
};

+5 −5
Original line number Diff line number Diff line
@@ -77,7 +77,6 @@ struct io_sr_msg {
	/* initialised and used only by !msg send variants */
	u16				buf_group;
	bool				retry;
	bool				imported; /* only for io_send_zc */
	void __user			*msg_control;
	/* used only for send zerocopy */
	struct io_kiocb 		*notif;
@@ -1307,7 +1306,6 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

	zc->done_io = 0;
	zc->retry = false;
	zc->imported = false;
	req->flags |= REQ_F_POLL_NO_LAZY;

	if (unlikely(READ_ONCE(sqe->__pad2[0]) || READ_ONCE(sqe->addr3)))
@@ -1353,8 +1351,10 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

	if (unlikely(!io_msg_alloc_async(req)))
		return -ENOMEM;
	if (req->opcode != IORING_OP_SENDMSG_ZC)
	if (req->opcode == IORING_OP_SEND_ZC) {
		req->flags |= REQ_F_IMPORT_BUFFER;
		return io_send_setup(req, sqe);
	}
	return io_sendmsg_zc_setup(req, sqe);
}

@@ -1453,8 +1453,8 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags)
	    (zc->flags & IORING_RECVSEND_POLL_FIRST))
		return -EAGAIN;

	if (!zc->imported) {
		zc->imported = true;
	if (req->flags & REQ_F_IMPORT_BUFFER) {
		req->flags &= ~REQ_F_IMPORT_BUFFER;
		ret = io_send_zc_import(req, issue_flags);
		if (unlikely(ret))
			return ret;