Skip to content

Commit 86e6235

Browse files
isilenceaxboe
authored andcommitted
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>
1 parent 2b350f7 commit 86e6235

File tree

1 file changed

+50
-37
lines changed

1 file changed

+50
-37
lines changed

io_uring/net.c

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,54 @@ int io_sendmsg(struct io_kiocb *req, unsigned int issue_flags)
566566
return IOU_OK;
567567
}
568568

569+
static int io_send_select_buffer(struct io_kiocb *req, unsigned int issue_flags,
570+
struct io_async_msghdr *kmsg)
571+
{
572+
struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
573+
574+
int ret;
575+
struct buf_sel_arg arg = {
576+
.iovs = &kmsg->fast_iov,
577+
.max_len = min_not_zero(sr->len, INT_MAX),
578+
.nr_iovs = 1,
579+
};
580+
581+
if (kmsg->free_iov) {
582+
arg.nr_iovs = kmsg->free_iov_nr;
583+
arg.iovs = kmsg->free_iov;
584+
arg.mode = KBUF_MODE_FREE;
585+
}
586+
587+
if (!(sr->flags & IORING_RECVSEND_BUNDLE))
588+
arg.nr_iovs = 1;
589+
else
590+
arg.mode |= KBUF_MODE_EXPAND;
591+
592+
ret = io_buffers_select(req, &arg, issue_flags);
593+
if (unlikely(ret < 0))
594+
return ret;
595+
596+
if (arg.iovs != &kmsg->fast_iov && arg.iovs != kmsg->free_iov) {
597+
kmsg->free_iov_nr = ret;
598+
kmsg->free_iov = arg.iovs;
599+
req->flags |= REQ_F_NEED_CLEANUP;
600+
}
601+
sr->len = arg.out_len;
602+
603+
if (ret == 1) {
604+
sr->buf = arg.iovs[0].iov_base;
605+
ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len,
606+
&kmsg->msg.msg_iter);
607+
if (unlikely(ret))
608+
return ret;
609+
} else {
610+
iov_iter_init(&kmsg->msg.msg_iter, ITER_SOURCE,
611+
arg.iovs, ret, arg.out_len);
612+
}
613+
614+
return 0;
615+
}
616+
569617
int io_send(struct io_kiocb *req, unsigned int issue_flags)
570618
{
571619
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)
589637

590638
retry_bundle:
591639
if (io_do_buffer_select(req)) {
592-
struct buf_sel_arg arg = {
593-
.iovs = &kmsg->fast_iov,
594-
.max_len = min_not_zero(sr->len, INT_MAX),
595-
.nr_iovs = 1,
596-
};
597-
598-
if (kmsg->free_iov) {
599-
arg.nr_iovs = kmsg->free_iov_nr;
600-
arg.iovs = kmsg->free_iov;
601-
arg.mode = KBUF_MODE_FREE;
602-
}
603-
604-
if (!(sr->flags & IORING_RECVSEND_BUNDLE))
605-
arg.nr_iovs = 1;
606-
else
607-
arg.mode |= KBUF_MODE_EXPAND;
608-
609-
ret = io_buffers_select(req, &arg, issue_flags);
610-
if (unlikely(ret < 0))
640+
ret = io_send_select_buffer(req, issue_flags, kmsg);
641+
if (ret)
611642
return ret;
612-
613-
if (arg.iovs != &kmsg->fast_iov && arg.iovs != kmsg->free_iov) {
614-
kmsg->free_iov_nr = ret;
615-
kmsg->free_iov = arg.iovs;
616-
req->flags |= REQ_F_NEED_CLEANUP;
617-
}
618-
sr->len = arg.out_len;
619-
620-
if (ret == 1) {
621-
sr->buf = arg.iovs[0].iov_base;
622-
ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len,
623-
&kmsg->msg.msg_iter);
624-
if (unlikely(ret))
625-
return ret;
626-
} else {
627-
iov_iter_init(&kmsg->msg.msg_iter, ITER_SOURCE,
628-
arg.iovs, ret, arg.out_len);
629-
}
630643
}
631644

632645
/*

0 commit comments

Comments
 (0)