]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: SVM: Remove redundant TLB flush on guest CR4.PGE change
authorSean Christopherson <seanjc@google.com>
Wed, 27 Nov 2024 23:53:12 +0000 (15:53 -0800)
committerSean Christopherson <seanjc@google.com>
Tue, 17 Dec 2024 00:15:28 +0000 (16:15 -0800)
Drop SVM's direct TLB flush when CR4.PGE is toggled and NPT is enabled, as
KVM already guarantees TLBs are flushed appropriately.

For the call from cr_trap(), kvm_post_set_cr4() requests TLB_FLUSH_GUEST
(which is a superset of TLB_FLUSH_CURRENT) when CR4.PGE is toggled,
regardless of whether or not KVM is using TDP.

The calls from nested_vmcb02_prepare_save() and nested_svm_vmexit() are
checking guest (L2) vs. host (L1) CR4, and so a flush is unnecessary as L2
is defined to use a different ASID (from L1's perspective).

Lastly, the call from svm_set_cr0() passes in the current CR4 value, i.e.
can't toggle PGE.

Link: https://lore.kernel.org/r/20241127235312.4048445-1-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/svm.c

index dd15cc635655347576097359c1a8fde1a6f740a4..f39724bf26be16ff98482385e585f1c8fc3aa793 100644 (file)
@@ -284,8 +284,6 @@ u32 svm_msrpm_offset(u32 msr)
        return MSR_INVALID;
 }
 
-static void svm_flush_tlb_current(struct kvm_vcpu *vcpu);
-
 static int get_npt_level(void)
 {
 #ifdef CONFIG_X86_64
@@ -1921,9 +1919,6 @@ void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
        unsigned long host_cr4_mce = cr4_read_shadow() & X86_CR4_MCE;
        unsigned long old_cr4 = vcpu->arch.cr4;
 
-       if (npt_enabled && ((old_cr4 ^ cr4) & X86_CR4_PGE))
-               svm_flush_tlb_current(vcpu);
-
        vcpu->arch.cr4 = cr4;
        if (!npt_enabled) {
                cr4 |= X86_CR4_PAE;