]> git.dujemihanovic.xyz Git - linux.git/commitdiff
Revert "KVM: VMX: Always honor guest PAT on CPUs that support self-snoop"
authorPaolo Bonzini <pbonzini@redhat.com>
Sun, 15 Sep 2024 06:49:33 +0000 (02:49 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Sun, 15 Sep 2024 06:49:33 +0000 (02:49 -0400)
This reverts commit 377b2f359d1f71c75f8cc352b5c81f2210312d83.

This caused a regression with the bochsdrm driver, which used ioremap()
instead of ioremap_wc() to map the video RAM.  After the commit, the
WB memory type is used without the IGNORE_PAT, resulting in the slower
UC memory type.  In fact, UC is slow enough to basically cause guests
to not boot... but only on new processors such as Sapphire Rapids and
Cascade Lake.  Coffee Lake for example works properly, though that might
also be an effect of being on a larger, more NUMA system.

The driver has been fixed but that does not help older guests.  Until we
figure out whether Cascade Lake and newer processors are working as
intended, revert the commit.  Long term we might add a quirk, but the
details depend on whether the processors are working as intended: for
example if they are, the quirk might reference bochs-compatible devices,
e.g. in the name and documentation, so that userspace can disable the
quirk by default and only leave it enabled if such a device is being
exposed to the guest.

If instead this is actually a bug in CLX+, then the actions we need to
take are different and depend on the actual cause of the bug.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/mmu.c
arch/x86/kvm/vmx/vmx.c

index de05a26b0b7dae745fd69e3c53fbad4ac3ea8905..7813d28b082f2f014dece5572bbfc0d0a49a6525 100644 (file)
@@ -4674,16 +4674,14 @@ out_unlock:
 bool kvm_mmu_may_ignore_guest_pat(void)
 {
        /*
-        * When EPT is enabled (shadow_memtype_mask is non-zero), the CPU does
-        * not support self-snoop (or is affected by an erratum), and the VM
+        * When EPT is enabled (shadow_memtype_mask is non-zero), and the VM
         * has non-coherent DMA (DMA doesn't snoop CPU caches), KVM's ABI is to
         * honor the memtype from the guest's PAT so that guest accesses to
         * memory that is DMA'd aren't cached against the guest's wishes.  As a
         * result, KVM _may_ ignore guest PAT, whereas without non-coherent DMA,
-        * KVM _always_ ignores or honors guest PAT, i.e. doesn't toggle SPTE
-        * bits in response to non-coherent device (un)registration.
+        * KVM _always_ ignores guest PAT (when EPT is enabled).
         */
-       return !static_cpu_has(X86_FEATURE_SELFSNOOP) && shadow_memtype_mask;
+       return shadow_memtype_mask;
 }
 
 int kvm_tdp_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
index f18c2d8c7476e180005cef514953ab0e2ecb80bb..733a0c45d1a6122a08e6f4590b4ba6ef1620ff21 100644 (file)
@@ -7659,13 +7659,11 @@ u8 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
 
        /*
         * Force WB and ignore guest PAT if the VM does NOT have a non-coherent
-        * device attached and the CPU doesn't support self-snoop.  Letting the
-        * guest control memory types on Intel CPUs without self-snoop may
-        * result in unexpected behavior, and so KVM's (historical) ABI is to
-        * trust the guest to behave only as a last resort.
+        * device attached.  Letting the guest control memory types on Intel
+        * CPUs may result in unexpected behavior, and so KVM's ABI is to trust
+        * the guest to behave only as a last resort.
         */
-       if (!static_cpu_has(X86_FEATURE_SELFSNOOP) &&
-           !kvm_arch_has_noncoherent_dma(vcpu->kvm))
+       if (!kvm_arch_has_noncoherent_dma(vcpu->kvm))
                return (MTRR_TYPE_WRBACK << VMX_EPT_MT_EPTE_SHIFT) | VMX_EPT_IPAT_BIT;
 
        return (MTRR_TYPE_WRBACK << VMX_EPT_MT_EPTE_SHIFT);