[PATCH 6/6] migration/rdma: support multifd for RDMA migration

Gonglei via posted 6 patches 5 months, 3 weeks ago
Maintainers: "Daniel P. Berrangé" <berrange@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, Thomas Huth <thuth@redhat.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>, Li Zhijian <lizhijian@fujitsu.com>, Eric Blake <eblake@redhat.com>, Markus Armbruster <armbru@redhat.com>, John Snow <jsnow@redhat.com>, Cleber Rosa <crosa@redhat.com>
[PATCH 6/6] migration/rdma: support multifd for RDMA migration
Posted by Gonglei via 5 months, 3 weeks ago
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