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
State New
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

> 

-- 
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
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;