Although we never made such commitment clear (well, to the best of my knowledge), some people expect that two savevm issued in sequence in a stopped machine will yield the same results. This is not a crazy requirement, since we don't expect a stopped machine to be updating its state, for any device. With kvmclock, this is not the case, since the .pre_save hook will issue an ioctl to the host to acquire a timestamp, which is always changing. This patch moves the value acquisition to vm_stop. This should mean our get clock ioctl is issued more times, but this should be fine since vm_stop is not a hot path. When we do migrate, we'll transfer that value along. Signed-off-by: Glauber Costa <glommer@xxxxxxxxxx> --- cpus.c | 4 ++++ qemu-kvm-x86.c | 7 ++----- qemu-kvm.h | 2 ++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cpus.c b/cpus.c index a55c330..879a03a 100644 --- a/cpus.c +++ b/cpus.c @@ -112,6 +112,10 @@ static void do_vm_stop(int reason) pause_all_vcpus(); vm_state_notify(0, reason); monitor_protocol_event(QEVENT_STOP, NULL); + if (kvm_enabled()) { + kvmclock_update_clock(); + } + } } diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c index 20b7d6d..d099d3d 100644 --- a/qemu-kvm-x86.c +++ b/qemu-kvm-x86.c @@ -500,11 +500,9 @@ static int kvm_enable_tpr_access_reporting(CPUState *env) #ifdef KVM_CAP_ADJUST_CLOCK static struct kvm_clock_data kvmclock_data; -static void kvmclock_pre_save(void *opaque) +void kvmclock_update_clock(void) { - struct kvm_clock_data *cl = opaque; - - kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, cl); + kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &kvmclock_data); } static int kvmclock_post_load(void *opaque, int version_id) @@ -519,7 +517,6 @@ static const VMStateDescription vmstate_kvmclock= { .version_id = 1, .minimum_version_id = 1, .minimum_version_id_old = 1, - .pre_save = kvmclock_pre_save, .post_load = kvmclock_post_load, .fields = (VMStateField []) { VMSTATE_U64(clock, struct kvm_clock_data), diff --git a/qemu-kvm.h b/qemu-kvm.h index 0f3fb50..b0b7ab3 100644 --- a/qemu-kvm.h +++ b/qemu-kvm.h @@ -752,6 +752,8 @@ int handle_tpr_access(void *opaque, CPUState *env, uint64_t rip, #define qemu_kvm_cpu_stop(env) do {} while(0) #endif +void kvmclock_update_clock(void); + #ifdef CONFIG_KVM typedef struct KVMSlot { -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html