All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xiao Guangrong <guangrong.xiao@linux.intel.com>
To: pbonzini@redhat.com
Cc: gleb@kernel.org, mtosatti@redhat.com, kvm@vger.kernel.org,
	linux-kernel@vger.kernel.org, alex.williamson@redhat.com,
	bsd@redhat.com, lersek@redhat.com, jordan.l.justen@intel.com,
	edk2-devel@lists.sourceforge.net,
	Xiao Guangrong <guangrong.xiao@intel.com>
Subject: [PATCH 3/3] KVM: x86: quirkily apply WB to all memory if cache is disabled
Date: Thu, 16 Jul 2015 03:25:56 +0800	[thread overview]
Message-ID: <1436988356-4565-3-git-send-email-guangrong.xiao@linux.intel.com> (raw)
In-Reply-To: <1436988356-4565-1-git-send-email-guangrong.xiao@linux.intel.com>

From: Xiao Guangrong <guangrong.xiao@intel.com>

Current firmware depends on WB to fast boot, please refer to
      https://lkml.org/lkml/2015/7/12/115

Let's us WB if CR0.CD is set to make this kind of firmware happy

This quirk can be dropped by using KVM_ENABLE_CAP API with
KVM_CAP_DISABLE_QUIRKS if the broken firmware is gone

Signed-off-by: Xiao Guangrong <guangrong.xiao@intel.com>
---
 arch/x86/include/uapi/asm/kvm.h | 1 +
 arch/x86/kvm/lapic.c            | 2 +-
 arch/x86/kvm/svm.c              | 2 +-
 arch/x86/kvm/vmx.c              | 5 ++++-
 arch/x86/kvm/x86.c              | 7 +++++++
 arch/x86/kvm/x86.h              | 5 +++++
 6 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h
index a4ae82e..2f141d4 100644
--- a/arch/x86/include/uapi/asm/kvm.h
+++ b/arch/x86/include/uapi/asm/kvm.h
@@ -356,5 +356,6 @@ struct kvm_sync_regs {
 
 #define KVM_QUIRK_LINT0_REENABLED	(1 << 0)
 #define KVM_QUIRK_CD_NW_CLEARED		(1 << 1)
+#define KVM_QUIRK_CD_AS_WB		(1 << 2)
 
 #endif /* _ASM_X86_KVM_H */
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 954e98a..0d77b20 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -1595,7 +1595,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
 	for (i = 0; i < APIC_LVT_NUM; i++)
 		apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED);
 	apic_update_lvtt(apic);
-	if (!(vcpu->kvm->arch.disabled_quirks & KVM_QUIRK_LINT0_REENABLED))
+	if (!kvm_check_disabled_quirks(vcpu->kvm, KVM_QUIRK_LINT0_REENABLED))
 		apic_set_reg(apic, APIC_LVT0,
 			     SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT));
 	apic_manage_nmi_watchdog(apic, kvm_apic_get_reg(apic, APIC_LVT0));
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index bbc678a..cac9ee6 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1672,7 +1672,7 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
 	 * does not do it - this results in some delay at
 	 * reboot
 	 */
-	if (!(vcpu->kvm->arch.disabled_quirks & KVM_QUIRK_CD_NW_CLEARED))
+	if (!kvm_check_disabled_quirks(vcpu->kvm, KVM_QUIRK_CD_NW_CLEARED))
 		cr0 &= ~(X86_CR0_CD | X86_CR0_NW);
 	svm->vmcb->save.cr0 = cr0;
 	mark_dirty(svm->vmcb, VMCB_CR);
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index d342b23..74398db 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -8703,7 +8703,10 @@ static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
 
 	if (kvm_read_cr0(vcpu) & X86_CR0_CD) {
 		ipat = VMX_EPT_IPAT_BIT;
-		cache = MTRR_TYPE_UNCACHABLE;
+		if (kvm_check_disabled_quirks(vcpu->kvm, KVM_QUIRK_CD_AS_WB))
+			cache = MTRR_TYPE_WRBACK;
+		else
+			cache = MTRR_TYPE_UNCACHABLE;
 		goto exit;
 	}
 
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 28076c2..fd21712 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3575,6 +3575,11 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
 	return r;
 }
 
+static void kvm_init_disabled_quirks(struct kvm *kvm)
+{
+	kvm->arch.disabled_quirks = KVM_QUIRK_CD_AS_WB;
+}
+
 long kvm_arch_vm_ioctl(struct file *filp,
 		       unsigned int ioctl, unsigned long arg)
 {
@@ -7422,6 +7427,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 	INIT_DELAYED_WORK(&kvm->arch.kvmclock_update_work, kvmclock_update_fn);
 	INIT_DELAYED_WORK(&kvm->arch.kvmclock_sync_work, kvmclock_sync_fn);
 
+	kvm_init_disabled_quirks(kvm);
+
 	return 0;
 }
 
diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h
index c04b56b..ea99928 100644
--- a/arch/x86/kvm/x86.h
+++ b/arch/x86/kvm/x86.h
@@ -152,6 +152,11 @@ static inline u64 get_kernel_ns(void)
 	return ktime_get_boot_ns();
 }
 
+static inline bool kvm_check_disabled_quirks(struct kvm *kvm, u64 quirk)
+{
+	return !!(kvm->arch.disabled_quirks & quirk);
+}
+
 void kvm_before_handle_nmi(struct kvm_vcpu *vcpu);
 void kvm_after_handle_nmi(struct kvm_vcpu *vcpu);
 void kvm_set_pending_timer(struct kvm_vcpu *vcpu);
-- 
2.1.0


  parent reply	other threads:[~2015-07-15 19:31 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-15 19:25 [PATCH 1/3] KVM: MTRR: fix memory type handling if MTRR is completely disabled Xiao Guangrong
2015-07-15 19:25 ` [PATCH 2/3] KVM: MTRR: simplify kvm_mtrr_get_guest_memory_type Xiao Guangrong
2015-07-29 19:07   ` Alex Williamson
2015-07-29 19:07     ` [edk2] " Alex Williamson
2015-07-30  7:21     ` Paolo Bonzini
2015-07-15 19:25 ` Xiao Guangrong [this message]
2015-07-23  5:56   ` [PATCH 3/3] KVM: x86: quirkily apply WB to all memory if cache is disabled Paolo Bonzini
2015-07-23  6:03     ` Xiao Guangrong
2015-07-16  4:10 ` [PATCH 1/3] KVM: MTRR: fix memory type handling if MTRR is completely disabled Alex Williamson
2015-07-23  6:21   ` Paolo Bonzini
2015-07-23  6:21     ` [edk2] " Paolo Bonzini
2015-07-23  6:29     ` Xiao Guangrong
2015-07-23  7:18       ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1436988356-4565-3-git-send-email-guangrong.xiao@linux.intel.com \
    --to=guangrong.xiao@linux.intel.com \
    --cc=alex.williamson@redhat.com \
    --cc=bsd@redhat.com \
    --cc=edk2-devel@lists.sourceforge.net \
    --cc=gleb@kernel.org \
    --cc=guangrong.xiao@intel.com \
    --cc=jordan.l.justen@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=lersek@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.