[{"id":3677300,"web_url":"http://patchwork.ozlabs.org/comment/3677300/","msgid":"<875x5tzfmn.fsf@suse.de>","list_archive_url":null,"date":"2026-04-14T16:11:12","subject":"Re: [PATCH v5] migration/rdma: add x-rdma-chunk-size parameter","submitter":{"id":85343,"url":"http://patchwork.ozlabs.org/api/people/85343/","name":"Fabiano Rosas","email":"farosas@suse.de"},"content":"Samuel Zhang <guoqing.zhang@amd.com> writes:\n\n> The default 1MB RDMA chunk size causes slow live migration because\n> each chunk triggers a write_flush (ibv_post_send). For 8GB RAM,\n> 1MB chunk size produces ~15000 flushes vs ~3700 with 1024MB chunk size.\n>\n> Add x-rdma-chunk-size parameter to configure the RDMA chunk size for\n> faster migration.\n> Usage: `migrate_set_parameter x-rdma-chunk-size 1024M`\n>\n> Performance 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>\n> Signed-off-by: Samuel Zhang <guoqing.zhang@amd.com>\n> Acked-by: Markus Armbruster <armbru@redhat.com>\n> Acked-by: Li Zhijian <lizhijian@fujitsu.com>\n> Tested-by: Li Zhijian <lizhijian@fujitsu.com>\n> ---\n> v2:\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> v3: [Markus]\n> - Use visit_type_size() in HMP set parameter\n> - Use MiB/GiB constants\n> v4: [Markus]\n> - Remove superfluous comment on DEFAULT_MIGRATE_X_RDMA_CHUNK_SIZE\n> - Use \"Only applies when migrating via RDMA\" in QAPI doc\n> v5:\n> - Document that x-rdma-chunk-size must be set to the same value on both\n>     source and destination before migration starts.\n> - Add Acked-by and Tested-by from Li Zhijian.\n>\n>  migration/migration-hmp-cmds.c | 11 +++++++++++\n>  migration/options.c            | 33 ++++++++++++++++++++++++++++++++-\n>  migration/options.h            |  1 +\n>  migration/rdma.c               | 30 ++++++++++++++++--------------\n>  qapi/migration.json            | 13 +++++++++++--\n>  5 files changed, 71 insertions(+), 17 deletions(-)\n>\n> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c\n> index 0a193b8f54..4f6c1dbf89 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> @@ -734,6 +741,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)\n>          p->has_direct_io = true;\n>          visit_type_bool(v, param, &p->direct_io, &err);\n>          break;\n> +    case MIGRATION_PARAMETER_X_RDMA_CHUNK_SIZE:\n> +        p->has_x_rdma_chunk_size = true;\n> +        visit_type_size(v, param, &p->x_rdma_chunk_size, &err);\n> +        break;\n>      case MIGRATION_PARAMETER_CPR_EXEC_COMMAND: {\n>          /*\n>           * NOTE: g_autofree will only auto g_free() the strv array when\n> diff --git a/migration/options.c b/migration/options.c\n> index 7556fbc06b..2b5158200b 100644\n> --- a/migration/options.c\n> +++ b/migration/options.c\n> @@ -13,6 +13,7 @@\n>  \n>  #include \"qemu/osdep.h\"\n>  #include \"qemu/error-report.h\"\n> +#include \"qemu/units.h\"\n>  #include \"exec/target_page.h\"\n>  #include \"qapi/clone-visitor.h\"\n>  #include \"qapi/error.h\"\n> @@ -90,6 +91,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           MiB\n>  \n>  const Property migration_properties[] = {\n>      DEFINE_PROP_BOOL(\"store-global-state\", MigrationState,\n> @@ -183,6 +185,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> @@ -1000,6 +1005,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(MiB <= size && size <= GiB && is_power_of_2(size));\n> +    return size;\n> +}\n> +\n>  /* parameters helpers */\n>  \n>  AnnounceParameters *migrate_announce_params(void)\n> @@ -1062,7 +1076,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> @@ -1273,6 +1287,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 < MiB ||\n> +         params->x_rdma_chunk_size > GiB ||\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 1MiB to 1024MiB\");\n> +        return false;\n> +    }\n> +\n>      return true;\n>  }\n>  \n> @@ -1398,6 +1421,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> @@ -1524,6 +1551,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 =\n> diff --git a/migration/options.h b/migration/options.h\n> index 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>  \n> diff --git a/migration/rdma.c b/migration/rdma.c\n> index 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\"\n> diff --git a/qapi/migration.json b/qapi/migration.json\n> index 7134d4ce47..0db115ec5e 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,15 @@\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 1MiB.  Must be a power of 2 in the range\n> +#     [1MiB, 1024MiB].  Only applies when migrating via RDMA.\n> +#     Must be set to the same value on both source and destination\n> +#     before migration starts.  (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 +1053,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\nAcked-by: Fabiano Rosas <farosas@suse.de>","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=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=BlxPt5gO;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=CI2Iq48u;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=BlxPt5gO;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=CI2Iq48u;\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=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)","smtp-out1.suse.de;\n dkim=pass header.d=suse.de header.s=susede2_rsa header.b=BlxPt5gO;\n dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=CI2Iq48u"],"Received":["from lists1p.gnu.org (lists1p.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 4fw8Rj2DRBz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 02:12:01 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wCgMI-00050M-Fo; Tue, 14 Apr 2026 12:11:26 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <farosas@suse.de>) id 1wCgMG-0004zR-Jj\n for qemu-devel@nongnu.org; Tue, 14 Apr 2026 12:11:24 -0400","from smtp-out1.suse.de ([195.135.223.130])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <farosas@suse.de>) id 1wCgME-0004Nt-52\n for qemu-devel@nongnu.org; Tue, 14 Apr 2026 12:11:24 -0400","from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org\n [IPv6:2a07:de40:b281:104:10:150:64:97])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-out1.suse.de (Postfix) with ESMTPS id 4EE346A8C4;\n Tue, 14 Apr 2026 16:11:19 +0000 (UTC)","from imap1.dmz-prg2.suse.org (localhost [127.0.0.1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id DFF1C4B521;\n Tue, 14 Apr 2026 16:11:18 +0000 (UTC)","from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167])\n by imap1.dmz-prg2.suse.org with ESMTPSA id HPd7KyZn3mlVYwAAD6G6ig\n (envelope-from <farosas@suse.de>); Tue, 14 Apr 2026 16:11:18 +0000"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776183079;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=xWSVVoxSb5wBAmySmkuBOM4XrDfX0XFdBiMFTttefAw=;\n b=BlxPt5gOE+UF9cCGaxYY0MoiS1gDPxD8ILBRKVMQ9NEJkJ7CLPPR8VTuZRW05Y2fTq5tzY\n 7Mk77lA9h/NT79uMQlWC+5MYxJJEjL5C3zMz8dSoGqzH50OeGMm+MZjjoulxn54aiXh8hU\n czG8DTcJ2ZSDWJqqg3EsWjBGriUcv/k=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776183079;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=xWSVVoxSb5wBAmySmkuBOM4XrDfX0XFdBiMFTttefAw=;\n b=CI2Iq48u5nhSo6Qnfcmx9wKDkPaxiaj/2IUp8SFg0sTcONybOFwZ2EcJsXjoJbTfUPsGT8\n rcOhz6IxFxb6EWAg==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776183079;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=xWSVVoxSb5wBAmySmkuBOM4XrDfX0XFdBiMFTttefAw=;\n b=BlxPt5gOE+UF9cCGaxYY0MoiS1gDPxD8ILBRKVMQ9NEJkJ7CLPPR8VTuZRW05Y2fTq5tzY\n 7Mk77lA9h/NT79uMQlWC+5MYxJJEjL5C3zMz8dSoGqzH50OeGMm+MZjjoulxn54aiXh8hU\n czG8DTcJ2ZSDWJqqg3EsWjBGriUcv/k=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776183079;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=xWSVVoxSb5wBAmySmkuBOM4XrDfX0XFdBiMFTttefAw=;\n b=CI2Iq48u5nhSo6Qnfcmx9wKDkPaxiaj/2IUp8SFg0sTcONybOFwZ2EcJsXjoJbTfUPsGT8\n rcOhz6IxFxb6EWAg=="],"From":"Fabiano Rosas <farosas@suse.de>","To":"Samuel Zhang <guoqing.zhang@amd.com>, qemu-devel@nongnu.org","Cc":"peterx@redhat.com, lizhijian@fujitsu.com, eblake@redhat.com,\n armbru@redhat.com, Emily.Deng@amd.com, Victor.Zhao@amd.com,\n PengJu.Zhou@amd.com, Qing.Ma@amd.com, Samuel Zhang <guoqing.zhang@amd.com>","Subject":"Re: [PATCH v5] migration/rdma: add x-rdma-chunk-size parameter","In-Reply-To":"<20260413035703.2602065-1-guoqing.zhang@amd.com>","References":"<20260413035703.2602065-1-guoqing.zhang@amd.com>","Date":"Tue, 14 Apr 2026 13:11:12 -0300","Message-ID":"<875x5tzfmn.fsf@suse.de>","MIME-Version":"1.0","Content-Type":"text/plain","X-Rspamd-Action":"no action","X-Rspamd-Server":"rspamd2.dmz-prg2.suse.org","X-Spamd-Result":"default: False [-4.51 / 50.00]; BAYES_HAM(-3.00)[100.00%];\n NEURAL_HAM_LONG(-1.00)[-1.000];\n NEURAL_HAM_SHORT(-0.20)[-1.000];\n R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n MIME_GOOD(-0.10)[text/plain]; MX_GOOD(-0.01)[];\n RCVD_VIA_SMTP_AUTH(0.00)[]; ARC_NA(0.00)[];\n MISSING_XM_UA(0.00)[]; FUZZY_RATELIMITED(0.00)[rspamd.com];\n TO_DN_SOME(0.00)[]; MIME_TRACE(0.00)[0:+];\n RCVD_TLS_ALL(0.00)[]; MID_RHS_MATCH_FROM(0.00)[];\n SPAMHAUS_XBL(0.00)[2a07:de40:b281:104:10:150:64:97:from];\n FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[];\n RCPT_COUNT_SEVEN(0.00)[11]; RCVD_COUNT_TWO(0.00)[2];\n TO_MATCH_ENVRCPT_ALL(0.00)[];\n DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo,imap1.dmz-prg2.suse.org:rdns,suse.de:dkim,suse.de:mid,suse.de:email,amd.com:email];\n DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n DKIM_TRACE(0.00)[suse.de:+]","X-Rspamd-Queue-Id":"4EE346A8C4","X-Spam-Score":"-4.51","Received-SPF":"pass client-ip=195.135.223.130; envelope-from=farosas@suse.de;\n helo=smtp-out1.suse.de","X-Spam_score_int":"-43","X-Spam_score":"-4.4","X-Spam_bar":"----","X-Spam_report":"(-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001,\n RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001,\n 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"}},{"id":3677419,"web_url":"http://patchwork.ozlabs.org/comment/3677419/","msgid":"<ad7A6dUi88Lfohqm@x1.local>","list_archive_url":null,"date":"2026-04-14T22:34:17","subject":"Re: [PATCH v5] migration/rdma: add x-rdma-chunk-size parameter","submitter":{"id":67717,"url":"http://patchwork.ozlabs.org/api/people/67717/","name":"Peter Xu","email":"peterx@redhat.com"},"content":"On Mon, Apr 13, 2026 at 11:57:03AM +0800, Samuel Zhang wrote:\n> The default 1MB RDMA chunk size causes slow live migration because\n> each chunk triggers a write_flush (ibv_post_send). For 8GB RAM,\n> 1MB chunk size produces ~15000 flushes vs ~3700 with 1024MB chunk size.\n> \n> Add x-rdma-chunk-size parameter to configure the RDMA chunk size for\n> faster migration.\n> Usage: `migrate_set_parameter x-rdma-chunk-size 1024M`\n> \n> Performance 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> \n> Signed-off-by: Samuel Zhang <guoqing.zhang@amd.com>\n> Acked-by: Markus Armbruster <armbru@redhat.com>\n> Acked-by: Li Zhijian <lizhijian@fujitsu.com>\n> Tested-by: Li Zhijian <lizhijian@fujitsu.com>\n\nAcked-by: Peter Xu <peterx@redhat.com>","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=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=B1yFxKr6;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=google header.b=S5CCXkeq;\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=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.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 4fwJxZ22Dtz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 08:34:56 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wCmKz-00025G-Rd; Tue, 14 Apr 2026 18:34:29 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <peterx@redhat.com>) id 1wCmKy-00024e-TC\n for qemu-devel@nongnu.org; Tue, 14 Apr 2026 18:34:28 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <peterx@redhat.com>) id 1wCmKv-0007S8-1D\n for qemu-devel@nongnu.org; Tue, 14 Apr 2026 18:34:28 -0400","from mail-qv1-f72.google.com (mail-qv1-f72.google.com\n [209.85.219.72]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-671-26lG5qE7PzmZBzDCuBwM4w-1; Tue, 14 Apr 2026 18:34:21 -0400","by mail-qv1-f72.google.com with SMTP id\n 6a1803df08f44-8ae6aa148a7so2068306d6.0\n for <qemu-devel@nongnu.org>; Tue, 14 Apr 2026 15:34:21 -0700 (PDT)","from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id\n 6a1803df08f44-8acb508807fsm58307466d6.48.2026.04.14.15.34.19\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 14 Apr 2026 15:34:19 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776206063;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=0NjEL5s6syEAzbqovTTDxGPrHujVvSu2wfeNkkEez/c=;\n b=B1yFxKr6TKzm/ImNSa0H65cGyoSvyxfrZwL8WsKoRnBf8q73fa3gK7hYcHN545NEFoNMr5\n DLhc+cWyrrNnvJQf1Ix0Pw8fk9mQ+pYS8Nd36UDf/c2WyXmEYYfC2OaUUkg4U/wcKJdydy\n VbRQN+dc4VWiOG0pnan1MK8vpYSTPSk=","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=redhat.com; s=google; t=1776206061; x=1776810861; darn=nongnu.org;\n h=in-reply-to:content-disposition:mime-version:references:message-id\n :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to;\n bh=0NjEL5s6syEAzbqovTTDxGPrHujVvSu2wfeNkkEez/c=;\n b=S5CCXkeqiqcSHJAXzBiQxu69Qc5D+Jqu3fZTrx6NL5XEuv220jlnJ3Qw+AMeMoNLUx\n RuUbfkqdoxgNNQi8xdnlj9hVz3w4bnKLVjvsPyDlKUoGnLhYpLk2nSAYo8e1IwWB+zQJ\n fQaCDU1uOPhtyfP5vDoFHcvDWPzLl4bBlSjC3LVNBsGlzHT5ftDaJuUOMN9R9LIeIhFo\n A8WtYCgD04ZjfP6tC04+Q22r3cxy7ljuSt6RLlVS7wUL83oeNTlbsOx8nGVfdhBouJH6\n tPz/2vsUG7DhkdjGMvx9NB4rvRJev9WqhIyUn6THIQNs6vnwESt+KOevqtjs3ia8hE+h\n UnbQ=="],"X-MC-Unique":"26lG5qE7PzmZBzDCuBwM4w-1","X-Mimecast-MFC-AGG-ID":"26lG5qE7PzmZBzDCuBwM4w_1776206061","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776206061; x=1776810861;\n h=in-reply-to:content-disposition:mime-version:references:message-id\n :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=0NjEL5s6syEAzbqovTTDxGPrHujVvSu2wfeNkkEez/c=;\n b=Bz94ak2yyk1FHr9TkE+DG4hxl8pXRVkID6ea1K3TCK6eVl6Jc0q7D1ViDhYqBXoNN9\n Re+QoWLVF0SbHqewLcGuWm1CWpHCG2HQs/xv9kEcBF7i29Jum3/TSNs5tNP2f0QkB0T9\n wwksQpsGulg/n8twlC/6zwfumezrEWi/JDy/Bx1rVQuT9d2Sh2jtD3/8IXV2thz0HB3D\n BowXbZGV9G427D9NALYQPWO+9s3YByRMSzt0ch39Sk5tppCZCEJzKC7L9wBzJsKtkX0N\n T78OKA9UDhm7kWTjpXMkrHN0TNOa363vjWsWYuQgco6RKfWkB1MAd0nrxrmiPTynAU/6\n Idlg==","X-Gm-Message-State":"AOJu0Yw/YxAGUMv4v9Z9CRgTDQ28n+bf7XtF86GO11QxKfIfzmjE2dkH\n eZj4D665Cn4TuNYa5KT7riFy1EXzWdJszFJvgX1J8S8AFz+CxhBQmQtyDsloY0P6u0sDmYwelPF\n 00tFBmeLtpnXDvsZ/uNTRyEkMXhRMJesEE14df66muyUzq6VatV//0d7i","X-Gm-Gg":"AeBDievvB6ZWqlyDf5VXMUCKmIKTKkTG9sNoWw56PJU/fWGAoO1/n5ERVfG//XbQplx\n Ivk03QeHBZa7V9A0wInt/ERgCsim56nqwZVw17cDl7ly6ZzrvyLNb6yrotjU1e6ortnaU4VTP8z\n Lat7LgRrHrRXpmiwAdCpEr+aRW0REMFTHg5zev/DHMWumj9ajY5draWRMGTh9+MHF1WRW0r97fR\n l/jfCedQlR0pj57TrUBs3TI6hqP//UOAuoh8hfUkB5f+3ofMDUr7j/VZFZjP44t3AZRd3pmPSTi\n SaOm5TzxttxstC5Xt7kNCIRyBkMX3Ag4k0dmUw/pXX9fFBsjoYvGseCuG5K1UU3RlgalBXwKVSk\n qj3lIoZCOSqL3pyKXtEPIFggverLp6Ex5e3+ypItzFHPDA5f9OT/22a+CTA==","X-Received":["by 2002:a0c:e014:0:b0:89c:6692:1d83 with SMTP id\n 6a1803df08f44-8ac860e5ed8mr258224826d6.3.1776206061067;\n Tue, 14 Apr 2026 15:34:21 -0700 (PDT)","by 2002:a0c:e014:0:b0:89c:6692:1d83 with SMTP id\n 6a1803df08f44-8ac860e5ed8mr258224416d6.3.1776206060515;\n Tue, 14 Apr 2026 15:34:20 -0700 (PDT)"],"Date":"Tue, 14 Apr 2026 18:34:17 -0400","From":"Peter Xu <peterx@redhat.com>","To":"Samuel Zhang <guoqing.zhang@amd.com>","Cc":"qemu-devel@nongnu.org, 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","Subject":"Re: [PATCH v5] migration/rdma: add x-rdma-chunk-size parameter","Message-ID":"<ad7A6dUi88Lfohqm@x1.local>","References":"<20260413035703.2602065-1-guoqing.zhang@amd.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260413035703.2602065-1-guoqing.zhang@amd.com>","Received-SPF":"pass client-ip=170.10.129.124; envelope-from=peterx@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"-25","X-Spam_score":"-2.6","X-Spam_bar":"--","X-Spam_report":"(-2.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.54,\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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-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"}}]