io_uring/net: use ITER_UBUF for single segment send maps
authorJens Axboe <axboe@kernel.dk>
Thu, 8 Aug 2024 16:42:18 +0000 (10:42 -0600)
committerJens Axboe <axboe@kernel.dk>
Sun, 25 Aug 2024 14:27:01 +0000 (08:27 -0600)
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>
io_uring/net.c

index d08abcc..dc83a35 100644 (file)
@@ -618,14 +618,23 @@ retry_bundle:
                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);
+               }
        }
 
        /*