diff mbox series

[v3,09/18] migration/rdma: add multifd_rdma_load_setup() to setup multifd rdma

Message ID 1602908748-43335-10-git-send-email-zhengchuan@huawei.com (mailing list archive)
State New, archived
Headers show
Series Support Multifd for RDMA migration | expand

Commit Message

Zheng Chuan Oct. 17, 2020, 4:25 a.m. UTC
Signed-off-by: Chuan Zheng <zhengchuan@huawei.com>
---
 migration/rdma.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

Comments

Dr. David Alan Gilbert Nov. 10, 2020, 4:51 p.m. UTC | #1
* Chuan Zheng (zhengchuan@huawei.com) wrote:
> 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 ad4e4ba..2baa933 100644
> --- a/migration/rdma.c
> +++ b/migration/rdma.c
> @@ -4010,6 +4010,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;
> @@ -4057,6 +4099,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
>
diff mbox series

Patch

diff --git a/migration/rdma.c b/migration/rdma.c
index ad4e4ba..2baa933 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -4010,6 +4010,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;
@@ -4057,6 +4099,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;