kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/7] Split kvm_update_cpuid_runtime()
@ 2020-10-21  9:10 Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 1/7] kvm: x86: Extract kvm_apic_base_update_cpuid() from kvm_update_cpuid_runtime() Robert Hoo
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

kvm_update_cpuid_runtime() is currently called by various functions for the
purpose of updating vCPU's cpuid entries, due to specific runtime changes, e.g.
CR4 bits changes, XCR0 bits changes, etc. Each of them actually just needs to
update 1 ~ 2 CPUID entries. But current kvm_update_cpuid_runtime() packages all.
Given finding a target CPUID entry need to go through all CPUID entries, calling
kvm_update_cpuid_runtime() is a waste for each cause.

This patch set splits kvm_update_cpuid_runtime() into pieces according to
different updating causes.
Then let various callers call their specific necessary kvm_xxx_update_cpuid().
This patch set also refactors kvm_vcpu_after_set_cpuid().

This not only significantly saves each caller's time, but also eliminates
unnecessary couplings.

---
Change Log
v2:
Reorders patch set, let each extracted function with its caller in a patch.
Also, added a helper function guest_cpuid_change(), which is the extraction
of the common code.

Robert Hoo (7):
  kvm: x86: Extract kvm_apic_base_update_cpuid() from
    kvm_update_cpuid_runtime()
  kvm: x86: Extract kvm_xcr0_update_cpuid() from
    kvm_update_cpuid_runtime()
  kvm: x86: Extract kvm_osxsave_update_cpuid() and    
    kvm_pke_update_cpuid() from kvm_update_cpuid_runtime()
  kvm: x86: Extract kvm_mwait_update_cpuid() from
    kvm_update_cpuid_runtime()
  [Trivial] kvm: x86: cpuid_query_maxphyaddr(): Use a simple 'e' instead
    of     misleading 'best', as the variable name
  kvm: x86: Refactor kvm_vcpu_after_set_cpuid()
  kvm: x86: Remove kvm_update_cpuid_runtime()

 arch/x86/kvm/cpuid.c | 148 ++++++++++++++++++++++++++++++---------------------
 arch/x86/kvm/cpuid.h |   7 ++-
 arch/x86/kvm/lapic.c |   2 +-
 arch/x86/kvm/x86.c   |  29 ++++++----
 4 files changed, 113 insertions(+), 73 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/7] kvm: x86: Extract kvm_apic_base_update_cpuid() from kvm_update_cpuid_runtime()
  2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
@ 2020-10-21  9:10 ` Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 2/7] kvm: x86: Extract kvm_xcr0_update_cpuid() " Robert Hoo
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

And let kvm_lapic_set_base() call kvm_apic_base_update_cpuid() instead of
whole kvm_update_cpuid_runtime().

Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 14 ++++++++++++++
 arch/x86/kvm/cpuid.h |  1 +
 arch/x86/kvm/lapic.c |  2 +-
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 3fd6eec..b6dd4ee 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -73,6 +73,20 @@ static int kvm_check_cpuid(struct kvm_vcpu *vcpu)
 	return 0;
 }
 
+static inline void guest_cpuid_change(struct kvm_vcpu *vcpu, u32 function,
+					    u32 index, unsigned int feature, bool set)
+{
+	struct kvm_cpuid_entry2 *e =  kvm_find_cpuid_entry(vcpu, function, index);
+
+	if (e)
+		cpuid_entry_change(e, feature, set);
+}
+
+void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set)
+{
+	guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_APIC, set);
+}
+
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
 {
 	struct kvm_cpuid_entry2 *best;
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 3a923ae..ef4cb9c 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -9,6 +9,7 @@
 extern u32 kvm_cpu_caps[NCAPINTS] __read_mostly;
 void kvm_set_cpu_caps(void);
 
+void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set);
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu);
 struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
 					      u32 function, u32 index);
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 5ccbee7..5221b89 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -2231,7 +2231,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
 	vcpu->arch.apic_base = value;
 
 	if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE)
-		kvm_update_cpuid_runtime(vcpu);
+		kvm_apic_base_update_cpuid(vcpu, !!(value & MSR_IA32_APICBASE_ENABLE));
 
 	if (!apic)
 		return;
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/7] kvm: x86: Extract kvm_xcr0_update_cpuid() from kvm_update_cpuid_runtime()
  2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 1/7] kvm: x86: Extract kvm_apic_base_update_cpuid() from kvm_update_cpuid_runtime() Robert Hoo
@ 2020-10-21  9:10 ` Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 3/7] kvm: x86: Extract kvm_osxsave_update_cpuid() and kvm_pke_update_cpuid() " Robert Hoo
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

