From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH] KVM: x86: obey KVM_X86_QUIRK_CD_NW_CLEARED in kvm_set_cr0() Date: Wed, 4 Nov 2015 12:56:40 +0100 Message-ID: <5639F278.3080009@redhat.com> References: <1446575660-16560-1-git-send-email-lersek@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Cc: Jordan Justen , Janusz Mocek , Alex Williamson , Xiao Guangrong To: Laszlo Ersek , kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:49209 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751715AbbKDL4r (ORCPT ); Wed, 4 Nov 2015 06:56:47 -0500 In-Reply-To: <1446575660-16560-1-git-send-email-lersek@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 03/11/2015 19:34, Laszlo Ersek wrote: > 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. > > Cc: Paolo Bonzini > Cc: Jordan Justen > Cc: Janusz Mocek > Cc: Alex Williamson > Cc: Xiao Guangrong > Signed-off-by: Laszlo Ersek > --- > 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; > Applied, thanks. Paolo