migration: Do not re-read the clock on pre_save in case of paused guest

The clock move makes the guest knows about the paused time between the
'stop' and 'migrate' commands. This is an issue in an already-paused
VM because some side effects, like process stalls, could happen
after migration.

So, this patch checks the runstate of guest in the pre_save handler and
do not re-reads the clock in case of paused state (cold migration).

Signed-off-by: Maxiwell S. Garcia <maxiwell@linux.ibm.com>
Message-Id: <20190829210711.6570-1-maxiwell@linux.ibm.com>
Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
Maxiwell S. Garcia 2019-08-29 18:07:11 -03:00 committed by Eduardo Habkost
parent c6c1bb89fb
commit 4173324946
1 changed files with 11 additions and 4 deletions

View File

@ -41,6 +41,9 @@ typedef struct KVMClockState {
uint64_t clock; uint64_t clock;
bool clock_valid; bool clock_valid;
/* whether the 'clock' value was obtained in the 'paused' state */
bool runstate_paused;
/* whether machine type supports reliable KVM_GET_CLOCK */ /* whether machine type supports reliable KVM_GET_CLOCK */
bool mach_use_reliable_get_clock; bool mach_use_reliable_get_clock;
@ -202,6 +205,8 @@ static void kvmclock_vm_state_change(void *opaque, int running,
return; return;
} }
s->runstate_paused = runstate_check(RUN_STATE_PAUSED);
kvm_synchronize_all_tsc(); kvm_synchronize_all_tsc();
kvm_update_clock(s); kvm_update_clock(s);
@ -260,9 +265,9 @@ static int kvmclock_pre_load(void *opaque)
} }
/* /*
* When migrating, read the clock just before migration, * When migrating a running guest, read the clock just
* so that the guest clock counts during the events * before migration, so that the guest clock counts
* between: * during the events between:
* *
* * vm_stop() * * vm_stop()
* * * *
@ -277,7 +282,9 @@ static int kvmclock_pre_save(void *opaque)
{ {
KVMClockState *s = opaque; KVMClockState *s = opaque;
kvm_update_clock(s); if (!s->runstate_paused) {
kvm_update_clock(s);
}
return 0; return 0;
} }