[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 09/18] migration/rdma: add multifd_rdma_load_setup() to setup
From: |
Chuan Zheng |
Subject: |
[PATCH v4 09/18] migration/rdma: add multifd_rdma_load_setup() to setup multifd rdma |
Date: |
Wed, 3 Feb 2021 16:01:42 +0800 |
Signed-off-by: Chuan Zheng <zhengchuan@huawei.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
migration/rdma.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/migration/rdma.c b/migration/rdma.c
index e0ea86d..996afb0 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -4011,6 +4011,48 @@ static void rdma_accept_incoming_migration(void *opaque)
}
}
+static bool multifd_rdma_load_setup(const char *host_port,
+ RDMAContext *rdma, Error **errp)
+{
+ int thread_count;
+ int i;
+ int idx;
+ MultiFDRecvParams *multifd_recv_param;
+ RDMAContext *multifd_rdma;
+
+ if (!migrate_use_multifd()) {
+ return true;
+ }
+
+ if (multifd_load_setup(errp) != 0) {
+ /*
+ * We haven't been able to create multifd threads
+ * nothing better to do
+ */
+ return false;
+ }
+
+ thread_count = migrate_multifd_channels();
+ for (i = 0; i < thread_count; i++) {
+ if (get_multifd_recv_param(i, &multifd_recv_param) < 0) {
+ ERROR(errp, "rdma: error getting multifd_recv_param(%d)", i);
+ return false;
+ }
+
+ multifd_rdma = qemu_rdma_data_init(host_port, errp);
+ for (idx = 0; idx < RDMA_WRID_MAX; idx++) {
+ multifd_rdma->wr_data[idx].control_len = 0;
+ multifd_rdma->wr_data[idx].control_curr = NULL;
+ }
+ /* the CM channel and CM id is shared */
+ multifd_rdma->channel = rdma->channel;
+ multifd_rdma->listen_id = rdma->listen_id;
+ multifd_recv_param->rdma = (void *)multifd_rdma;
+ }
+
+ return true;
+}
+
void rdma_start_incoming_migration(const char *host_port, Error **errp)
{
int ret;
@@ -4058,6 +4100,16 @@ void rdma_start_incoming_migration(const char
*host_port, Error **errp)
qemu_rdma_return_path_dest_init(rdma_return_path, rdma);
}
+ /* multifd rdma setup */
+ if (!multifd_rdma_load_setup(host_port, rdma, &local_err)) {
+ /*
+ * We haven't been able to create multifd threads
+ * nothing better to do
+ */
+ error_report_err(local_err);
+ goto err;
+ }
+
qemu_set_fd_handler(rdma->channel->fd, rdma_accept_incoming_migration,
NULL, (void *)(intptr_t)rdma);
return;
--
1.8.3.1
- [PATCH v4 14/18] migration/rdma: register memory for multifd RDMA channels, (continued)
- [PATCH v4 14/18] migration/rdma: register memory for multifd RDMA channels, Chuan Zheng, 2021/02/03
- [PATCH v4 08/18] migration/rdma: export getQIOChannel to get QIOchannel in rdma, Chuan Zheng, 2021/02/03
- [PATCH v4 10/18] migration/rdma: Create the multifd recv channels for RDMA, Chuan Zheng, 2021/02/03
- [PATCH v4 16/18] migration/rdma: add rdma_channel into Migrationstate field, Chuan Zheng, 2021/02/03
- [PATCH v4 18/18] migration/rdma: RDMA cleanup for multifd migration, Chuan Zheng, 2021/02/03
- [PATCH v4 09/18] migration/rdma: add multifd_rdma_load_setup() to setup multifd rdma,
Chuan Zheng <=
- [PATCH v4 17/18] migration/rdma: send data for both rdma-pin-all and NOT rdma-pin-all mode, Chuan Zheng, 2021/02/03