From nobody Fri Aug 21 21:29:26 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=bytedance.com ARC-Seal: i=1; a=rsa-sha256; t=1787319478; cv=none; d=zohomail.com; s=zohoarc; b=G3H9y7ffKQ4VSRMkWsn5oB94dM1xhmehnAp+UDzapN55JH5ZBZ/ZMzxLnq6qiK9jOJ6kDh/CXR7Va6nRnfTyxK0xQ6EWU4wbn9HHrSsnUlibRw/Wy6kn6gLcLj7ZO35OLNKUpSb4XvWghpsoydICWfYmu7wRZpcgAcIX/zyMIaY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787319478; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ZTSCMSzTohnTLiZgJFnsCTROTVrT/tvOxSVH4ruU1yk=; b=Ko1zaYw6R6cICowHKOuwTRYGcPy4hi5479mfzrstYEiLLDbh2WMrEdxBO/PjNQljgR9At5KxCp1lznaoTC5ve7Rku0qnvQwBxKgBNebSwC0piE3WNS4AKEulUvtlZJqzbL/FASGX29jc0c8k0M9VGdzUaBH/HvAs8EMvfIPtn9s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787319477969224.05673318473953; Fri, 21 Aug 2026 06:37:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wxPQx-0001Io-Ev; Fri, 21 Aug 2026 09:37:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wxPQu-0001CN-2k for qemu-devel@nongnu.org; Fri, 21 Aug 2026 09:37:21 -0400 Received: from va-1-111.ptr.blmpb.com ([209.127.230.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wxPQs-0000jH-Ld for qemu-devel@nongnu.org; Fri, 21 Aug 2026 09:37:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=2212171451; d=bytedance.com; t=1787319433; h=from:subject: mime-version:from:date:message-id:subject:to:cc:reply-to:content-type: mime-version:in-reply-to:message-id; bh=ZTSCMSzTohnTLiZgJFnsCTROTVrT/tvOxSVH4ruU1yk=; b=aR7NVbxuQeHXNYKENs/RRARD8xMiZsB8rfqKw+4+SDhLUr4Ryj5ngPAynr0O+yf3exgZyw kphS1uAPZ7o9TfBWECTDlK2mizP8P+CF8I0QG2E0qIjxkwnowXeVMWk3ocht0c3BINoRhJ 5D/n4QFJWocB+r/9CjR/SDXrfoA0V4Njum+bl9sTHTAKWSX2i9yumBFpG3DRmYLf+IaWpn CP9wwSqG1i49WjOCxViKWO6RCngOnZue19ndSx0S1GD1cb2BcfjuG75DgQSR3uYg4xdF+u KomqU/GGPBASs6Cl/kDqBiU9BHX5x5Axmsu/9X99mzen+w4gjJ6GPS7oLG7N4Q== Cc: , , , , , "Yanfei Xu" Date: Fri, 21 Aug 2026 21:35:57 +0800 Mime-Version: 1.0 X-Original-From: Yanfei Xu Content-Transfer-Encoding: quoted-printable To: Subject: [PATCH v2 1/3] migration/rdma: Fix write-side shutdown Message-Id: <20260821133559.3815727-2-yanfei.xu@bytedance.com> References: <20260821133559.3815727-1-yanfei.xu@bytedance.com> X-Mailer: git-send-email 2.20.1 From: "Yanfei Xu" X-Lms-Return-Path: In-Reply-To: <20260821133559.3815727-1-yanfei.xu@bytedance.com> Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=209.127.230.111; envelope-from=yanfei.xu@bytedance.com; helo=va-1-111.ptr.blmpb.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bytedance.com) X-ZM-MESSAGEID: 1787319479082158500 Content-Type: text/plain; charset="utf-8" qio_channel_rdma_shutdown() reads rdmain for both the input and output contexts. As a result, a write-side shutdown marks the input context as errored while leaving the output context active. A shutdown of both directions also fails to stop the output context. Read rdmaout from the output context so each shutdown direction marks the corresponding RDMA context as errored. Fixes: 54db882f073a ("migration: implement the shutdown for RDMA QIOChannel= ") Signed-off-by: Yanfei Xu Reviewed-by: Fabiano Rosas Reviewed-by: Peter Xu --- migration/rdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migration/rdma.c b/migration/rdma.c index 438419d189..e17ace62b0 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -2982,7 +2982,7 @@ qio_channel_rdma_shutdown(QIOChannel *ioc, RCU_READ_LOCK_GUARD(); =20 rdmain =3D qatomic_rcu_read(&rioc->rdmain); - rdmaout =3D qatomic_rcu_read(&rioc->rdmain); + rdmaout =3D qatomic_rcu_read(&rioc->rdmaout); =20 switch (how) { case QIO_CHANNEL_SHUTDOWN_READ: --=20 2.20.1 From nobody Fri Aug 21 21:29:26 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=bytedance.com ARC-Seal: i=1; a=rsa-sha256; t=1787319465; cv=none; d=zohomail.com; s=zohoarc; b=Xo7bpuCEOXaTNfORlLUplQmUeOpIKR2LRiUFqLdV+RqBlLwev3DMQlAHtMhDzDvYhKufbww6wVQFEiktIAPDoglksucMqZMS94m+JzBuMb0HSq2RdQXXn2+aSGJIaEzwLHDD/FgISFnkX7l+VBjOjPMwkJ8e39dWvi5ZFc4K/uU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787319465; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mbrMK7SfgERS/fcoW3zju5EVeBLTM8IbfFvNM3o/rlI=; b=XnHbIvaw9rIenppRRyK0MuGRAdy5B3SOAzzkrBTrCoKf0vhXdFtSkvDdASCmTANT4QB/k4OxKZVvM7Ets8AkvJpILFNz0ZPP20QOAQuZ/Vic7x/uvSkJg7sqwp3I9lNtmylIk7zDw8REBMC1pblCLmuNdWVfY+Z6TlJDTQbTHUc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787319465601267.16942464019814; Fri, 21 Aug 2026 06:37:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wxPRH-0001t7-NL; Fri, 21 Aug 2026 09:37:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wxPRF-0001kE-KG for qemu-devel@nongnu.org; Fri, 21 Aug 2026 09:37:41 -0400 Received: from va-1-112.ptr.blmpb.com ([209.127.230.112]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wxPRD-0000m5-Ug for qemu-devel@nongnu.org; Fri, 21 Aug 2026 09:37:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=2212171451; d=bytedance.com; t=1787319455; h=from:subject: mime-version:from:date:message-id:subject:to:cc:reply-to:content-type: mime-version:in-reply-to:message-id; bh=mbrMK7SfgERS/fcoW3zju5EVeBLTM8IbfFvNM3o/rlI=; b=Sb7+S53herlQRmn6N/UazkH2g96aZBKdUejtUmWiZh5WffuGzNG5kR6I2GL/nVsgGybw3f VlHlEyyyvNvYrq7phbkbt/vjj9d7BJZucwBF/C+CAVPHUdj7/txSuOJbTpJmN7aoe7AE3C T33n5aDcbpAuhlDUu+ISZE5QYUpT+Euc72qs5AGw+W+ILTQ9Gav6827npcZzYFFVHd+9m3 2WpzS1GbjV53hJEBPxyUvH6xY1RkhbhpWvSTHTSm3L8LzQ8OIRLf7uQR5jHkChq1U6hOFP 6MwfJp+Za322n5ZONRnKxqIWgQmLZxR7ph+CAMRrBDTMameErstaBPXtcqgN7g== From: "Yanfei Xu" Mime-Version: 1.0 In-Reply-To: <20260821133559.3815727-1-yanfei.xu@bytedance.com> X-Mailer: git-send-email 2.20.1 To: Subject: [PATCH v2 2/3] migration/rdma: Post initial receive before accepting Cc: , , , , , "Yanfei Xu" X-Original-From: Yanfei Xu X-Lms-Return-Path: References: <20260821133559.3815727-1-yanfei.xu@bytedance.com> Content-Transfer-Encoding: quoted-printable Date: Fri, 21 Aug 2026 21:35:58 +0800 Message-Id: <20260821133559.3815727-3-yanfei.xu@bytedance.com> Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=209.127.230.112; envelope-from=yanfei.xu@bytedance.com; helo=va-1-112.ptr.blmpb.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bytedance.com) X-ZM-MESSAGEID: 1787319467469158500 Content-Type: text/plain; charset="utf-8" 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. Adding delays can easily reproduce it. For exmaple with sleep(1), error could be found at the source side: 2026-08-20T05:55:11.471421Z qemu_rdma_exchange_get_response_start CONTROL: = READY receiving... 2026-08-20T05:55:11.471422Z qemu_rdma_post_send_control CONTROL: sending QE= MU FILE.. 2026-08-20T05:55:11.471447Z qemu_rdma_poll_other other completion 2000 rece= ived left 0 2026-08-20T05:55:11.471589Z qemu_rdma_poll_recv completion 0 received (4000= ) left 0 2026-08-20T05:55:11.471592Z qemu_rdma_poll_other other completion 4000 rece= ived left 0 2026-08-20T05:55:11.471594Z qemu_rdma_exchange_get_response_start CONTROL: = READY receiving... 2026-08-20T05:55:11.471596Z qemu_rdma_post_send_control CONTROL: sending QE= MU FILE.. 2026-08-20T05:55:11.471617Z qemu_rdma_poll_other other completion 2000 rece= ived left 0 2026-08-20T05:55:11.705561Z qemu_rdma_close 2026-08-20T05:55:11.705587Z qemu_rdma_close 2026-08-20T05:55:11.705626Z qemu-system-x86_64: rdma migration: send pollin= g control error 2026-08-20T05:55:11.707001Z qemu-system-x86_64: warning: Early error. Sendi= ng error. 2026-08-20T05:55:11.707031Z qemu_rdma_post_send_control CONTROL: sending ER= ROR.. 2026-08-20T05:55:11.707038Z qemu-system-x86_64: warning: rdma migration: se= nd polling control error 2026-08-20T05:55:11.707301Z qemu_rdma_cleanup_disconnect 2026-08-20T05:55:11.710569Z qemu_rdma_cleanup_disconnect Fixes: 55cc1b5937a8 ("migration: create a dedicated connection for rdma ret= urn path") Signed-off-by: Yanfei Xu Reviewed-by: Peter Xu Reviewed-by: Jack Wang --- 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) } } =20 + ret =3D 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 =3D true; =20 - ret =3D 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); =20 return 0; --=20 2.20.1 From nobody Fri Aug 21 21:29:26 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=bytedance.com ARC-Seal: i=1; a=rsa-sha256; t=1787319485; cv=none; d=zohomail.com; s=zohoarc; b=cQwMBw/jT5PRAZog2+VONJOCf8loKl/H4/UxxP/8dtu5G1Y7oSQty0HvB9MBjgEkg4C41Enq+9PMPITirhT9MWcpx+0x0DdZpnJQT4BmpW6US5QppJ/iw9dvAm7GS+ulvZcNedAxfs4SYDl1pllCnS74qZYv6SwUVOscioBcdcA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787319485; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JcsPBIPKPtR3x0fEbCq/mhvKorUmjmYoZV6kGdQScWw=; b=ay3JIny9QO3Qi6keKxmGMDTBolCmJPcmA+Dvj+R3XU6bf0TYo6nnDz7xCRiRnZTzpKleGl4Ijj0tF7B9hyMlPV7dHZoiJyRfdeleR0bg8HbPmPyrhbKbi3dS3LJ5IEl9M2AYO8LFRGXg9It/UGPdlPrMYIK24AjPDX6SHhGS2tA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787319485310594.5534204238295; Fri, 21 Aug 2026 06:38:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wxPRU-0002g7-B3; Fri, 21 Aug 2026 09:37:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wxPRR-0002XB-MU for qemu-devel@nongnu.org; Fri, 21 Aug 2026 09:37:53 -0400 Received: from va-1-114.ptr.blmpb.com ([209.127.230.114]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wxPRP-0000np-L6 for qemu-devel@nongnu.org; Fri, 21 Aug 2026 09:37:53 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=2212171451; d=bytedance.com; t=1787319466; h=from:subject: mime-version:from:date:message-id:subject:to:cc:reply-to:content-type: mime-version:in-reply-to:message-id; bh=JcsPBIPKPtR3x0fEbCq/mhvKorUmjmYoZV6kGdQScWw=; b=F+d1KrnVYjJ6U1dLeT+TAmSe8eW/FDhnLmBGmHrDGP2Go2fAq1rWMRd0w8pT4CgdD6Kqc0 KyrdmpY3hL/0orXPXpQGnK0+LZf/d6EOF4L94rSslSosLSUr8JZImcbgwP99X3Yq3gVpFm TRyP0s4wiLZVAOsWG/Nnk/mNvJVjpxbv0bKsQqHDbmVfFbC++0Yr1xM6NvKzQGZs4MZOxg x1mqy/x0Go036LBYNue0ok7ZuqYpuW4OICnwTwIW44YHXsvaFY7/eaf1LDnQOOGm1IiF0E GxkfgSB9zVhl7tawCjJjbQieiVvm5AhNNDxdtPBHY04W575AFG7Bny6fktaWpw== References: <20260821133559.3815727-1-yanfei.xu@bytedance.com> Message-Id: <20260821133559.3815727-4-yanfei.xu@bytedance.com> X-Lms-Return-Path: From: "Yanfei Xu" Subject: [PATCH v2 3/3] migration/rdma: Retry control sends on full queue Date: Fri, 21 Aug 2026 21:35:59 +0800 Mime-Version: 1.0 In-Reply-To: <20260821133559.3815727-1-yanfei.xu@bytedance.com> To: Cc: , , , , , "Yanfei Xu" X-Original-From: Yanfei Xu X-Mailer: git-send-email 2.20.1 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=209.127.230.114; envelope-from=yanfei.xu@bytedance.com; helo=va-1-114.ptr.blmpb.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bytedance.com) X-ZM-MESSAGEID: 1787319487306158500 Content-Type: text/plain; charset="utf-8" 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. Move send posting and queue-full handling into a common helper. On ENOMEM, drain one outstanding RDMA write and retry the failed request once. If no write is outstanding, or the retry still fails, propagate the error. Signed-off-by: Yanfei Xu Reviewed-by: Peter Xu --- migration/rdma.c | 78 +++++++++++++++++++++++++++--------------- migration/trace-events | 2 +- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/migration/rdma.c b/migration/rdma.c index 6e8436ccc1..ee6da4f137 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -1530,6 +1530,52 @@ err_block_for_wrid: return -1; } =20 +/* + * Post a send work request, draining an outstanding RDMA write if the send + * queue is full. + */ +static int qemu_rdma_post_send(RDMAContext *rdma, + struct ibv_send_wr *send_wr, + Error **errp) +{ + struct ibv_send_wr *bad_wr; + uint64_t wr_id =3D send_wr->wr_id & RDMA_WRID_TYPE_MASK; + const char *wr_desc; + int ret; + + switch (wr_id) { + case RDMA_WRID_RDMA_WRITE: + wr_desc =3D "RDMA write"; + break; + case RDMA_WRID_SEND_CONTROL: + wr_desc =3D "control send"; + break; + default: + wr_desc =3D "send work request"; + break; + } + + ret =3D ibv_post_send(rdma->qp, send_wr, &bad_wr); + if (ret =3D=3D ENOMEM && rdma->nb_sent) { + trace_qemu_rdma_post_send_queue_full(send_wr->wr_id, rdma->nb_sent= ); + ret =3D qemu_rdma_block_for_wrid(rdma, RDMA_WRID_RDMA_WRITE, NULL); + if (ret < 0) { + error_setg(errp, "rdma migration: failed to make room for %s", + wr_desc); + return -1; + } + ret =3D ibv_post_send(rdma->qp, send_wr, &bad_wr); + } + + if (ret > 0) { + error_setg_errno(errp, ret, "rdma migration: post %s failed", + wr_desc); + return -1; + } + + return 0; +} + /* * Post a SEND message work request for the control channel * containing some data and block until the post completes. @@ -1540,7 +1586,6 @@ static int qemu_rdma_post_send_control(RDMAContext *r= dma, uint8_t *buf, { int ret; RDMAWorkRequestData *wr =3D &rdma->wr_data[RDMA_WRID_CONTROL]; - struct ibv_send_wr *bad_wr; struct ibv_sge sge =3D { .addr =3D (uintptr_t)(wr->control), .length =3D head->len + sizeof(RDMAControlHeade= r), @@ -1572,11 +1617,8 @@ static int qemu_rdma_post_send_control(RDMAContext *= rdma, uint8_t *buf, memcpy(wr->control + sizeof(RDMAControlHeader), buf, head->len); } =20 - - ret =3D ibv_post_send(rdma->qp, &send_wr, &bad_wr); - - if (ret > 0) { - error_setg(errp, "Failed to use post IB SEND for control"); + ret =3D qemu_rdma_post_send(rdma, &send_wr, errp); + if (ret < 0) { return -1; } =20 @@ -1836,7 +1878,6 @@ static int qemu_rdma_write_one(RDMAContext *rdma, { struct ibv_sge sge; struct ibv_send_wr send_wr =3D { 0 }; - struct ibv_send_wr *bad_wr; int reg_result_idx, ret, count =3D 0; uint64_t chunk, chunks; uint64_t chunk_size =3D migrate_rdma_chunk_size(); @@ -1850,7 +1891,6 @@ static int qemu_rdma_write_one(RDMAContext *rdma, .repeat =3D 1, }; =20 -retry: sge.addr =3D (uintptr_t)(block->local_host_addr + (current_addr - block->offset)); sge.length =3D length; @@ -2020,26 +2060,8 @@ retry: trace_qemu_rdma_write_one_post(chunk, sge.addr, send_wr.wr.rdma.remote= _addr, sge.length); =20 - /* - * ibv_post_send() does not return negative error numbers, - * per the specification they are positive - no idea why. - */ - ret =3D ibv_post_send(rdma->qp, &send_wr, &bad_wr); - - if (ret =3D=3D ENOMEM) { - trace_qemu_rdma_write_one_queue_full(); - ret =3D qemu_rdma_block_for_wrid(rdma, RDMA_WRID_RDMA_WRITE, NULL); - if (ret < 0) { - error_setg(errp, "rdma migration: failed to make " - "room in full send queue!"); - return -1; - } - - goto retry; - - } else if (ret > 0) { - error_setg_errno(errp, ret, - "rdma migration: post rdma write failed"); + ret =3D qemu_rdma_post_send(rdma, &send_wr, errp); + if (ret < 0) { return -1; } =20 diff --git a/migration/trace-events b/migration/trace-events index af0e784535..bc0c167a1a 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -251,7 +251,7 @@ qemu_rdma_unregister_waiting_complete(uint64_t chunk) "= Unregister for chunk: %" qemu_rdma_write_flush(int sent) "sent total: %d" qemu_rdma_write_one_block(int count, int block, uint64_t chunk, uint64_t c= urrent, uint64_t len, int nb_sent, int nb_chunks) "(%d) Not clobbering: blo= ck: %d chunk %" PRIu64 " current %" PRIu64 " len %" PRIu64 " %d %d" qemu_rdma_write_one_post(uint64_t chunk, long addr, long remote, uint32_t = len) "Posting chunk: %" PRIu64 ", addr: 0x%lx remote: 0x%lx, bytes %" PRIu32 -qemu_rdma_write_one_queue_full(void) "" +qemu_rdma_post_send_queue_full(uint64_t wr_id, int sent) "send queue full,= wr_id=3D%" PRIu64 ", outstanding writes=3D%d" qemu_rdma_write_one_recvregres(int mykey, int theirkey, uint64_t chunk) "R= eceived registration result: my key: 0x%x their key 0x%x, chunk %" PRIu64 qemu_rdma_write_one_sendreg(uint64_t chunk, int len, int index, int64_t of= fset) "Sending registration request chunk %" PRIu64 " for %d bytes, index: = %d, offset: %" PRId64 qemu_rdma_write_one_top(uint64_t chunks, uint64_t size) "Writing %" PRIu64= " chunks, (%" PRIu64 " MB)" --=20 2.20.1