| From 022a47adc54463f9ae024e44b073c3d1ff912bfa Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 25 Jan 2022 04:08:58 -0800 |
| Subject: KVM: LAPIC: Enable timer posted-interrupt only when mwait/hlt is |
| advertised |
| |
| From: Wanpeng Li <wanpengli@tencent.com> |
| |
| [ Upstream commit 1714a4eb6fb0cb79f182873cd011a8ed60ac65e8 ] |
| |
| As commit 0c5f81dad46 ("KVM: LAPIC: Inject timer interrupt via posted |
| interrupt") mentioned that the host admin should well tune the guest |
| setup, so that vCPUs are placed on isolated pCPUs, and with several pCPUs |
| surplus for *busy* housekeeping. In this setup, it is preferrable to |
| disable mwait/hlt/pause vmexits to keep the vCPUs in non-root mode. |
| |
| However, if only some guests isolated and others not, they would not |
| have any benefit from posted timer interrupts, and at the same time lose |
| VMX preemption timer fast paths because kvm_can_post_timer_interrupt() |
| returns true and therefore forces kvm_can_use_hv_timer() to false. |
| |
| By guaranteeing that posted-interrupt timer is only used if MWAIT or |
| HLT are done without vmexit, KVM can make a better choice and use the |
| VMX preemption timer and the corresponding fast paths. |
| |
| Reported-by: Aili Yao <yaoaili@kingsoft.com> |
| Reviewed-by: Sean Christopherson <seanjc@google.com> |
| Cc: Aili Yao <yaoaili@kingsoft.com> |
| Cc: Sean Christopherson <seanjc@google.com> |
| Signed-off-by: Wanpeng Li <wanpengli@tencent.com> |
| Message-Id: <1643112538-36743-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 | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
| index e45ebf0870b6..a3ef793fce5f 100644 |
| --- a/arch/x86/kvm/lapic.c |
| +++ b/arch/x86/kvm/lapic.c |
| @@ -113,7 +113,8 @@ static inline u32 kvm_x2apic_id(struct kvm_lapic *apic) |
| |
| static bool kvm_can_post_timer_interrupt(struct kvm_vcpu *vcpu) |
| { |
| - return pi_inject_timer && kvm_vcpu_apicv_active(vcpu); |
| + return pi_inject_timer && kvm_vcpu_apicv_active(vcpu) && |
| + (kvm_mwait_in_guest(vcpu->kvm) || kvm_hlt_in_guest(vcpu->kvm)); |
| } |
| |
| bool kvm_can_use_hv_timer(struct kvm_vcpu *vcpu) |
| -- |
| 2.35.1 |
| |