[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v1 3/3] migration: multifd: Enable zerocopy
From: |
Leonardo Bras |
Subject: |
[PATCH v1 3/3] migration: multifd: Enable zerocopy |
Date: |
Tue, 31 Aug 2021 08:02:39 -0300 |
Call qio_channel_set_zerocopy(true) in the start of every multifd thread.
Change the send_write() interface of multifd, allowing it to pass down
flags for qio_channel_write*().
Pass down MSG_ZEROCOPY flag for sending memory pages, while keeping the
other data being sent at the default copying approach.
Signed-off-by: Leonardo Bras <leobras@redhat.com>
---
migration/multifd-zlib.c | 7 ++++---
migration/multifd-zstd.c | 7 ++++---
migration/multifd.c | 9 ++++++---
migration/multifd.h | 3 ++-
4 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/migration/multifd-zlib.c b/migration/multifd-zlib.c
index ab4ba75d75..d8cce1810a 100644
--- a/migration/multifd-zlib.c
+++ b/migration/multifd-zlib.c
@@ -160,12 +160,13 @@ static int zlib_send_prepare(MultiFDSendParams *p,
uint32_t used, Error **errp)
* @used: number of pages used
* @errp: pointer to an error
*/
-static int zlib_send_write(MultiFDSendParams *p, uint32_t used, Error **errp)
+static int zlib_send_write(MultiFDSendParams *p, uint32_t used, int flags,
+ Error **errp)
{
struct zlib_data *z = p->data;
- return qio_channel_write_all(p->c, (void *)z->zbuff, p->next_packet_size,
- errp);
+ return qio_channel_write_all_flags(p->c, (void *)z->zbuff,
+ p->next_packet_size, flags, errp);
}
/**
diff --git a/migration/multifd-zstd.c b/migration/multifd-zstd.c
index 693bddf8c9..fa063fd33e 100644
--- a/migration/multifd-zstd.c
+++ b/migration/multifd-zstd.c
@@ -171,12 +171,13 @@ static int zstd_send_prepare(MultiFDSendParams *p,
uint32_t used, Error **errp)
* @used: number of pages used
* @errp: pointer to an error
*/
-static int zstd_send_write(MultiFDSendParams *p, uint32_t used, Error **errp)
+static int zstd_send_write(MultiFDSendParams *p, uint32_t used, int flags,
+ Error **errp)
{
struct zstd_data *z = p->data;
- return qio_channel_write_all(p->c, (void *)z->zbuff, p->next_packet_size,
- errp);
+ return qio_channel_write_all_flags(p->c, (void *)z->zbuff,
+ p->next_packet_size, flags, errp);
}
/**
diff --git a/migration/multifd.c b/migration/multifd.c
index 377da78f5b..097621c12c 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -103,9 +103,10 @@ static int nocomp_send_prepare(MultiFDSendParams *p,
uint32_t used,
* @used: number of pages used
* @errp: pointer to an error
*/
-static int nocomp_send_write(MultiFDSendParams *p, uint32_t used, Error **errp)
+static int nocomp_send_write(MultiFDSendParams *p, uint32_t used, int flags,
+ Error **errp)
{
- return qio_channel_writev_all(p->c, p->pages->iov, used, errp);
+ return qio_channel_writev_all_flags(p->c, p->pages->iov, used, flags,
errp);
}
/**
@@ -675,7 +676,8 @@ static void *multifd_send_thread(void *opaque)
}
if (used) {
- ret = multifd_send_state->ops->send_write(p, used, &local_err);
+ ret = multifd_send_state->ops->send_write(p, used,
MSG_ZEROCOPY,
+ &local_err);
if (ret != 0) {
break;
}
@@ -815,6 +817,7 @@ static bool multifd_channel_connect(MultiFDSendParams *p,
} else {
/* update for tls qio channel */
p->c = ioc;
+ qio_channel_set_zerocopy(ioc, true);
qemu_thread_create(&p->thread, p->name, multifd_send_thread, p,
QEMU_THREAD_JOINABLE);
}
diff --git a/migration/multifd.h b/migration/multifd.h
index 8d6751f5ed..7243ba4185 100644
--- a/migration/multifd.h
+++ b/migration/multifd.h
@@ -157,7 +157,8 @@ typedef struct {
/* Prepare the send packet */
int (*send_prepare)(MultiFDSendParams *p, uint32_t used, Error **errp);
/* Write the send packet */
- int (*send_write)(MultiFDSendParams *p, uint32_t used, Error **errp);
+ int (*send_write)(MultiFDSendParams *p, uint32_t used, int flags,
+ Error **errp);
/* Setup for receiving side */
int (*recv_setup)(MultiFDRecvParams *p, Error **errp);
/* Cleanup for receiving side */
--
2.33.0