Andrey Drobyshev <[email protected]> writes:

> The savevm/loadvm operation doesn't make any sense in any of the CPR
> modes.  Saving VM state implies saving its RAM entirely, while the whole
> point of CPR is avoiding that: in cpr-transfer and cpr-exec modes RAM is
> preserved in place and never put into the migration stream (see
> migrate_ram_is_ignored() in migration/ram.c).  As a result, a snapshot
> taken with such a mode set has no RAM in it, and loading a snapshot with
> such a mode set fails in the RAM loader.
>
> Currently nothing stops these operations from firing with a CPR mode
> still set, e.g. after an earlier CPR attempt.  Reject them early in
> migrate_can_snapshot(), which guards 'savevm'/'loadvm' HMP commands as
> well as 'snapshot-save'/'snapshot-load' QMP commands.
>
> Signed-off-by: Andrey Drobyshev <[email protected]>
> ---
>  migration/options.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/migration/options.c b/migration/options.c
> index 05b026f4bf2..f648be1302b 100644
> --- a/migration/options.c
> +++ b/migration/options.c
> @@ -555,8 +555,15 @@ static bool migrate_incoming_started(void)
>  bool migrate_can_snapshot(Error **errp)
>  {
>      MigrationState *s = migrate_get_current();
> +    MigMode mode = migrate_mode();
>      int i;
>  
> +    if (mode != MIG_MODE_NORMAL) {
> +        error_setg(errp, "Snapshots are not compatible with migration mode 
> %s",
> +                   MigMode_str(mode));
> +        return false;
> +    }
> +
>      for (i = 0; i < check_caps_savevm.size; i++) {
>          int incomp_cap = check_caps_savevm.caps[i];

+CC Akihiko Odaki

Reviewed-by: Fabiano Rosas <[email protected]>

Reply via email to