And let __kvm_set_xcr() call kvm_xcr0_update_cpuid() instead of whole
kvm_update_cpuid_runtime()

Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 22 ++++++++++++++++++++++
 arch/x86/kvm/cpuid.h |  2 ++
 arch/x86/kvm/x86.c   |  2 +-
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index b6dd4ee..6d5cd03 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -87,6 +87,28 @@ void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set)
 	guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_APIC, set);
 }
 
+
+void kvm_xcr0_update_cpuid(struct kvm_vcpu *vcpu)
+{
+	struct kvm_cpuid_entry2 *e;
+
+	e = kvm_find_cpuid_entry(vcpu, 0xD, 0);
+	if (!e) {
+		vcpu->arch.guest_supported_xcr0 = 0;
+	} else {
+		vcpu->arch.guest_supported_xcr0 =
+			(e->eax | ((u64)e->edx << 32)) & supported_xcr0;
+		e->ebx = xstate_required_size(vcpu->arch.xcr0, false);
+	}
+
+	e = kvm_find_cpuid_entry(vcpu, 0xD, 1);
+	if (!e)
+		return;
+	if (cpuid_entry_has(e, X86_FEATURE_XSAVES) ||
+	    cpuid_entry_has(e, X86_FEATURE_XSAVEC))
+		e->ebx = xstate_required_size(vcpu->arch.xcr0, true);
+}
+
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
 {
 	struct kvm_cpuid_entry2 *best;
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index ef4cb9c..845544e 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -10,6 +10,8 @@
 void kvm_set_cpu_caps(void);
 
 void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set);
+void kvm_xcr0_update_cpuid(struct kvm_vcpu *vcpu);
+
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu);
 struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
 					      u32 function, u32 index);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 58fa354..cd41bec 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -944,7 +944,7 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
 	vcpu->arch.xcr0 = xcr0;
 
 	if ((xcr0 ^ old_xcr0) & XFEATURE_MASK_EXTEND)
-		kvm_update_cpuid_runtime(vcpu);
+		kvm_xcr0_update_cpuid(vcpu);
 	return 0;
 }
 
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 3/7] kvm: x86: Extract kvm_osxsave_update_cpuid() and kvm_pke_update_cpuid() from kvm_update_cpuid_runtime()
  2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 1/7] kvm: x86: Extract kvm_apic_base_update_cpuid() from kvm_update_cpuid_runtime() Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 2/7] kvm: x86: Extract kvm_xcr0_update_cpuid() " Robert Hoo
