|
@@ -1352,6 +1352,9 @@ void kvm_set_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu, u64 data)
|
|
return;
|
|
return;
|
|
|
|
|
|
hrtimer_cancel(&apic->lapic_timer.timer);
|
|
hrtimer_cancel(&apic->lapic_timer.timer);
|
|
|
|
+ /* Inject here so clearing tscdeadline won't override new value */
|
|
|
|
+ if (apic_has_pending_timer(vcpu))
|
|
|
|
+ kvm_inject_apic_timer_irqs(vcpu);
|
|
apic->lapic_timer.tscdeadline = data;
|
|
apic->lapic_timer.tscdeadline = data;
|
|
start_apic_timer(apic);
|
|
start_apic_timer(apic);
|
|
}
|
|
}
|
|
@@ -1639,6 +1642,8 @@ void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
if (atomic_read(&apic->lapic_timer.pending) > 0) {
|
|
if (atomic_read(&apic->lapic_timer.pending) > 0) {
|
|
kvm_apic_local_deliver(apic, APIC_LVTT);
|
|
kvm_apic_local_deliver(apic, APIC_LVTT);
|
|
|
|
+ if (apic_lvtt_tscdeadline(apic))
|
|
|
|
+ apic->lapic_timer.tscdeadline = 0;
|
|
atomic_set(&apic->lapic_timer.pending, 0);
|
|
atomic_set(&apic->lapic_timer.pending, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|