mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
io_uring/net: extract io_send_select_buffer()
Extract a helper out of io_send() for provided buffer selection to improve readability as it has grown to take too many lines. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Reviewed-by: Gabriel Krisman Bertazi <krisman@suse.de> Link: https://lore.kernel.org/r/26a769cdabd61af7f40c5d88a22469c5ad071796.1738087204.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
2b350f756b
commit
86e62354ee
|
@ -566,6 +566,54 @@ int io_sendmsg(struct io_kiocb *req, unsigned int issue_flags)
|
|||
return IOU_OK;
|
||||
}
|
||||
|
||||
static int io_send_select_buffer(struct io_kiocb *req, unsigned int issue_flags,
|
||||
struct io_async_msghdr *kmsg)
|
||||
{
|
||||
struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
|
||||
|
||||
int ret;
|
||||
struct buf_sel_arg arg = {
|
||||
.iovs = &kmsg->fast_iov,
|
||||
.max_len = min_not_zero(sr->len, INT_MAX),
|
||||
.nr_iovs = 1,
|
||||
};
|
||||
|
||||
if (kmsg->free_iov) {
|
||||
arg.nr_iovs = kmsg->free_iov_nr;
|
||||
arg.iovs = kmsg->free_iov;
|
||||
arg.mode = KBUF_MODE_FREE;
|
||||
}
|
||||
|
||||
if (!(sr->flags & IORING_RECVSEND_BUNDLE))
|
||||
arg.nr_iovs = 1;
|
||||
else
|
||||
arg.mode |= KBUF_MODE_EXPAND;
|
||||
|
||||
ret = io_buffers_select(req, &arg, issue_flags);
|
||||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int io_send(struct io_kiocb *req, unsigned int issue_flags)
|
||||
{
|
||||
struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
|
||||
|
@ -589,44 +637,9 @@ int io_send(struct io_kiocb *req, unsigned int issue_flags)
|
|||
|
||||
retry_bundle:
|
||||
if (io_do_buffer_select(req)) {
|
||||
struct buf_sel_arg arg = {
|
||||
.iovs = &kmsg->fast_iov,
|
||||
.max_len = min_not_zero(sr->len, INT_MAX),
|
||||
.nr_iovs = 1,
|
||||
};
|
||||
|
||||
if (kmsg->free_iov) {
|
||||
arg.nr_iovs = kmsg->free_iov_nr;
|
||||
arg.iovs = kmsg->free_iov;
|
||||
arg.mode = KBUF_MODE_FREE;
|
||||
}
|
||||
|
||||
if (!(sr->flags & IORING_RECVSEND_BUNDLE))
|
||||
arg.nr_iovs = 1;
|
||||
else
|
||||
arg.mode |= KBUF_MODE_EXPAND;
|
||||
|
||||
ret = io_buffers_select(req, &arg, issue_flags);
|
||||
if (unlikely(ret < 0))
|
||||
ret = io_send_select_buffer(req, issue_flags, kmsg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue
Block a user