@ 2020-10-21  9:10 ` Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 4/7] kvm: x86: Extract kvm_mwait_update_cpuid() " Robert Hoo
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

And substitute kvm_update_cpuid_runtime() invocations in kvm_set_cr4(),
enter_smm() and __set_sregs() with them accordingly.

Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 11 +++++++++++
 arch/x86/kvm/cpuid.h |  2 ++
 arch/x86/kvm/x86.c   | 24 +++++++++++++++---------
 3 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 6d5cd03..18cd27a 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -82,11 +82,22 @@ static inline void guest_cpuid_change(struct kvm_vcpu *vcpu, u32 function,
 		cpuid_entry_change(e, feature, set);
 }
 
+void kvm_osxsave_update_cpuid(struct kvm_vcpu *vcpu, bool set)
+{
+	if (boot_cpu_has(X86_FEATURE_XSAVE))
+		guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_OSXSAVE, set);
+}
+
 void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set)
 {
 	guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_APIC, set);
 }
 
+void kvm_pke_update_cpuid(struct kvm_vcpu *vcpu, bool set)
+{
+	if (boot_cpu_has(X86_FEATURE_PKU))
+		guest_cpuid_change(vcpu, 7, 0, X86_FEATURE_OSPKE, set);
+}
 
 void kvm_xcr0_update_cpuid(struct kvm_vcpu *vcpu)
 {
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 845544e..98ea431 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -9,6 +9,8 @@
 extern u32 kvm_cpu_caps[NCAPINTS] __read_mostly;
 void kvm_set_cpu_caps(void);
 
+void kvm_osxsave_update_cpuid(struct kvm_vcpu *vcpu, bool set);
+void kvm_pke_update_cpuid(struct kvm_vcpu *vcpu, bool set);
 void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set);
 void kvm_xcr0_update_cpuid(struct kvm_vcpu *vcpu);
 
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index cd41bec..5e9a51d 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1008,8 +1008,10 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
 	    (!(cr4 & X86_CR4_PCIDE) && (old_cr4 & X86_CR4_PCIDE)))
 		kvm_mmu_reset_context(vcpu);
 
-	if ((cr4 ^ old_cr4) & (X86_CR4_OSXSAVE | X86_CR4_PKE))
-		kvm_update_cpuid_runtime(vcpu);
+	if ((cr4 ^ old_cr4) & X86_CR4_OSXSAVE)
+		kvm_osxsave_update_cpuid(vcpu, !!(cr4 & X86_CR4_OSXSAVE));
+	if ((cr4 ^ old_cr4) & X86_CR4_PKE)
+		kvm_pke_update_cpuid(vcpu, !!(cr4 & X86_CR4_PKE));
 
 	return 0;
 }
@@ -8177,6 +8179,8 @@ static void enter_smm(struct kvm_vcpu *vcpu)
 	vcpu->arch.cr0 = cr0;
 
 	kvm_x86_ops.set_cr4(vcpu, 0);
+	kvm_osxsave_update_cpuid(vcpu, false);
+	kvm_pke_update_cpuid(vcpu, false);
 
 	/* Undocumented: IDT limit is set to zero on entry to SMM.  */
 	dt.address = dt.size = 0;
@@ -8214,7 +8218,6 @@ static void enter_smm(struct kvm_vcpu *vcpu)
 		kvm_x86_ops.set_efer(vcpu, 0);
 #endif
 
-	kvm_update_cpuid_runtime(vcpu);
 	kvm_mmu_reset_context(vcpu);
 }
 
@@ -9193,7 +9196,7 @@ static int __set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
 {
 	struct msr_data apic_base_msr;
 	int mmu_reset_needed = 0;
-	int cpuid_update_needed = 0;
+	ulong old_cr4 = 0;
 	int pending_vec, max_bits, idx;
 	struct desc_ptr dt;
 	int ret = -EINVAL;
@@ -9227,12 +9230,15 @@ static int __set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
 	kvm_x86_ops.set_cr0(vcpu, sregs->cr0);
 	vcpu->arch.cr0 = sregs->cr0;
 
-	mmu_reset_needed |= kvm_read_cr4(vcpu) != sregs->cr4;
-	cpuid_update_needed |= ((kvm_read_cr4(vcpu) ^ sregs->cr4) &
-				(X86_CR4_OSXSAVE | X86_CR4_PKE));
+	old_cr4 = kvm_read_cr4(vcpu);
+	mmu_reset_needed |= old_cr4 != sregs->cr4;
+
 	kvm_x86_ops.set_cr4(vcpu, sregs->cr4);
-	if (cpuid_update_needed)
-		kvm_update_cpuid_runtime(vcpu);
+
+	if ((old_cr4 ^ sregs->cr4) & X86_CR4_OSXSAVE)
+		kvm_osxsave_update_cpuid(vcpu, !!(sregs->cr4 & X86_CR4_OSXSAVE));
+	if ((old_cr4 ^ sregs->cr4) & X86_CR4_PKE)
+		kvm_pke_update_cpuid(vcpu, !!(sregs->cr4 & X86_CR4_PKE));
 
 	idx = srcu_read_lock(&vcpu->kvm->srcu);
 	if (is_pae_paging(vcpu)) {
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 4/7] kvm: x86: Extract kvm_mwait_update_cpuid() from kvm_update_cpuid_runtime()
  2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
                   ` (2 preceding siblings ...)
  2020-10-21  9:10 ` [PATCH v2 3/7] kvm: x86: Extract kvm_osxsave_update_cpuid() and kvm_pke_update_cpuid() " Robert Hoo
@ 2020-10-21  9:10 ` Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 5/7] [Trivial] kvm: x86: cpuid_query_maxphyaddr(): Use a simple 'e' instead of misleading 'best', as the variable name Robert Hoo
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

And let kvm_set_msr_common() call kvm_mwait_update_cpuid() instead of whole
kvm_update_cpuid_runtime().

Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 5 +++++
 arch/x86/kvm/cpuid.h | 1 +
 arch/x86/kvm/x86.c   | 3 ++-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 18cd27a..556c018 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -88,6 +88,11 @@ void kvm_osxsave_update_cpuid(struct kvm_vcpu *vcpu, bool set)
 		guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_OSXSAVE, set);
 }
 
