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: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
03e02e8f95
commit
566a424212
@ -618,14 +618,23 @@ retry_bundle:
|
|||||||
if (unlikely(ret < 0))
|
if (unlikely(ret < 0))
|
||||||
return ret;
|
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) {
|
if (arg.iovs != &kmsg->fast_iov && arg.iovs != kmsg->free_iov) {
|
||||||
kmsg->free_iov_nr = ret;
|
kmsg->free_iov_nr = ret;
|
||||||
kmsg->free_iov = arg.iovs;
|
kmsg->free_iov = arg.iovs;
|
||||||
req->flags |= REQ_F_NEED_CLEANUP;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user