luzhipeng <[email protected]> writes:

> Introduce two new QMP commands to manage RAMBlock migratable state:
> 1. ram-block-set-migratable: Dynamically set a RAMBlock's migratable state
> 2. ram-block-get-migratable: Query a RAMBlock's migratable state
>

Hi! Could you provide more information on what are the use-cases for the
new commands?

In particular, what is the condition that can cause a ramblock to become
migratable/unmigratable at runtime that cannot be detected by QEMU
itself?

> Signed-off-by: luzhipeng <[email protected]>
> ---
>  migration/ram.c     | 48 +++++++++++++++++++++++++++++++++++++++++++++
>  qapi/migration.json | 39 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 87 insertions(+)
>
> diff --git a/migration/ram.c b/migration/ram.c
> index 979751f61b..8b4fd8226d 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -234,6 +234,54 @@ bool migrate_ram_is_ignored(RAMBlock *block)
>                                      && qemu_ram_is_named_file(block));
>  }
>  
> +void qmp_ram_block_set_migratable(const char *name,
> +                                  bool migratable, Error **errp)
> +{
> +    RAMBlock *rb = qemu_ram_block_by_name(name);
> +    if (!rb) {
> +        error_setg(errp, "RAMBlock '%s' not found", name);
> +        return;
> +    }
> +
> +    if (migration_is_running()) {
> +        error_setg(errp, "Cannot modify RAMBlock migratable state
> +                   during migration");
> +        return;
> +    }
> +
> +    if (migratable) {
> +        qemu_ram_set_migratable(rb);
> +        info_report("RAMBlock '%s' marked as migratable", name);
> +    } else {
> +        qemu_ram_unset_migratable(rb);
> +        info_report("RAMBlock '%s' marked as non-migratable", name);
> +    }
> +}
> +
> +/**
> + * qmp_ram_block_get_migratable:
> + * @name: Name of RAMBlock to query
> + * @errp: Error object
> + *
> + * Return: RamBlockMigratableInfo
> + */
> +RamBlockMigratableInfo *qmp_ram_block_get_migratable(const char *name,
> +                                                     Error **errp)
> +{
> +    RAMBlock *rb;
> +    RamBlockMigratableInfo *info = g_new0(RamBlockMigratableInfo, 1);
> +    rb = qemu_ram_block_by_name(name);
> +    if (!rb) {
> +        g_free(info);
> +        error_setg(errp, "RAMBlock '%s' not found", name);
> +        return NULL;
> +    }
> +    info->migratable = qemu_ram_is_migratable(rb);
> +    info_report("RAMBlock '%s' migratable state: %s", name,
> +                 info->migratable ? "true" : "false");
> +    return info;
> +}
> +
>  #undef RAMBLOCK_FOREACH
>  
>  int foreach_not_ignored_block(RAMBlockIterFunc func, void *opaque)
> diff --git a/qapi/migration.json b/qapi/migration.json
> index 7134d4ce47..483116db49 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.json
> @@ -2233,3 +2233,42 @@
>    'data': { 'job-id': 'str',
>              'tag': 'str',
>              'devices': ['str'] } }
> +
> +##
> +# @ram-block-set-migratable:
> +#
> +# Set the migratable state of a specific RAMBlock.
> +#
> +# @name: Name of the RAMBlock to modify
> +# @migratable: true to enable migration for the RAMBlock,
> +# false to disable
> +#
> +# Since: 11.1
> +##
> +{ 'command': 'ram-block-set-migratable',
> +  'data': { 'name': 'str', 'migratable': 'bool' } }
> +
> +##
> +# @RamBlockMigratableInfo:
> +#
> +# Information about a RAMBlock's migratable state
> +#
> +# @migratable: true if the RAMBlock is migratable, false otherwise
> +#
> +# Since: 11.1
> +##
> +{ 'struct': 'RamBlockMigratableInfo', 'data': { 'migratable': 'bool' } }
> +
> +##
> +# @ram-block-get-migratable:
> +#
> +# Get the migratable state of a specific RAMBlock.
> +#
> +# @name: Name of the RAMBlock to query
> +#
> +# Returns: RamBlockMigratableInfo containing the migratable state
> +#
> +# Since: 11.1
> +##
> +{ 'command': 'ram-block-get-migratable', 'data': { 'name': 'str' },
> +                                         'returns': 'RamBlockMigratableInfo' 
> }

Reply via email to