0727d3
From 4051de396e02ea2c1911c842426318bcd97f93c7 Mon Sep 17 00:00:00 2001
0727d3
From: Juan Quintela <quintela@redhat.com>
0727d3
Date: Wed, 18 May 2022 02:52:24 -0300
0727d3
Subject: [PATCH 15/37] multifd: Use a single writev on the send side
0727d3
MIME-Version: 1.0
0727d3
Content-Type: text/plain; charset=UTF-8
0727d3
Content-Transfer-Encoding: 8bit
0727d3
0727d3
RH-Author: Leonardo Brás <leobras@redhat.com>
0727d3
RH-MergeRequest: 191: MSG_ZEROCOPY + Multifd @ rhel8.7
0727d3
RH-Commit: [15/26] c37063c813fc0ba695072117f272360e5c413803
0727d3
RH-Bugzilla: 2072049
0727d3
RH-Acked-by: Peter Xu <peterx@redhat.com>
0727d3
RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com>
0727d3
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
0727d3
0727d3
Until now, we wrote the packet header with write(), and the rest of the
0727d3
pages with writev().  Just increase the size of the iovec and do a
0727d3
single writev().
0727d3
0727d3
Signed-off-by: Juan Quintela <quintela@redhat.com>
0727d3
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
0727d3
(cherry picked from commit d48c3a044537689866fe44e65d24c7d39a68868a)
0727d3
Signed-off-by: Leonardo Bras <leobras@redhat.com>
0727d3
---
0727d3
 migration/multifd.c | 20 ++++++++------------
0727d3
 1 file changed, 8 insertions(+), 12 deletions(-)
0727d3
0727d3
diff --git a/migration/multifd.c b/migration/multifd.c
0727d3
index 1e1551d78b..d0f86542b1 100644
0727d3
--- a/migration/multifd.c
0727d3
+++ b/migration/multifd.c
0727d3
@@ -643,7 +643,7 @@ static void *multifd_send_thread(void *opaque)
0727d3
             uint32_t used = p->pages->num;
0727d3
             uint64_t packet_num = p->packet_num;
0727d3
             uint32_t flags = p->flags;
0727d3
-            p->iovs_num = 0;
0727d3
+            p->iovs_num = 1;
0727d3
 
0727d3
             if (used) {
0727d3
                 ret = multifd_send_state->ops->send_prepare(p, &local_err);
0727d3
@@ -663,20 +663,15 @@ static void *multifd_send_thread(void *opaque)
0727d3
             trace_multifd_send(p->id, packet_num, used, flags,
0727d3
                                p->next_packet_size);
0727d3
 
0727d3
-            ret = qio_channel_write_all(p->c, (void *)p->packet,
0727d3
-                                        p->packet_len, &local_err);
0727d3
+            p->iov[0].iov_len = p->packet_len;
0727d3
+            p->iov[0].iov_base = p->packet;
0727d3
+
0727d3
+            ret = qio_channel_writev_all(p->c, p->iov, p->iovs_num,
0727d3
+                                         &local_err);
0727d3
             if (ret != 0) {
0727d3
                 break;
0727d3
             }
0727d3
 
0727d3
-            if (used) {
0727d3
-                ret = qio_channel_writev_all(p->c, p->iov, p->iovs_num,
0727d3
-                                             &local_err);
0727d3
-                if (ret != 0) {
0727d3
-                    break;
0727d3
-                }
0727d3
-            }
0727d3
-
0727d3
             qemu_mutex_lock(&p->mutex);
0727d3
             p->pending_job--;
0727d3
             qemu_mutex_unlock(&p->mutex);
0727d3
@@ -913,7 +908,8 @@ int multifd_save_setup(Error **errp)
0727d3
         p->packet->version = cpu_to_be32(MULTIFD_VERSION);
0727d3
         p->name = g_strdup_printf("multifdsend_%d", i);
0727d3
         p->tls_hostname = g_strdup(s->hostname);
0727d3
-        p->iov = g_new0(struct iovec, page_count);
0727d3
+        /* We need one extra place for the packet header */
0727d3
+        p->iov = g_new0(struct iovec, page_count + 1);
0727d3
         socket_send_channel_create(multifd_new_send_channel_async, p);
0727d3
     }
0727d3
 
0727d3
-- 
0727d3
2.35.3
0727d3