Commit 566a4242 authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring/net: use ITER_UBUF for single segment send maps



Just like what is being done on the recv side, if we only map a single
segment, then use ITER_UBUF for mapping it. That's more efficient than
using an ITER_IOVEC.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 03e02e8f
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -618,14 +618,23 @@ int io_send(struct io_kiocb *req, unsigned int issue_flags)
		if (unlikely(ret < 0))
			return ret;

		sr->len = arg.out_len;
		iov_iter_init(&kmsg->msg.msg_iter, ITER_SOURCE, arg.iovs, ret,
				arg.out_len);
		if (arg.iovs != &kmsg->fast_iov && arg.iovs != kmsg->free_iov) {
			kmsg->free_iov_nr = ret;
			kmsg->free_iov = arg.iovs;
			req->flags |= REQ_F_NEED_CLEANUP;
		}
		sr->len = arg.out_len;

		if (ret == 1) {
			sr->buf = arg.iovs[0].iov_base;
			ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len,
						&kmsg->msg.msg_iter);
			if (unlikely(ret))
				return ret;
		} else {
			iov_iter_init(&kmsg->msg.msg_iter, ITER_SOURCE,
					arg.iovs, ret, arg.out_len);
		}
	}

	/*