On Wed, Aug 19, 2026 at 9:17 PM Peter Xu <[email protected]> wrote:
>
> 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]>
Reviewed-by: Jack Wang <[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
>