|
@@ -1453,6 +1453,14 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void kvmclock_reset(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ if (vcpu->arch.time_page) {
|
|
|
+ kvm_release_page_dirty(vcpu->arch.time_page);
|
|
|
+ vcpu->arch.time_page = NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
|
|
{
|
|
|
switch (msr) {
|
|
@@ -1510,10 +1518,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
|
|
break;
|
|
|
case MSR_KVM_SYSTEM_TIME_NEW:
|
|
|
case MSR_KVM_SYSTEM_TIME: {
|
|
|
- if (vcpu->arch.time_page) {
|
|
|
- kvm_release_page_dirty(vcpu->arch.time_page);
|
|
|
- vcpu->arch.time_page = NULL;
|
|
|
- }
|
|
|
+ kvmclock_reset(vcpu);
|
|
|
|
|
|
vcpu->arch.time = data;
|
|
|
kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
|
|
@@ -5837,10 +5842,7 @@ void kvm_put_guest_fpu(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
- if (vcpu->arch.time_page) {
|
|
|
- kvm_release_page_dirty(vcpu->arch.time_page);
|
|
|
- vcpu->arch.time_page = NULL;
|
|
|
- }
|
|
|
+ kvmclock_reset(vcpu);
|
|
|
|
|
|
free_cpumask_var(vcpu->arch.wbinvd_dirty_mask);
|
|
|
fx_free(vcpu);
|
|
@@ -5901,6 +5903,8 @@ int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu)
|
|
|
kvm_make_request(KVM_REQ_EVENT, vcpu);
|
|
|
vcpu->arch.apf.msr_val = 0;
|
|
|
|
|
|
+ kvmclock_reset(vcpu);
|
|
|
+
|
|
|
kvm_clear_async_pf_completion_queue(vcpu);
|
|
|
kvm_async_pf_hash_reset(vcpu);
|
|
|
vcpu->arch.apf.halted = false;
|