diff options
author | Juan Quintela <quintela@redhat.com> | 2021-11-19 15:35:58 +0100 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2022-01-28 15:38:23 +0100 |
commit | d48c3a044537689866fe44e65d24c7d39a68868a (patch) | |
tree | e1741d73eaf172f2d5da0d9e629bcb13096ace23 /migration/multifd.c | |
parent | 468fcb5dd0c965e1af0da9efab09b1462631da18 (diff) | |
download | qemu-d48c3a044537689866fe44e65d24c7d39a68868a.zip qemu-d48c3a044537689866fe44e65d24c7d39a68868a.tar.gz qemu-d48c3a044537689866fe44e65d24c7d39a68868a.tar.bz2 |
multifd: Use a single writev on the send side
Until now, we wrote the packet header with write(), and the rest of the
pages with writev(). Just increase the size of the iovec and do a
single writev().
Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'migration/multifd.c')
-rw-r--r-- | migration/multifd.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/migration/multifd.c b/migration/multifd.c index 96b9cc0..1d4885e 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -646,7 +646,7 @@ static void *multifd_send_thread(void *opaque) uint32_t used = p->pages->num; uint64_t packet_num = p->packet_num; uint32_t flags = p->flags; - p->iovs_num = 0; + p->iovs_num = 1; if (used) { ret = multifd_send_state->ops->send_prepare(p, &local_err); @@ -666,20 +666,15 @@ static void *multifd_send_thread(void *opaque) trace_multifd_send(p->id, packet_num, used, flags, p->next_packet_size); - ret = qio_channel_write_all(p->c, (void *)p->packet, - p->packet_len, &local_err); + p->iov[0].iov_len = p->packet_len; + p->iov[0].iov_base = p->packet; + + ret = qio_channel_writev_all(p->c, p->iov, p->iovs_num, + &local_err); if (ret != 0) { break; } - if (used) { - ret = qio_channel_writev_all(p->c, p->iov, p->iovs_num, - &local_err); - if (ret != 0) { - break; - } - } - qemu_mutex_lock(&p->mutex); p->pending_job--; qemu_mutex_unlock(&p->mutex); @@ -916,7 +911,8 @@ int multifd_save_setup(Error **errp) p->packet->version = cpu_to_be32(MULTIFD_VERSION); p->name = g_strdup_printf("multifdsend_%d", i); p->tls_hostname = g_strdup(s->hostname); - p->iov = g_new0(struct iovec, page_count); + /* We need one extra place for the packet header */ + p->iov = g_new0(struct iovec, page_count + 1); socket_send_channel_create(multifd_new_send_channel_async, p); } |