| From aec4a5af96454e65b3cfec4aa589d452512bae27 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 28 Apr 2021 19:08:02 +0800 |
| Subject: KVM: LAPIC: Accurately guarantee busy wait for timer to expire when |
| using hv_timer |
| |
| From: Wanpeng Li <wanpengli@tencent.com> |
| |
| [ Upstream commit d981dd15498b188636ec5a7d8ad485e650f63d8d ] |
| |
| Commit ee66e453db13d (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: ee66e453db13d ("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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/kvm/lapic.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
| index 4ca81ae9bc8a..5759eb075d2f 100644 |
| --- a/arch/x86/kvm/lapic.c |
| +++ b/arch/x86/kvm/lapic.c |
| @@ -1908,8 +1908,8 @@ void kvm_lapic_expired_hv_timer(struct kvm_vcpu *vcpu) |
| if (!apic->lapic_timer.hv_timer_in_use) |
| goto out; |
| WARN_ON(rcuwait_active(&vcpu->wait)); |
| - cancel_hv_timer(apic); |
| apic_timer_expired(apic, false); |
| + cancel_hv_timer(apic); |
| |
| if (apic_lvtt_period(apic) && apic->lapic_timer.period) { |
| advance_periodic_target_expiration(apic); |
| -- |
| 2.30.2 |
| |