On Mon, Aug 17, 2026 at 06:51:16PM +0800, Yanfei Xu wrote:
> The source return-path thread can send READY before the destination has
> posted its initial receive. Since RNR retries default to zero, the send
> can fail and abort migration.
>
> Post the initial receive before rdma_accept() to close this window.
>
> Fixes: 55cc1b5937a8 ("migration: create a dedicated connection for rdma
> return path")
> Signed-off-by: Yanfei Xu <[email protected]>
This one looks correct to me,
Reviewed-by: Peter Xu <[email protected]>
Do you have way to reproduce it, or is this theory (or can be reproduced by
adding delays)?
> ---
> migration/rdma.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/migration/rdma.c b/migration/rdma.c
> index e17ace62b0..6e8436ccc1 100644
> --- a/migration/rdma.c
> +++ b/migration/rdma.c
> @@ -3263,6 +3263,12 @@ static int qemu_rdma_accept(RDMAContext *rdma)
> }
> }
>
> + ret = qemu_rdma_post_recv_control(rdma, RDMA_WRID_READY, &err);
> + if (ret < 0) {
> + error_report_err(err);
> + goto err_rdma_dest_wait;
> + }
> +
> /* Accept the second connection request for return path */
> if ((migrate_postcopy() || migrate_return_path())
> && !rdma->is_return_path) {
> @@ -3295,12 +3301,6 @@ static int qemu_rdma_accept(RDMAContext *rdma)
> rdma_ack_cm_event(cm_event);
> rdma->connected = true;
>
> - ret = qemu_rdma_post_recv_control(rdma, RDMA_WRID_READY, &err);
> - if (ret < 0) {
> - error_report_err(err);
> - goto err_rdma_dest_wait;
> - }
> -
> qemu_rdma_dump_gid("dest_connect", rdma->cm_id);
>
> return 0;
> --
> 2.20.1
>
--
Peter Xu