+void kvm_mwait_update_cpuid(struct kvm_vcpu *vcpu, bool set)
+{
+	guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_MWAIT, set);
+}
+
 void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set)
 {
 	guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_APIC, set);
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 98ea431..7eabb44 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -12,6 +12,7 @@
 void kvm_osxsave_update_cpuid(struct kvm_vcpu *vcpu, bool set);
 void kvm_pke_update_cpuid(struct kvm_vcpu *vcpu, bool set);
 void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set);
+void kvm_mwait_update_cpuid(struct kvm_vcpu *vcpu, bool set);
 void kvm_xcr0_update_cpuid(struct kvm_vcpu *vcpu);
 
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 5e9a51d..0d3cb34 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2936,8 +2936,9 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 		    ((vcpu->arch.ia32_misc_enable_msr ^ data) & MSR_IA32_MISC_ENABLE_MWAIT)) {
 			if (!guest_cpuid_has(vcpu, X86_FEATURE_XMM3))
 				return 1;
+			kvm_mwait_update_cpuid(vcpu, !!(data & MSR_IA32_MISC_ENABLE_MWAIT));
+
 			vcpu->arch.ia32_misc_enable_msr = data;
-			kvm_update_cpuid_runtime(vcpu);
 		} else {
 			vcpu->arch.ia32_misc_enable_msr = data;
 		}
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 5/7] [Trivial] kvm: x86: cpuid_query_maxphyaddr(): Use a simple 'e' instead of misleading 'best', as the variable name
  2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
                   ` (3 preceding siblings ...)
  2020-10-21  9:10 ` [PATCH v2 4/7] kvm: x86: Extract kvm_mwait_update_cpuid() " Robert Hoo
