If the outgoing machine was previously suspended, propagate that to the incoming side via global_state, so a subsequent vm_start restores the suspended state. To maintain backward and forward compatibility, define the new field in a zero'd hole in the GlobalState struct.
Signed-off-by: Steve Sistare <steven.sist...@oracle.com> --- migration/global_state.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/migration/global_state.c b/migration/global_state.c index 4e2a9d8..de2532c 100644 --- a/migration/global_state.c +++ b/migration/global_state.c @@ -25,6 +25,7 @@ typedef struct { uint8_t runstate[100]; RunState state; bool received; + bool vm_was_suspended; } GlobalState; static GlobalState global_state; @@ -35,6 +36,7 @@ static void global_state_do_store(RunState state) assert(strlen(state_str) < sizeof(global_state.runstate)); strpadcpy((char *)global_state.runstate, sizeof(global_state.runstate), state_str, '\0'); + global_state.vm_was_suspended = vm_get_suspended(); } void global_state_store(void) @@ -68,6 +70,12 @@ static bool global_state_needed(void *opaque) return true; } + /* If the suspended state must be remembered, it is needed */ + + if (vm_get_suspended()) { + return true; + } + /* If state is running or paused, it is not needed */ if (strcmp(runstate, "running") == 0 || @@ -109,6 +117,7 @@ static int global_state_post_load(void *opaque, int version_id) return -EINVAL; } s->state = r; + vm_set_suspended(s->vm_was_suspended || r == RUN_STATE_SUSPENDED); return 0; } @@ -134,6 +143,7 @@ static const VMStateDescription vmstate_globalstate = { .fields = (VMStateField[]) { VMSTATE_UINT32(size, GlobalState), VMSTATE_BUFFER(runstate, GlobalState), + VMSTATE_BOOL(vm_was_suspended, GlobalState), VMSTATE_END_OF_LIST() }, }; -- 1.8.3.1