[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 04/18] migration/rdma: add multifd_setup_ops for rdma
From: |
Chuan Zheng |
Subject: |
[PATCH v4 04/18] migration/rdma: add multifd_setup_ops for rdma |
Date: |
Wed, 3 Feb 2021 16:01:37 +0800 |
Signed-off-by: Chuan Zheng <zhengchuan@huawei.com>
---
migration/multifd.c | 6 +++++
migration/multifd.h | 5 ++++
migration/rdma.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 82 insertions(+)
diff --git a/migration/multifd.c b/migration/multifd.c
index cb1fc01..4820702 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -1232,6 +1232,12 @@ MultiFDSetup *multifd_setup_ops_init(void)
{
MultiFDSetup *ops;
+#ifdef CONFIG_RDMA
+ if (migrate_use_rdma()) {
+ ops = &multifd_rdma_ops;
+ return ops;
+ }
+#endif
ops = &multifd_socket_ops;
return ops;
}
diff --git a/migration/multifd.h b/migration/multifd.h
index 1d2dc90..e3ab4b0 100644
--- a/migration/multifd.h
+++ b/migration/multifd.h
@@ -173,6 +173,11 @@ typedef struct {
void (*recv_channel_setup)(QIOChannel *ioc, MultiFDRecvParams *p);
} MultiFDSetup;
+#ifdef CONFIG_RDMA
+extern MultiFDSetup multifd_rdma_ops;
+#endif
+MultiFDSetup *multifd_setup_ops_init(void);
+
void multifd_register_ops(int method, MultiFDMethods *ops);
#endif
diff --git a/migration/rdma.c b/migration/rdma.c
index 00eac34..e0ea86d 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -19,6 +19,7 @@
#include "qemu/cutils.h"
#include "rdma.h"
#include "migration.h"
+#include "multifd.h"
#include "qemu-file.h"
#include "ram.h"
#include "qemu-file-channel.h"
@@ -4139,3 +4140,73 @@ err:
g_free(rdma);
g_free(rdma_return_path);
}
+
+static void *multifd_rdma_send_thread(void *opaque)
+{
+ MultiFDSendParams *p = opaque;
+
+ while (true) {
+ WITH_QEMU_LOCK_GUARD(&p->mutex) {
+ if (p->quit) {
+ break;
+ }
+ }
+ qemu_sem_wait(&p->sem);
+ }
+
+ WITH_QEMU_LOCK_GUARD(&p->mutex) {
+ p->running = false;
+ }
+
+ return NULL;
+}
+
+static void multifd_rdma_send_channel_setup(MultiFDSendParams *p)
+{
+ Error *local_err = NULL;
+
+ if (p->quit) {
+ error_setg(&local_err, "multifd: send id %d already quit", p->id);
+ return ;
+ }
+ p->running = true;
+
+ qemu_thread_create(&p->thread, p->name, multifd_rdma_send_thread, p,
+ QEMU_THREAD_JOINABLE);
+}
+
+static void *multifd_rdma_recv_thread(void *opaque)
+{
+ MultiFDRecvParams *p = opaque;
+
+ while (true) {
+ WITH_QEMU_LOCK_GUARD(&p->mutex) {
+ if (p->quit) {
+ break;
+ }
+ }
+ qemu_sem_wait(&p->sem_sync);
+ }
+
+ WITH_QEMU_LOCK_GUARD(&p->mutex) {
+ p->running = false;
+ }
+
+ return NULL;
+}
+
+static void multifd_rdma_recv_channel_setup(QIOChannel *ioc,
+ MultiFDRecvParams *p)
+{
+ QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
+
+ p->file = rioc->file;
+ return;
+}
+
+MultiFDSetup multifd_rdma_ops = {
+ .send_thread = multifd_rdma_send_thread,
+ .recv_thread = multifd_rdma_recv_thread,
+ .send_channel_setup = multifd_rdma_send_channel_setup,
+ .recv_channel_setup = multifd_rdma_recv_channel_setup
+};
--
1.8.3.1
- [PATCH v4 00/18] Support Multifd for RDMA migration, Chuan Zheng, 2021/02/03
- [PATCH v4 04/18] migration/rdma: add multifd_setup_ops for rdma,
Chuan Zheng <=
- [PATCH v4 01/18] migration/rdma: add the 'migrate_rdma_pin_all' function, Chuan Zheng, 2021/02/03
- [PATCH v4 05/18] migration/rdma: do not need sync main for rdma, Chuan Zheng, 2021/02/03
- [PATCH v4 12/18] migration/rdma: Create the multifd send channels for RDMA, Chuan Zheng, 2021/02/03
- [PATCH v4 13/18] migration/rdma: Add the function for dynamic page registration, Chuan Zheng, 2021/02/03
- [PATCH v4 11/18] migration/rdma: record host_port for multifd RDMA, Chuan Zheng, 2021/02/03