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]; -- 2.47.1
