Commit d42f7708 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus-6.11' of git://git.kernel.org/pub/scm/virt/kvm/kvm

Pull kvm fix from Paolo Bonzini:
 "Do not always honor guest PAT on CPUs that support self-snoop.

  This triggers an issue in the bochsdrm driver, which used ioremap()
  instead of ioremap_wc() to map the video RAM.

  The revert lets video RAM use the WB memory type instead of the slower
  UC memory type"

* tag 'for-linus-6.11' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
  Revert "KVM: VMX: Always honor guest PAT on CPUs that support self-snoop"
parents 0babf683 9d70f3fe
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -4674,16 +4674,14 @@ static int kvm_tdp_mmu_page_fault(struct kvm_vcpu *vcpu,
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)
+4 −6
Original line number Diff line number Diff line
@@ -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);