]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
io_uring/net: extract io_send_select_buffer()
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 28 Jan 2025 20:56:14 +0000 (20:56 +0000)
committerJens Axboe <axboe@kernel.dk>
Tue, 28 Jan 2025 22:10:40 +0000 (15:10 -0700)
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>
io_uring/net.c

index dedf274fc049ae86c1603f61a5e3b5df164eed2a..4d21f7bd2149e79130e30874be89aff738451c97 100644 (file)
@@ -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);
-               }
        }
 
        /*