forked from AUR/linux-vfio
54 lines
2.1 KiB
Diff
54 lines
2.1 KiB
Diff
|
From 879ae1880449c88db11c1ebdaedc2da79b2fe73f Mon Sep 17 00:00:00 2001
|
||
|
From: Laszlo Ersek <lersek@redhat.com>
|
||
|
Date: Wed, 4 Nov 2015 12:54:41 +0100
|
||
|
Subject: KVM: x86: obey KVM_X86_QUIRK_CD_NW_CLEARED in kvm_set_cr0()
|
||
|
|
||
|
Commit b18d5431acc7 ("KVM: x86: fix CR0.CD virtualization") was
|
||
|
technically correct, but it broke OVMF guests by slowing down various
|
||
|
parts of the firmware.
|
||
|
|
||
|
Commit fb279950ba02 ("KVM: vmx: obey KVM_QUIRK_CD_NW_CLEARED") quirked the
|
||
|
first function modified by b18d5431acc7, vmx_get_mt_mask(), for OVMF's
|
||
|
sake. This restored the speed of the OVMF code that runs before
|
||
|
PlatformPei (including the memory intensive LZMA decompression in SEC).
|
||
|
|
||
|
This patch extends the quirk to the second function modified by
|
||
|
b18d5431acc7, kvm_set_cr0(). It eliminates the intrusive slowdown that
|
||
|
hits the EFI_MP_SERVICES_PROTOCOL implementation of edk2's
|
||
|
UefiCpuPkg/CpuDxe -- which is built into OVMF --, when CpuDxe starts up
|
||
|
all APs at once for initialization, in order to count them.
|
||
|
|
||
|
We also carry over the kvm_arch_has_noncoherent_dma() sub-condition from
|
||
|
the other half of the original commit b18d5431acc7.
|
||
|
|
||
|
Fixes: b18d5431acc7a2fd22767925f3a6f597aa4bd29e
|
||
|
Cc: stable@vger.kernel.org
|
||
|
Cc: Jordan Justen <jordan.l.justen@intel.com>
|
||
|
Cc: Alex Williamson <alex.williamson@redhat.com>
|
||
|
Reviewed-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
|
||
|
Tested-by: Janusz Mocek <januszmk6@gmail.com>
|
||
|
Signed-off-by: Laszlo Ersek <lersek@redhat.com>#
|
||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
---
|
||
|
arch/x86/kvm/x86.c | 4 +++-
|
||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
||
|
index a24bae0..30723a4 100644
|
||
|
--- a/arch/x86/kvm/x86.c
|
||
|
+++ b/arch/x86/kvm/x86.c
|
||
|
@@ -625,7 +625,9 @@ int kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
|
||
|
if ((cr0 ^ old_cr0) & update_bits)
|
||
|
kvm_mmu_reset_context(vcpu);
|
||
|
|
||
|
- if ((cr0 ^ old_cr0) & X86_CR0_CD)
|
||
|
+ if (((cr0 ^ old_cr0) & X86_CR0_CD) &&
|
||
|
+ kvm_arch_has_noncoherent_dma(vcpu->kvm) &&
|
||
|
+ !kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_CD_NW_CLEARED))
|
||
|
kvm_zap_gfn_range(vcpu->kvm, 0, ~0ULL);
|
||
|
|
||
|
return 0;
|
||
|
--
|
||
|
cgit v0.11.2
|
||
|
|