qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/5] migration/rdma: Fix race on source


From: Peter Xu
Subject: Re: [Qemu-devel] [PATCH 1/5] migration/rdma: Fix race on source
Date: Wed, 12 Jul 2017 11:13:17 +0800
User-agent: Mutt/1.5.24 (2015-08-30)

On Tue, Jul 04, 2017 at 07:49:11PM +0100, Dr. David Alan Gilbert (git) wrote:
> From: "Dr. David Alan Gilbert" <address@hidden>
> 
> Fix a race where the destination might try and send the source a
> WRID_READY before the source has done a post-recv for it.
> 
> rdma_post_recv has to happen after the qp exists, and we're
> OK since we've already called qemu_rdma_source_init that calls
> qemu_alloc_qp.

Though I am not very familiar with the whole RDMA path, this makes
sense to me.

> 
> This corresponds to:
> https://bugzilla.redhat.com/show_bug.cgi?id=1285044
> 
> The race can be triggered by adding a few ms wait before this
> post_recv_control (which was originally due to me turning on loads of
> debug).
> 
> Signed-off-by: Dr. David Alan Gilbert <address@hidden>

Reviewed-by: Peter Xu <address@hidden>

> ---
>  migration/rdma.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/migration/rdma.c b/migration/rdma.c
> index c6bc607a03..6111e10c70 100644
> --- a/migration/rdma.c
> +++ b/migration/rdma.c
> @@ -2365,6 +2365,12 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error 
> **errp)
>  
>      caps_to_network(&cap);
>  
> +    ret = qemu_rdma_post_recv_control(rdma, RDMA_WRID_READY);
> +    if (ret) {
> +        ERROR(errp, "posting second control recv");
> +        goto err_rdma_source_connect;
> +    }
> +
>      ret = rdma_connect(rdma->cm_id, &conn_param);
>      if (ret) {
>          perror("rdma_connect");
> @@ -2405,12 +2411,6 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error 
> **errp)
>  
>      rdma_ack_cm_event(cm_event);
>  
> -    ret = qemu_rdma_post_recv_control(rdma, RDMA_WRID_READY);
> -    if (ret) {
> -        ERROR(errp, "posting second control recv!");
> -        goto err_rdma_source_connect;
> -    }
> -
>      rdma->control_ready_expected = 1;
>      rdma->nb_sent = 0;
>      return 0;
> -- 
> 2.13.0
> 

-- 
Peter Xu



reply via email to

[Prev in Thread] Current Thread [Next in Thread]