| From 318a7d25fb1c4671eb3c0e5ead8980801321fd3a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 14 Aug 2025 17:11:55 -0700 |
| Subject: KVM: VMX: Handle forced exit due to preemption timer in fastpath |
| |
| From: Sean Christopherson <seanjc@google.com> |
| |
| [ Upstream commit 11776aa0cfa7d007ad1799b1553bdcbd830e5010 ] |
| |
| Handle VMX preemption timer VM-Exits due to KVM forcing an exit in the |
| exit fastpath, i.e. avoid calling back into handle_preemption_timer() for |
| the same exit. There is no work to be done for forced exits, as the name |
| suggests the goal is purely to get control back in KVM. |
| |
| In addition to shaving a few cycles, this will allow cleanly separating |
| handle_fastpath_preemption_timer() from handle_preemption_timer(), e.g. |
| it's not immediately obvious why _apparently_ calling |
| handle_fastpath_preemption_timer() twice on a "slow" exit is necessary: |
| the "slow" call is necessary to handle exits from L2, which are excluded |
| from the fastpath by vmx_vcpu_run(). |
| |
| Link: https://lore.kernel.org/r/20240110012705.506918-4-seanjc@google.com |
| Signed-off-by: Sean Christopherson <seanjc@google.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/kvm/vmx/vmx.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c |
| index 96bbccd9477c..c804ad001a79 100644 |
| --- a/arch/x86/kvm/vmx/vmx.c |
| +++ b/arch/x86/kvm/vmx/vmx.c |
| @@ -5941,12 +5941,15 @@ static fastpath_t handle_fastpath_preemption_timer(struct kvm_vcpu *vcpu) |
| if (unlikely(vmx->loaded_vmcs->hv_timer_soft_disabled)) |
| return EXIT_FASTPATH_REENTER_GUEST; |
| |
| - if (!vmx->req_immediate_exit) { |
| - kvm_lapic_expired_hv_timer(vcpu); |
| - return EXIT_FASTPATH_REENTER_GUEST; |
| - } |
| + /* |
| + * If the timer expired because KVM used it to force an immediate exit, |
| + * then mission accomplished. |
| + */ |
| + if (vmx->req_immediate_exit) |
| + return EXIT_FASTPATH_EXIT_HANDLED; |
| |
| - return EXIT_FASTPATH_NONE; |
| + kvm_lapic_expired_hv_timer(vcpu); |
| + return EXIT_FASTPATH_REENTER_GUEST; |
| } |
| |
| static int handle_preemption_timer(struct kvm_vcpu *vcpu) |
| -- |
| 2.50.1 |
| |