@ 2020-10-21  9:10 ` Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 6/7] kvm: x86: Refactor kvm_vcpu_after_set_cpuid() Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 7/7] kvm: x86: Remove kvm_update_cpuid_runtime() Robert Hoo
  6 siblings, 0 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

Function's logic doesn't change at all.

Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 556c018..ff2d73c 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -227,14 +227,14 @@ static void cpuid_fix_nx_cap(struct kvm_vcpu *vcpu)
 
 int cpuid_query_maxphyaddr(struct kvm_vcpu *vcpu)
 {
-	struct kvm_cpuid_entry2 *best;
+	struct kvm_cpuid_entry2 *e;
 
-	best = kvm_find_cpuid_entry(vcpu, 0x80000000, 0);
-	if (!best || best->eax < 0x80000008)
+	e = kvm_find_cpuid_entry(vcpu, 0x80000000, 0);
+	if (!e || e->eax < 0x80000008)
 		goto not_found;
-	best = kvm_find_cpuid_entry(vcpu, 0x80000008, 0);
-	if (best)
-		return best->eax & 0xff;
+	e = kvm_find_cpuid_entry(vcpu, 0x80000008, 0);
+	if (e)
+		return e->eax & 0xff;
 not_found:
 	return 36;
 }
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 6/7] kvm: x86: Refactor kvm_vcpu_after_set_cpuid()
  2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
                   ` (4 preceding siblings ...)
  2020-10-21  9:10 ` [PATCH v2 5/7] [Trivial] kvm: x86: cpuid_query_maxphyaddr(): Use a simple 'e' instead of misleading 'best', as the variable name Robert Hoo
@ 2020-10-21  9:10 ` Robert Hoo
  2020-10-21  9:10 ` [PATCH v2 7/7] kvm: x86: Remove kvm_update_cpuid_runtime() Robert Hoo
  6 siblings, 0 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

Extract kvm_pv_unhalt_toggle_cpuid() from kvm_update_cpuid_runtime().
Add/wrap other 2 functions: kvm_pv_unhalt_toggle_cpuid() and
kvm_pv_unhalt_toggle_cpuid().
Refactor kvm_vcpu_after_set_cpuid() with these new functions.

kvm_vcpu_after_set_cpuid() contents doesn't essentially change.

Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 59 +++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 40 insertions(+), 19 deletions(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index ff2d73c..454eda9 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -125,6 +125,41 @@ void kvm_xcr0_update_cpuid(struct kvm_vcpu *vcpu)
 		e->ebx = xstate_required_size(vcpu->arch.xcr0, true);
 }
 
+static void kvm_pv_unhalt_toggle_cpuid(struct kvm_vcpu *vcpu)
+{
+	struct kvm_cpuid_entry2 *e;
+
+	e = kvm_find_cpuid_entry(vcpu, KVM_CPUID_FEATURES, 0);
+	if (kvm_hlt_in_guest(vcpu->kvm) && e &&
+	    (e->eax & (1 << KVM_FEATURE_PV_UNHALT)))
+		e->eax &= ~(1 << KVM_FEATURE_PV_UNHALT);
+}
+
+static void kvm_update_maxphyaddr(struct kvm_vcpu *vcpu)
+{
+
+	/* Note, maxphyaddr must be updated before tdp_level. */
+	vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu);
+	kvm_mmu_reset_context(vcpu);
+}
+
+static void kvm_update_lapic_timer_mode(struct kvm_vcpu *vcpu)
+{
+	struct kvm_lapic *apic = vcpu->arch.apic;
+
+	if (apic) {
+		struct kvm_cpuid_entry2 *e;
+
+		e = kvm_find_cpuid_entry(vcpu, 1, 0);
+		if (!e)
+			return;
+		if (cpuid_entry_has(e, X86_FEATURE_TSC_DEADLINE_TIMER))
+			apic->lapic_timer.timer_mode_mask = 3 << 17;
+		else
+			apic->lapic_timer.timer_mode_mask = 1 << 17;
+	}
+}
+
 void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
 {
 	struct kvm_cpuid_entry2 *best;
@@ -170,30 +205,16 @@ void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
 
 static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 {
-	struct kvm_lapic *apic = vcpu->arch.apic;
-	struct kvm_cpuid_entry2 *best;
-
 	kvm_x86_ops.vcpu_after_set_cpuid(vcpu);
 
-	best = kvm_find_cpuid_entry(vcpu, 1, 0);
-	if (best && apic) {
-		if (cpuid_entry_has(best, X86_FEATURE_TSC_DEADLINE_TIMER))
-			apic->lapic_timer.timer_mode_mask = 3 << 17;
-		else
-			apic->lapic_timer.timer_mode_mask = 1 << 17;
+	kvm_update_lapic_timer_mode(vcpu);
+	kvm_apic_set_version(vcpu);
 
-		kvm_apic_set_version(vcpu);
-	}
+	kvm_xcr0_update_cpuid(vcpu);
 
-	best = kvm_find_cpuid_entry(vcpu, 0xD, 0);
-	if (!best)
-		vcpu->arch.guest_supported_xcr0 = 0;
-	else
-		vcpu->arch.guest_supported_xcr0 =
-			(best->eax | ((u64)best->edx << 32)) & supported_xcr0;
+	kvm_update_maxphyaddr(vcpu);
 
-	vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu);
-	kvm_mmu_reset_context(vcpu);
+	kvm_pv_unhalt_toggle_cpuid(vcpu);
 
 	kvm_pmu_refresh(vcpu);
 	vcpu->arch.cr4_guest_rsvd_bits =
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 7/7] kvm: x86: Remove kvm_update_cpuid_runtime()
  2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
                   ` (5 preceding siblings ...)
  2020-10-21  9:10 ` [PATCH v2 6/7] kvm: x86: Refactor kvm_vcpu_after_set_cpuid() Robert Hoo
@ 2020-10-21  9:10 ` Robert Hoo
  6 siblings, 0 replies; 8+ messages in thread
From: Robert Hoo @ 2020-10-21  9:10 UTC (permalink / raw)
  To: sean.j.christopherson, pbonzini, xiaoyao.li, vkuznets, wanpengli,
	jmattson, joro
  Cc: kvm, robert.hu, Robert Hoo

Now kvm_update_cpuid_runtime() has been discerped into previous
extracted functions, and kvm_vcpu_after_set_cpuid() has all necessary
updates for kvm_vcpu_ioctl_set_cpuid2(), remove kvm_update_cpuid_runtime().

Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 45 ---------------------------------------------
 arch/x86/kvm/cpuid.h |  1 -
 2 files changed, 46 deletions(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 454eda9..8f40148 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -160,49 +160,6 @@ static void kvm_update_lapic_timer_mode(struct kvm_vcpu *vcpu)
 	}
 }
 
