tls migration can easily reach bottleneck of cpu which results in migration failure. add support for multifd tls feature to make fully use of bandwidth.
84 lines
3.6 KiB
Diff
84 lines
3.6 KiB
Diff
From 26ffadd08711aa4ef62932ac0ecf5048518b2801 Mon Sep 17 00:00:00 2001
|
|
From: Ying Fang <fangying1@huawei.com>
|
|
Date: Wed, 2 Dec 2020 14:50:12 +0800
|
|
Subject: [PATCH] migration/multifd: fix hangup with TLS-Multifd due to
|
|
blocking handshake
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
The qemu main loop could hang up forever when we enable TLS+Multifd.
|
|
The Src multifd_send_0 invokes tls handshake, it sends hello to sever
|
|
and wait response.
|
|
However, the Dst main qemu loop has been waiting recvmsg() for multifd_recv_1.
|
|
Both of Src and Dst main qemu loop are blocking and waiting for reponse which
|
|
results in hanging up forever.
|
|
|
|
Src: (multifd_send_0) Dst: (multifd_recv_1)
|
|
multifd_channel_connect migration_channel_process_incoming
|
|
multifd_tls_channel_connect migration_tls_channel_process_incoming
|
|
multifd_tls_channel_connect qio_channel_tls_handshake_task
|
|
qio_channel_tls_handshake gnutls_handshake
|
|
qio_channel_tls_handshake_task ...
|
|
qcrypto_tls_session_handshake ...
|
|
gnutls_handshake ...
|
|
... ...
|
|
recvmsg (Blocking I/O waiting for response) recvmsg (Blocking I/O waiting for response)
|
|
|
|
Fix this by offloadinig handshake work to a background thread.
|
|
|
|
Reported-by: Yan Jin <jinyan12@huawei.com>
|
|
Suggested-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
Signed-off-by: Chuan Zheng <zhengchuan@huawei.com>
|
|
Message-Id: <1604643893-8223-1-git-send-email-zhengchuan@huawei.com>
|
|
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
---
|
|
migration/ram.c | 23 +++++++++++++++++------
|
|
1 file changed, 17 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/migration/ram.c b/migration/ram.c
|
|
index dc9831d7f3..a37dbfc049 100644
|
|
--- a/migration/ram.c
|
|
+++ b/migration/ram.c
|
|
@@ -1220,6 +1220,19 @@ static void multifd_tls_outgoing_handshake(QIOTask *task,
|
|
multifd_channel_connect(p, ioc, err);
|
|
}
|
|
|
|
+static void *multifd_tls_handshake_thread(void *opaque)
|
|
+{
|
|
+ MultiFDSendParams *p = opaque;
|
|
+ QIOChannelTLS *tioc = QIO_CHANNEL_TLS(p->c);
|
|
+
|
|
+ qio_channel_tls_handshake(tioc,
|
|
+ multifd_tls_outgoing_handshake,
|
|
+ p,
|
|
+ NULL,
|
|
+ NULL);
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
static void multifd_tls_channel_connect(MultiFDSendParams *p,
|
|
QIOChannel *ioc,
|
|
Error **errp)
|
|
@@ -1235,12 +1248,10 @@ static void multifd_tls_channel_connect(MultiFDSendParams *p,
|
|
|
|
trace_multifd_tls_outgoing_handshake_start(ioc, tioc, hostname);
|
|
qio_channel_set_name(QIO_CHANNEL(tioc), "multifd-tls-outgoing");
|
|
- qio_channel_tls_handshake(tioc,
|
|
- multifd_tls_outgoing_handshake,
|
|
- p,
|
|
- NULL,
|
|
- NULL);
|
|
-
|
|
+ p->c = QIO_CHANNEL(tioc);
|
|
+ qemu_thread_create(&p->thread, "multifd-tls-handshake-worker",
|
|
+ multifd_tls_handshake_thread, p,
|
|
+ QEMU_THREAD_JOINABLE);
|
|
}
|
|
|
|
static bool multifd_channel_connect(MultiFDSendParams *p,
|
|
--
|
|
2.27.0
|
|
|