|
@@ -1542,7 +1542,8 @@ static void pvclock_update_vm_gtod_copy(struct kvm *kvm)
|
|
|
&ka->master_cycle_now);
|
|
|
|
|
|
ka->use_master_clock = host_tsc_clocksource && vcpus_matched
|
|
|
- && !backwards_tsc_observed;
|
|
|
+ && !backwards_tsc_observed
|
|
|
+ && !ka->boot_vcpu_runs_old_kvmclock;
|
|
|
|
|
|
if (ka->use_master_clock)
|
|
|
atomic_set(&kvm_guest_has_master_clock, 1);
|
|
@@ -2174,8 +2175,20 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|
|
case MSR_KVM_SYSTEM_TIME_NEW:
|
|
|
case MSR_KVM_SYSTEM_TIME: {
|
|
|
u64 gpa_offset;
|
|
|
+ struct kvm_arch *ka = &vcpu->kvm->arch;
|
|
|
+
|
|
|
kvmclock_reset(vcpu);
|
|
|
|
|
|
+ if (vcpu->vcpu_id == 0 && !msr_info->host_initiated) {
|
|
|
+ bool tmp = (msr == MSR_KVM_SYSTEM_TIME);
|
|
|
+
|
|
|
+ if (ka->boot_vcpu_runs_old_kvmclock != tmp)
|
|
|
+ set_bit(KVM_REQ_MASTERCLOCK_UPDATE,
|
|
|
+ &vcpu->requests);
|
|
|
+
|
|
|
+ ka->boot_vcpu_runs_old_kvmclock = tmp;
|
|
|
+ }
|
|
|
+
|
|
|
vcpu->arch.time = data;
|
|
|
kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu);
|
|
|
|