-void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
-{
-	struct kvm_cpuid_entry2 *best;
-
-	best = kvm_find_cpuid_entry(vcpu, 1, 0);
-	if (best) {
-		/* Update OSXSAVE bit */
-		if (boot_cpu_has(X86_FEATURE_XSAVE))
-			cpuid_entry_change(best, X86_FEATURE_OSXSAVE,
-				   kvm_read_cr4_bits(vcpu, X86_CR4_OSXSAVE));
-
-		cpuid_entry_change(best, X86_FEATURE_APIC,
-			   vcpu->arch.apic_base & MSR_IA32_APICBASE_ENABLE);
-	}
-
-	best = kvm_find_cpuid_entry(vcpu, 7, 0);
-	if (best && boot_cpu_has(X86_FEATURE_PKU) && best->function == 0x7)
-		cpuid_entry_change(best, X86_FEATURE_OSPKE,
-				   kvm_read_cr4_bits(vcpu, X86_CR4_PKE));
-
-	best = kvm_find_cpuid_entry(vcpu, 0xD, 0);
-	if (best)
-		best->ebx = xstate_required_size(vcpu->arch.xcr0, false);
-
-	best = kvm_find_cpuid_entry(vcpu, 0xD, 1);
-	if (best && (cpuid_entry_has(best, X86_FEATURE_XSAVES) ||
-		     cpuid_entry_has(best, X86_FEATURE_XSAVEC)))
-		best->ebx = xstate_required_size(vcpu->arch.xcr0, true);
-
-	best = kvm_find_cpuid_entry(vcpu, KVM_CPUID_FEATURES, 0);
-	if (kvm_hlt_in_guest(vcpu->kvm) && best &&
-		(best->eax & (1 << KVM_FEATURE_PV_UNHALT)))
-		best->eax &= ~(1 << KVM_FEATURE_PV_UNHALT);
-
-	if (!kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT)) {
-		best = kvm_find_cpuid_entry(vcpu, 0x1, 0);
-		if (best)
-			cpuid_entry_change(best, X86_FEATURE_MWAIT,
-					   vcpu->arch.ia32_misc_enable_msr &
-					   MSR_IA32_MISC_ENABLE_MWAIT);
-	}
-}
-
 static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 {
 	kvm_x86_ops.vcpu_after_set_cpuid(vcpu);
@@ -302,7 +259,6 @@ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu,
 	}
 
 	cpuid_fix_nx_cap(vcpu);
-	kvm_update_cpuid_runtime(vcpu);
 	kvm_vcpu_after_set_cpuid(vcpu);
 
 	kvfree(cpuid_entries);
@@ -330,7 +286,6 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,
 		goto out;
 	}
 
-	kvm_update_cpuid_runtime(vcpu);
 	kvm_vcpu_after_set_cpuid(vcpu);
 out:
 	return r;
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 7eabb44..7ef46bc 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -15,7 +15,6 @@
 void kvm_mwait_update_cpuid(struct kvm_vcpu *vcpu, bool set);
 void kvm_xcr0_update_cpuid(struct kvm_vcpu *vcpu);
 
-void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu);
 struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
 					      u32 function, u32 index);
 int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid,
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-10-21  9:10 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-21  9:10 [PATCH v2 0/7] Split kvm_update_cpuid_runtime() Robert Hoo
2020-10-21  9:10 ` [PATCH v2 1/7] kvm: x86: Extract kvm_apic_base_update_cpuid() from kvm_update_cpuid_runtime() Robert Hoo
2020-10-21  9:10 ` [PATCH v2 2/7] kvm: x86: Extract kvm_xcr0_update_cpuid() " Robert Hoo
2020-10-21  9:10 ` [PATCH v2 3/7] kvm: x86: Extract kvm_osxsave_update_cpuid() and kvm_pke_update_cpuid() " Robert Hoo
2020-10-21  9:10 ` [PATCH v2 4/7] kvm: x86: Extract kvm_mwait_update_cpuid() " Robert Hoo
2020-10-21  9:10 ` [PATCH v2 5/7] [Trivial] kvm: x86: cpuid_query_maxphyaddr(): Use a simple 'e' instead of misleading 'best', as the variable name Robert Hoo
2020-10-21  9:10 ` [PATCH v2 6/7] kvm: x86: Refactor kvm_vcpu_after_set_cpuid() Robert Hoo
2020-10-21  9:10 ` [PATCH v2 7/7] kvm: x86: Remove kvm_update_cpuid_runtime() Robert Hoo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).