KVM: x86: obey KVM_X86_QUIRK_CD_NW_CLEARED in kvm_set_cr0()
Commitb18d5431ac
("KVM: x86: fix CR0.CD virtualization") was technically correct, but it broke OVMF guests by slowing down various parts of the firmware. Commitfb279950ba
("KVM: vmx: obey KVM_QUIRK_CD_NW_CLEARED") quirked the first function modified byb18d5431ac
, 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 byb18d5431ac
, 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 commitb18d5431ac
. Fixes:b18d5431ac
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>
This commit is contained in:
Родитель
89651a3dec
Коммит
879ae18804
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче