|
@@ -1636,16 +1636,16 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
|
|
vcpu->hv_clock.system_time = kernel_ns + v->kvm->arch.kvmclock_offset;
|
|
|
vcpu->last_guest_tsc = tsc_timestamp;
|
|
|
|
|
|
+ if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time,
|
|
|
+ &guest_hv_clock, sizeof(guest_hv_clock))))
|
|
|
+ return 0;
|
|
|
+
|
|
|
/*
|
|
|
* The interface expects us to write an even number signaling that the
|
|
|
* update is finished. Since the guest won't see the intermediate
|
|
|
* state, we just increase by 2 at the end.
|
|
|
*/
|
|
|
- vcpu->hv_clock.version += 2;
|
|
|
-
|
|
|
- if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time,
|
|
|
- &guest_hv_clock, sizeof(guest_hv_clock))))
|
|
|
- return 0;
|
|
|
+ vcpu->hv_clock.version = guest_hv_clock.version + 2;
|
|
|
|
|
|
/* retain PVCLOCK_GUEST_STOPPED if set in guest copy */
|
|
|
pvclock_flags = (guest_hv_clock.flags & PVCLOCK_GUEST_STOPPED);
|