get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2216198/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2216198,
    "url": "http://patchwork.ozlabs.org/api/patches/2216198/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260326025825.2427332-1-guoqing.zhang@amd.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260326025825.2427332-1-guoqing.zhang@amd.com>",
    "list_archive_url": null,
    "date": "2026-03-26T02:58:25",
    "name": "[v2] migration/rdma: add x-rdma-chunk-size parameter",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "2ce1ff8e827674498d061f471cc4c7cf2c32ad51",
    "submitter": {
        "id": 92875,
        "url": "http://patchwork.ozlabs.org/api/people/92875/?format=api",
        "name": "Samuel Zhang",
        "email": "guoqing.zhang@amd.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260326025825.2427332-1-guoqing.zhang@amd.com/mbox/",
    "series": [
        {
            "id": 497530,
            "url": "http://patchwork.ozlabs.org/api/series/497530/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=497530",
            "date": "2026-03-26T02:58:25",
            "name": "[v2] migration/rdma: add x-rdma-chunk-size parameter",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/497530/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2216198/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2216198/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=amd.com header.i=@amd.com header.a=rsa-sha256\n header.s=selector1 header.b=Nl3ArU10;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fh7wp0ZzGz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 26 Mar 2026 14:07:06 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w5b3K-0005Hy-Uo; Wed, 25 Mar 2026 23:06:34 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <GuoQing.Zhang@amd.com>)\n id 1w5b3G-0005HY-Hv\n for qemu-devel@nongnu.org; Wed, 25 Mar 2026 23:06:30 -0400",
            "from mail-westus3azon11012021.outbound.protection.outlook.com\n ([40.107.209.21] helo=PH8PR06CU001.outbound.protection.outlook.com)\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <GuoQing.Zhang@amd.com>)\n id 1w5b3D-0003DZ-TK\n for qemu-devel@nongnu.org; Wed, 25 Mar 2026 23:06:30 -0400",
            "from MN2PR15CA0063.namprd15.prod.outlook.com (2603:10b6:208:237::32)\n by PH7PR12MB7871.namprd12.prod.outlook.com (2603:10b6:510:27d::18)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.7; Thu, 26 Mar\n 2026 03:01:18 +0000",
            "from MN1PEPF0000ECDA.namprd02.prod.outlook.com\n (2603:10b6:208:237:cafe::93) by MN2PR15CA0063.outlook.office365.com\n (2603:10b6:208:237::32) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9723.32 via Frontend Transport; Thu,\n 26 Mar 2026 03:01:09 +0000",
            "from satlexmb07.amd.com (165.204.84.17) by\n MN1PEPF0000ECDA.mail.protection.outlook.com (10.167.242.134) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.9745.21 via Frontend Transport; Thu, 26 Mar 2026 03:01:18 +0000",
            "from hjbog-srdc-36.amd.com (10.180.168.240) by satlexmb07.amd.com\n (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Wed, 25 Mar\n 2026 22:01:14 -0500"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=W6RC5U9kYMYR3AMyBVO4tZHwIPo4igaGqJzVe9FR3lNFU5Hf15y7TJgkmGj5o4nSwKd4wvl/Ab55Hxv+5JPYc3ZQKn4ZCsEH99DNrJaDnRDink/BNsJROEhJyAAAE6eFmmDMSU4VypkwN7l98CGPDo2YRpFOas+RH73Ob1gShGI53NDgRmMikim9g2cMTeKp24FhJ3JfMDh/G1HJ21Pbzs6aKXHqBHNLNXl661Xm4SKhT5OV2lJa4o/6NRMOwPrbJG11TJE+P0qdmuD2soYUyuOUQ8Gerq7VFVxzRAfei/AQwytB4PlVFJ5+a6JTs05FOVR9l9Qeq+OVovXaojmUtw==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=R5jNeoglcJ4wWFOfFnUybZnO23avIOsxiLGWkT5+szc=;\n b=gIIVZBxxh/6x9io/+NToj6hzcAhpgE++URq0a1Zit8LGz4JkWtf52f/uBNlogmc9f5k6p2hkgoqdMA7vTsIfrwQUI0A/OAWQ9ZoxGcBMyxbx7BH73UY75bFntoIC8wFbO/6piElI7v2zRRe4XmzW+rMTKucTr+7AAWWxjb8JUR8lDUcCMgKohkKQWG/KHC4n/Q1yOcbZ6bfm/O4+WDn7kjpofo+nZ24sl+AruXC1vWekYY7QIbSyZucyyzkd4wgTmebvr9cnH1OXP05DaxgPAmGoPbAnhP0HSTx2h2M7H4tlCIul5+dTJ3RddODASpUByKDhkwVegH1us3vrb2/0Ag==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 165.204.84.17) smtp.rcpttodomain=nongnu.org smtp.mailfrom=amd.com; dmarc=pass\n (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com;\n dkim=none (message not signed); arc=none (0)",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=R5jNeoglcJ4wWFOfFnUybZnO23avIOsxiLGWkT5+szc=;\n b=Nl3ArU10/9PBL7rEYqjxHLsqblb41odW+TRifUVYVwsgZAEs5/WrRf1T/MZhahuiWRh5cFfzfev+z/0UBurflgQpiR6RcpKP/p2r8t/BNWnj+udJtZtNDctiRDYKOmvM0vl1YFbF3DAVQFHgEptv1BIEo20cqiQjjxgcKogu/pM=",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 165.204.84.17)\n smtp.mailfrom=amd.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=amd.com;",
        "Received-SPF": [
            "Pass (protection.outlook.com: domain of amd.com designates\n 165.204.84.17 as permitted sender) receiver=protection.outlook.com;\n client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C",
            "permerror client-ip=40.107.209.21;\n envelope-from=GuoQing.Zhang@amd.com;\n helo=PH8PR06CU001.outbound.protection.outlook.com"
        ],
        "From": "Samuel Zhang <guoqing.zhang@amd.com>",
        "To": "<qemu-devel@nongnu.org>",
        "CC": "<peterx@redhat.com>, <farosas@suse.de>, <lizhijian@fujitsu.com>,\n <eblake@redhat.com>, <armbru@redhat.com>, <Emily.Deng@amd.com>,\n <Victor.Zhao@amd.com>, <PengJu.Zhou@amd.com>, <Qing.Ma@amd.com>, Samuel Zhang\n <guoqing.zhang@amd.com>",
        "Subject": "[PATCH v2] migration/rdma: add x-rdma-chunk-size parameter",
        "Date": "Thu, 26 Mar 2026 10:58:25 +0800",
        "Message-ID": "<20260326025825.2427332-1-guoqing.zhang@amd.com>",
        "X-Mailer": "git-send-email 2.43.7",
        "In-Reply-To": "<20260316062308.1240426-1-guoqing.zhang@amd.com>",
        "References": "<20260316062308.1240426-1-guoqing.zhang@amd.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.180.168.240]",
        "X-ClientProxiedBy": "satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com\n (10.181.42.216)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "MN1PEPF0000ECDA:EE_|PH7PR12MB7871:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "2ca5fda3-146d-428d-8706-08de8ae3f3a4",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|82310400026|36860700016|1800799024|376014|22082099003|56012099003|18002099003;",
        "X-Microsoft-Antispam-Message-Info": "\n zy1ty7h3nw4+QIeYJxxBKkbYsow/Rnh9g1T10E7Ex43cBg78r97O1HQjz4brUjGnsJxJThmrMSbv147AIkwucLL1OV3thrTxFO72GSr7Ok8UKecH35eySKLu6nKWQK4kNW8AWyj3nXA9MuAw9NfBp/CJYX/mGH3RKR5MUFL8TeHlFhlyMGRY9/9nuN/IZ0yIgbaaNbGJJm2EL+yZaxpG2VmmFrzlkUKABAxVgDn/7Dbhi2Q+orE+2kCa80tA9MHLLfBSCYxfzOwl2sfJFAtBxtkM4zgbQcFNoiHSDs7R89xID1Hwor50fS10mUTv7wk6MbZUwP4uF7HuI/3GWTRQFTkiBd1HCCtGHtGE9KdZ4a7McSyh+cEEBaj97xw+bGnh8/KUhUmkSouu794jPlm/LhwG/BHGn+QL/5cM5QcmXrSahqAIP6X5RYbUnhrbarmI3gJUCflzeD20fl+CPw4tQIg8WbFjp44iZPFQgCqIt3bk0RYitS39myG6o03hBHfTYv7t+3JXd9BPwOnzG5LsaJ5JmrWft13+iUcTeGCLlhqHrC3IRQUwreq7S/Hp9zllYdwkRNdILxsP54XoFg2vgp3xlmoQI917IGfWtCg0d2MpOdakKvCc3/aKz6jkGqYx3BLnmGhSiDS6nOARa76tiCtC213hHJvKjtFE0Y4du4JaBeKjKz7DosAEt49cpoHLa87/gjqfGaVgIsMVcV24EAwKxO2KZDER7BiJ/0fpyPHmrkzzLwMbUM9P/FqFlo/ySqzTlMKUHr76hYhDcKHOWQ==",
        "X-Forefront-Antispam-Report": "CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:satlexmb07.amd.com; PTR:InfoDomainNonexistent; CAT:NONE;\n SFS:(13230040)(82310400026)(36860700016)(1800799024)(376014)(22082099003)(56012099003)(18002099003);\n DIR:OUT; SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n 7VkW5HM/EaMrp45H07ECuzQr5Vt1yh8Rk+dCGnb/Xn/D6Dl3XyS4c6GhtQBZzd18hKzfZ06EiKJUVwpWRqCDtvyMR7sOB8ypChFYfqtefp9nTL/wzWmYT+Bw52rOyJhCCrB0o6u3ubIlKRU9Y27Y3hqEJrw3WC/tWyK4gG/3JcSw6o4CxMAbukppJEut12eJbII1Q1WSmawH2/jn57zBw5+AUVb0640xaSBsAwoKMI8PY6r0w/aRbNt3MJELkNhVey6AWpevnU7rKwbOZwSGDrzzsHuqURF8UyftFxMHpEes5Xvr4H0oHmIZRrcU1TD3Pqj8XRkxm58LjqPLLu1e5BG2DlCF57lEthowLBhxtBrDuZHNoWGa1LSYuurTql1DvmJPSbgsSdYAuYIVoIlrm7lCPrfNcxBecEopG+gbOvnXZsTRI4RS/P/IqEO0p7fs",
        "X-OriginatorOrg": "amd.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "26 Mar 2026 03:01:18.2560 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 2ca5fda3-146d-428d-8706-08de8ae3f3a4",
        "X-MS-Exchange-CrossTenant-Id": "3dd8961f-e488-4e60-8e11-a82d994e183d",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17];\n Helo=[satlexmb07.amd.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n MN1PEPF0000ECDA.namprd02.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PH7PR12MB7871",
        "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, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n 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 <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "The default 1MB RDMA chunk size causes slow live migration because\neach chunk triggers a write_flush (ibv_post_send). For 8GB RAM,\n1MB chunk size produce ~15000 flushes vs ~3700 with 1024MB chunk size.\n\nAdd x-rdma-chunk-size parameter to configure the RDMA chunk size for\nfaster migration.\nUsage: `migrate_set_parameter x-rdma-chunk-size 1024M`\n\nPerformance with RDMA live migration of 8GB RAM VM:\n\n| x-rdma-chunk-size (B) | time (s) | throughput (MB/s) |\n|-----------------------|----------|-------------------|\n| 1M (default)          | 37.915   |  1,007            |\n| 32M                   | 17.880   |  2,260            |\n| 1024M                 |  4.368   | 17,529            |\n\nSigned-off-by: Samuel Zhang <guoqing.zhang@amd.com>\n---\nv2:\n- Renamed x-rdma-chunk-shift to x-rdma-chunk-size (byte count)\n- Added validation in migrate_params_check()\n- Added hmp_migrate_set_parameter() support\n- Added hmp_info_migrate_parameters() support\n- Added migrate_mark_all_params_present()\n- Use qemu_strtosz() for size suffix support\n\n migration/migration-hmp-cmds.c | 17 +++++++++++++++++\n migration/options.c            | 32 +++++++++++++++++++++++++++++++-\n migration/options.h            |  1 +\n migration/rdma.c               | 30 ++++++++++++++++--------------\n qapi/migration.json            | 11 +++++++++--\n 5 files changed, 74 insertions(+), 17 deletions(-)",
    "diff": "diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c\nindex 0a193b8f54..2c005c08a6 100644\n--- a/migration/migration-hmp-cmds.c\n+++ b/migration/migration-hmp-cmds.c\n@@ -451,6 +451,13 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)\n                            params->direct_io ? \"on\" : \"off\");\n         }\n \n+        if (params->has_x_rdma_chunk_size) {\n+            monitor_printf(mon, \"%s: %\" PRIu64 \" bytes\\n\",\n+                           MigrationParameter_str(\n+                               MIGRATION_PARAMETER_X_RDMA_CHUNK_SIZE),\n+                           params->x_rdma_chunk_size);\n+        }\n+\n         assert(params->has_cpr_exec_command);\n         monitor_print_cpr_exec_command(mon, params->cpr_exec_command);\n     }\n@@ -730,6 +737,16 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)\n         p->has_mode = true;\n         visit_type_MigMode(v, param, &p->mode, &err);\n         break;\n+    case MIGRATION_PARAMETER_X_RDMA_CHUNK_SIZE:\n+        p->has_x_rdma_chunk_size = true;\n+        ret = qemu_strtosz(valuestr, NULL, &valuebw);\n+        if (ret != 0 || valuebw < (1<<20) || valuebw > (1<<30)\n+            || !is_power_of_2(valuebw)) {\n+            error_setg(&err, \"Invalid size %s\", valuestr);\n+            break;\n+        }\n+        p->x_rdma_chunk_size = valuebw;\n+        break;\n     case MIGRATION_PARAMETER_DIRECT_IO:\n         p->has_direct_io = true;\n         visit_type_bool(v, param, &p->direct_io, &err);\ndiff --git a/migration/options.c b/migration/options.c\nindex f33b297929..91dd874b5e 100644\n--- a/migration/options.c\n+++ b/migration/options.c\n@@ -90,6 +90,7 @@ const PropertyInfo qdev_prop_StrOrNull;\n \n #define DEFAULT_MIGRATE_VCPU_DIRTY_LIMIT_PERIOD     1000    /* milliseconds */\n #define DEFAULT_MIGRATE_VCPU_DIRTY_LIMIT            1       /* MB/s */\n+#define DEFAULT_MIGRATE_X_RDMA_CHUNK_SIZE           (1<<20) /* 1MB */\n \n const Property migration_properties[] = {\n     DEFINE_PROP_BOOL(\"store-global-state\", MigrationState,\n@@ -183,6 +184,9 @@ const Property migration_properties[] = {\n     DEFINE_PROP_ZERO_PAGE_DETECTION(\"zero-page-detection\", MigrationState,\n                        parameters.zero_page_detection,\n                        ZERO_PAGE_DETECTION_MULTIFD),\n+    DEFINE_PROP_UINT64(\"x-rdma-chunk-size\", MigrationState,\n+                      parameters.x_rdma_chunk_size,\n+                      DEFAULT_MIGRATE_X_RDMA_CHUNK_SIZE),\n \n     /* Migration capabilities */\n     DEFINE_PROP_MIG_CAP(\"x-xbzrle\", MIGRATION_CAPABILITY_XBZRLE),\n@@ -993,6 +997,15 @@ ZeroPageDetection migrate_zero_page_detection(void)\n     return s->parameters.zero_page_detection;\n }\n \n+uint64_t migrate_rdma_chunk_size(void)\n+{\n+    MigrationState *s = migrate_get_current();\n+    uint64_t size = s->parameters.x_rdma_chunk_size;\n+\n+    assert((1<<20) <= size && size <= (1<<30) && is_power_of_2(size));\n+    return size;\n+}\n+\n /* parameters helpers */\n \n AnnounceParameters *migrate_announce_params(void)\n@@ -1055,7 +1068,7 @@ static void migrate_mark_all_params_present(MigrationParameters *p)\n         &p->has_announce_step, &p->has_block_bitmap_mapping,\n         &p->has_x_vcpu_dirty_limit_period, &p->has_vcpu_dirty_limit,\n         &p->has_mode, &p->has_zero_page_detection, &p->has_direct_io,\n-        &p->has_cpr_exec_command,\n+        &p->has_x_rdma_chunk_size, &p->has_cpr_exec_command,\n     };\n \n     len = ARRAY_SIZE(has_fields);\n@@ -1227,6 +1240,15 @@ bool migrate_params_check(MigrationParameters *params, Error **errp)\n         return false;\n     }\n \n+    if (params->has_x_rdma_chunk_size &&\n+        (params->x_rdma_chunk_size < (1<<20) ||\n+         params->x_rdma_chunk_size > (1<<30) ||\n+         !is_power_of_2(params->x_rdma_chunk_size))) {\n+        error_setg(errp, \"Option x_rdma_chunk_size expects \"\n+                   \"a power of 2 in the range 1M to 1024M\");\n+        return false;\n+    }\n+\n     if (!check_dirty_bitmap_mig_alias_map(params->block_bitmap_mapping, errp)) {\n         error_prepend(errp, \"Invalid mapping given for block-bitmap-mapping: \");\n         return false;\n@@ -1391,6 +1413,10 @@ static void migrate_params_test_apply(MigrationParameters *params,\n         dest->direct_io = params->direct_io;\n     }\n \n+    if (params->has_x_rdma_chunk_size) {\n+        dest->x_rdma_chunk_size = params->x_rdma_chunk_size;\n+    }\n+\n     if (params->has_cpr_exec_command) {\n         dest->cpr_exec_command = params->cpr_exec_command;\n     }\n@@ -1517,6 +1543,10 @@ static void migrate_params_apply(MigrationParameters *params)\n         s->parameters.direct_io = params->direct_io;\n     }\n \n+    if (params->has_x_rdma_chunk_size) {\n+        s->parameters.x_rdma_chunk_size = params->x_rdma_chunk_size;\n+    }\n+\n     if (params->has_cpr_exec_command) {\n         qapi_free_strList(s->parameters.cpr_exec_command);\n         s->parameters.cpr_exec_command =\ndiff --git a/migration/options.h b/migration/options.h\nindex b502871097..b46221998a 100644\n--- a/migration/options.h\n+++ b/migration/options.h\n@@ -87,6 +87,7 @@ const char *migrate_tls_creds(void);\n const char *migrate_tls_hostname(void);\n uint64_t migrate_xbzrle_cache_size(void);\n ZeroPageDetection migrate_zero_page_detection(void);\n+uint64_t migrate_rdma_chunk_size(void);\n \n /* parameters helpers */\n \ndiff --git a/migration/rdma.c b/migration/rdma.c\nindex 55ab85650a..3e37a1d440 100644\n--- a/migration/rdma.c\n+++ b/migration/rdma.c\n@@ -45,10 +45,12 @@\n #define RDMA_RESOLVE_TIMEOUT_MS 10000\n \n /* Do not merge data if larger than this. */\n-#define RDMA_MERGE_MAX (2 * 1024 * 1024)\n-#define RDMA_SIGNALED_SEND_MAX (RDMA_MERGE_MAX / 4096)\n+static inline uint64_t rdma_merge_max(void)\n+{\n+    return migrate_rdma_chunk_size() * 2;\n+}\n \n-#define RDMA_REG_CHUNK_SHIFT 20 /* 1 MB */\n+#define RDMA_SIGNALED_SEND_MAX 512\n \n /*\n  * This is only for non-live state being migrated.\n@@ -527,21 +529,21 @@ static int qemu_rdma_exchange_send(RDMAContext *rdma, RDMAControlHeader *head,\n static inline uint64_t ram_chunk_index(const uint8_t *start,\n                                        const uint8_t *host)\n {\n-    return ((uintptr_t) host - (uintptr_t) start) >> RDMA_REG_CHUNK_SHIFT;\n+    return ((uintptr_t) host - (uintptr_t) start) / migrate_rdma_chunk_size();\n }\n \n static inline uint8_t *ram_chunk_start(const RDMALocalBlock *rdma_ram_block,\n                                        uint64_t i)\n {\n     return (uint8_t *)(uintptr_t)(rdma_ram_block->local_host_addr +\n-                                  (i << RDMA_REG_CHUNK_SHIFT));\n+                                  (i * migrate_rdma_chunk_size()));\n }\n \n static inline uint8_t *ram_chunk_end(const RDMALocalBlock *rdma_ram_block,\n                                      uint64_t i)\n {\n     uint8_t *result = ram_chunk_start(rdma_ram_block, i) +\n-                                         (1UL << RDMA_REG_CHUNK_SHIFT);\n+                                         migrate_rdma_chunk_size();\n \n     if (result > (rdma_ram_block->local_host_addr + rdma_ram_block->length)) {\n         result = rdma_ram_block->local_host_addr + rdma_ram_block->length;\n@@ -1841,6 +1843,7 @@ static int qemu_rdma_write_one(RDMAContext *rdma,\n     struct ibv_send_wr *bad_wr;\n     int reg_result_idx, ret, count = 0;\n     uint64_t chunk, chunks;\n+    uint64_t chunk_size = migrate_rdma_chunk_size();\n     uint8_t *chunk_start, *chunk_end;\n     RDMALocalBlock *block = &(rdma->local_ram_blocks.block[current_index]);\n     RDMARegister reg;\n@@ -1861,22 +1864,21 @@ retry:\n     chunk_start = ram_chunk_start(block, chunk);\n \n     if (block->is_ram_block) {\n-        chunks = length / (1UL << RDMA_REG_CHUNK_SHIFT);\n+        chunks = length / chunk_size;\n \n-        if (chunks && ((length % (1UL << RDMA_REG_CHUNK_SHIFT)) == 0)) {\n+        if (chunks && ((length % chunk_size) == 0)) {\n             chunks--;\n         }\n     } else {\n-        chunks = block->length / (1UL << RDMA_REG_CHUNK_SHIFT);\n+        chunks = block->length / chunk_size;\n \n-        if (chunks && ((block->length % (1UL << RDMA_REG_CHUNK_SHIFT)) == 0)) {\n+        if (chunks && ((block->length % chunk_size) == 0)) {\n             chunks--;\n         }\n     }\n \n     trace_qemu_rdma_write_one_top(chunks + 1,\n-                                  (chunks + 1) *\n-                                  (1UL << RDMA_REG_CHUNK_SHIFT) / 1024 / 1024);\n+                                  (chunks + 1) * chunk_size / 1024 / 1024);\n \n     chunk_end = ram_chunk_end(block, chunk + chunks);\n \n@@ -2176,7 +2178,7 @@ static int qemu_rdma_write(RDMAContext *rdma,\n     rdma->current_length += len;\n \n     /* flush it if buffer is too large */\n-    if (rdma->current_length >= RDMA_MERGE_MAX) {\n+    if (rdma->current_length >= rdma_merge_max()) {\n         return qemu_rdma_write_flush(rdma, errp);\n     }\n \n@@ -3522,7 +3524,7 @@ int rdma_registration_handle(QEMUFile *f)\n                 } else {\n                     chunk = reg->key.chunk;\n                     host_addr = block->local_host_addr +\n-                        (reg->key.chunk * (1UL << RDMA_REG_CHUNK_SHIFT));\n+                        (reg->key.chunk * migrate_rdma_chunk_size());\n                     /* Check for particularly bad chunk value */\n                     if (host_addr < (void *)block->local_host_addr) {\n                         error_report(\"rdma: bad chunk for block %s\"\ndiff --git a/qapi/migration.json b/qapi/migration.json\nindex 7134d4ce47..94d2c1c65f 100644\n--- a/qapi/migration.json\n+++ b/qapi/migration.json\n@@ -806,7 +806,7 @@\n #\n # Features:\n #\n-# @unstable: Members @x-checkpoint-delay and\n+# @unstable: Members @x-checkpoint-delay, @x-rdma-chunk-size, and\n #     @x-vcpu-dirty-limit-period are experimental.\n #\n # Since: 2.4\n@@ -831,6 +831,7 @@\n            'mode',\n            'zero-page-detection',\n            'direct-io',\n+           { 'name': 'x-rdma-chunk-size', 'features': [ 'unstable' ] },\n            'cpr-exec-command'] }\n \n ##\n@@ -1007,9 +1008,13 @@\n #     is @cpr-exec.  The first list element is the program's filename,\n #     the remainder its arguments.  (Since 10.2)\n #\n+# @x-rdma-chunk-size: RDMA memory registration chunk size in bytes.\n+#     Default is 1M.  Must be a power of 2 in the range [1M, 1024M].\n+#     Only takes effect for RDMA migration.  (Since 11.1)\n+#\n # Features:\n #\n-# @unstable: Members @x-checkpoint-delay and\n+# @unstable: Members @x-checkpoint-delay, @x-rdma-chunk-size, and\n #     @x-vcpu-dirty-limit-period are experimental.\n #\n # Since: 2.4\n@@ -1046,6 +1051,8 @@\n             '*mode': 'MigMode',\n             '*zero-page-detection': 'ZeroPageDetection',\n             '*direct-io': 'bool',\n+            '*x-rdma-chunk-size': { 'type': 'uint64',\n+                                    'features': [ 'unstable' ] },\n             '*cpr-exec-command': [ 'str' ]} }\n \n ##\n",
    "prefixes": [
        "v2"
    ]
}