RAM writes and control messages share the send queue. If outstanding writes fill it, RDMA writes drain a completion and retry, but control sends fail the migration.
Drain one outstanding write and retry the control send on ENOMEM. Signed-off-by: Yanfei Xu <[email protected]> --- migration/rdma.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/migration/rdma.c b/migration/rdma.c index 6e8436ccc1..d1f44a5f55 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -1572,9 +1572,19 @@ static int qemu_rdma_post_send_control(RDMAContext *rdma, uint8_t *buf, memcpy(wr->control + sizeof(RDMAControlHeader), buf, head->len); } - +retry: ret = ibv_post_send(rdma->qp, &send_wr, &bad_wr); + if (ret == ENOMEM && rdma->nb_sent) { + ret = qemu_rdma_block_for_wrid(rdma, RDMA_WRID_RDMA_WRITE, NULL); + if (ret < 0) { + error_setg(errp, "rdma migration: failed to make room for " + "control send"); + return -1; + } + goto retry; + } + if (ret > 0) { error_setg(errp, "Failed to use post IB SEND for control"); return -1; -- 2.20.1
