From: Jialin Wang <wangjialin23@huawei.com>
Signed-off-by: Jialin Wang <wangjialin23@huawei.com>
Signed-off-by: Gonglei <arei.gonglei@huawei.com>
---
migration/multifd.c | 10 ++++++++++
migration/rdma.c | 27 +++++++++++++++++++++++++++
migration/rdma.h | 6 ++++++
3 files changed, 43 insertions(+)
diff --git a/migration/multifd.c b/migration/multifd.c
index f317bff077..cee9858ad1 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -32,6 +32,7 @@
#include "io/channel-file.h"
#include "io/channel-socket.h"
#include "yank_functions.h"
+#include "rdma.h"
/* Multiple fd's */
@@ -793,6 +794,9 @@ static bool multifd_send_cleanup_channel(MultiFDSendParams *p, Error **errp)
static void multifd_send_cleanup_state(void)
{
file_cleanup_outgoing_migration();
+#ifdef CONFIG_RDMA
+ rdma_cleanup_outgoing_migration();
+#endif
socket_cleanup_outgoing_migration();
qemu_sem_destroy(&multifd_send_state->channels_created);
qemu_sem_destroy(&multifd_send_state->channels_ready);
@@ -1139,6 +1143,12 @@ static bool multifd_new_send_channel_create(gpointer opaque, Error **errp)
return file_send_channel_create(opaque, errp);
}
+#ifdef CONFIG_RDMA
+ if (rdma_send_channel_create(multifd_new_send_channel_async, opaque)) {
+ return true;
+ }
+#endif
+
socket_send_channel_create(multifd_new_send_channel_async, opaque);
return true;
}
diff --git a/migration/rdma.c b/migration/rdma.c
index 09a4de7f59..af4d2b5a5a 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -19,6 +19,7 @@
#include "qapi/qapi-visit-sockets.h"
#include "channel.h"
#include "migration.h"
+#include "options.h"
#include "rdma.h"
#include "trace.h"
#include <stdio.h>
@@ -27,6 +28,28 @@ static struct RDMAOutgoingArgs {
InetSocketAddress *addr;
} outgoing_args;
+bool rdma_send_channel_create(QIOTaskFunc f, void *data)
+{
+ QIOChannelRDMA *rioc;
+
+ if (!outgoing_args.addr) {
+ return false;
+ }
+
+ rioc = qio_channel_rdma_new();
+ qio_channel_rdma_connect_async(rioc, outgoing_args.addr, f, data, NULL,
+ NULL);
+ return true;
+}
+
+void rdma_cleanup_outgoing_migration(void)
+{
+ if (outgoing_args.addr) {
+ qapi_free_InetSocketAddress(outgoing_args.addr);
+ outgoing_args.addr = NULL;
+ }
+}
+
static void rdma_outgoing_migration(QIOTask *task, gpointer opaque)
{
MigrationState *s = opaque;
@@ -74,6 +97,10 @@ void rdma_start_incoming_migration(InetSocketAddress *addr, Error **errp)
qio_channel_set_name(QIO_CHANNEL(rioc), "migration-rdma-listener");
+ if (migrate_multifd()) {
+ num = migrate_multifd_channels();
+ }
+
if (qio_channel_rdma_listen_sync(rioc, addr, num, errp) < 0) {
object_unref(OBJECT(rioc));
return;
diff --git a/migration/rdma.h b/migration/rdma.h
index 4c3eb9a972..cefccac61c 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -16,6 +16,12 @@
#include "qemu/sockets.h"
+#include <stdbool.h>
+
+bool rdma_send_channel_create(QIOTaskFunc f, void *data);
+
+void rdma_cleanup_outgoing_migration(void);
+
void rdma_start_outgoing_migration(MigrationState *s, InetSocketAddress *addr,
Error **errp);
--
2.43.0