KVM: LAPIC: Accurately guarantee busy wait for timer to expire when using hv_timer
Commitee66e453db
(KVM: lapic: Busy wait for timer to expire when using hv_timer) tries to set ktime->expired_tscdeadline by checking ktime->hv_timer_in_use since lapic timer oneshot/periodic modes which are emulated by vmx preemption timer also get advanced, they leverage the same vmx preemption timer logic with tsc-deadline mode. However, ktime->hv_timer_in_use is cleared before apic_timer_expired() handling, let's delay this clearing in preemption-disabled region. Fixes:ee66e453db
("KVM: lapic: Busy wait for timer to expire when using hv_timer") Reviewed-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Wanpeng Li <wanpengli@tencent.com> Message-Id: <1619608082-4187-1-git-send-email-wanpengli@tencent.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
1699f65c8b
Коммит
d981dd1549
|
@ -1913,8 +1913,8 @@ void kvm_lapic_expired_hv_timer(struct kvm_vcpu *vcpu)
|
||||||
if (!apic->lapic_timer.hv_timer_in_use)
|
if (!apic->lapic_timer.hv_timer_in_use)
|
||||||
goto out;
|
goto out;
|
||||||
WARN_ON(rcuwait_active(&vcpu->wait));
|
WARN_ON(rcuwait_active(&vcpu->wait));
|
||||||
cancel_hv_timer(apic);
|
|
||||||
apic_timer_expired(apic, false);
|
apic_timer_expired(apic, false);
|
||||||
|
cancel_hv_timer(apic);
|
||||||
|
|
||||||
if (apic_lvtt_period(apic) && apic->lapic_timer.period) {
|
if (apic_lvtt_period(apic) && apic->lapic_timer.period) {
|
||||||
advance_periodic_target_expiration(apic);
|
advance_periodic_target_expiration(apic);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче