linux-edac.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/16] x86/cpu: Clean up handling of VMX features
@ 2019-10-04 21:55 Sean Christopherson
  2019-10-04 21:56 ` [PATCH 01/16] x86/intel: Initialize IA32_FEATURE_CONTROL MSR at boot Sean Christopherson
                   ` (15 more replies)
  0 siblings, 16 replies; 34+ messages in thread
From: Sean Christopherson @ 2019-10-04 21:55 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, x86,
	Peter Zijlstra, Arnaldo Carvalho de Melo, Paolo Bonzini,
	Radim Krčmář,
	Tony Luck, Tony W Wang-oc
  Cc: H. Peter Anvin, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Namhyung Kim, Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li,
	Jim Mattson, Joerg Roedel, linux-kernel, kvm, linux-edac,
	Borislav Petkov, Jarkko Sakkinen

Clean up a handful of interrelated warts in the kernel's handling of VMX:

  - Enable VMX in IA32_FEATURE_CONTROL during boot instead of on-demand
    during KVM load to avoid future contention over writing the MSR.

  - Rework VMX feature reporting so that it is accurate and up-to-date,
    now and in the future.

  - Consolidate code across CPUs that support VMX.

The patches are based on tip/x86/cpu, commit
 
  87d6021b8143 ("x86/math-emu: Limit MATH_EMULATION to 486SX compatibles")

Please let me know if you'd prefer not to receive the full patch set on
future versions of the series.  I cc'd everyone on all patches to provide
the full picture, e.g. the motivation behind things like the perf patch.


This series stems from two separate but related issues.  The first issue,
pointed out by Boris in the SGX enabling series[1], is that the kernel
currently doesn't ensure the IA32_FEATURE_CONTROL MSR is configured during
boot.  The second issue is that the kernel's reporting of VMX features is
stale, potentially inaccurate, and difficult to maintain.

== IA32_FEATURE_CONTROL ==
Lack of IA32_FEATURE_CONTROL configuration during boot isn't a functional
issue in the current kernel as the majority of platforms set and lock
IA32_FEATURE_CONTROL in firmware.  And when the MSR is left unlocked, KVM
is the only subsystem that writes IA32_FEATURE_CONTROL.  That will change
if/when SGX support is enabled, as SGX will also want to fully enable
itself when IA32_FEATURE_CONTROL is unlocked.

== VMX Feature Reporting ==
VMX features are not enumerated via CPUID, but instead are enumerated
through VMX MSRs.  As a result, new VMX features are not automatically
reported via /proc/cpuinfo.

An attempt was made long ago to report interesting and/or meaningful VMX
features by synthesizing select features into a Linux-defined cpufeatures
word.  Synthetic feature flags worked for the initial purpose, but the
existence of the synthetic flags was forgotten almost immediately, e.g.
only one new flag (EPT A/D) has been added in the the decade since the
synthetic VMX features were introduced, while VMX and KVM have gained
support for many new features.

Placing the synthetic flags in x86_capability also allows them to be
queried via cpu_has() and company, which is misleading as the flags exist
purely for reporting via /proc/cpuinfo.  KVM, the only in-kernel user of
VMX, ignores the flags.

Last but not least, VMX features are reported in /proc/cpuinfo even
when VMX is unusable due to lack of enabling in IA32_FEATURE_CONTROL.

== Caveats ==
All of the testing of non-standard flows was done in a VM, as I don't
have a system that leaves IA32_FEATURE_CONTROL unlocked, or locks it with
VMX disabled.

The Centaur and Zhaoxin changes are somewhat speculative, as I haven't
confirmed they actually support IA32_FEATURE_CONTROL, or that they want to
gain "official" KVM support.  I assume they unofficially support KVM given
that both CPUs went through the effort of enumerating VMX features.  That
in turn would require them to support IA32_FEATURE_CONTROL since KVM will
fault and refuse to load if the MSR doesn't exist.

[1] https://lkml.kernel.org/r/20190925085156.GA3891@zn.tnic


Sean Christopherson (16):
  x86/intel: Initialize IA32_FEATURE_CONTROL MSR at boot
  x86/mce: WARN once if IA32_FEATURE_CONTROL MSR is left unlocked
  x86/centaur: Use common IA32_FEATURE_CONTROL MSR initialization
  x86/zhaoxin: Use common IA32_FEATURE_CONTROL MSR initialization
  KVM: VMX: Drop initialization of IA32_FEATURE_CONTROL MSR
  x86/cpu: Clear VMX feature flag if VMX is not fully enabled
  KVM: VMX: Use VMX feature flag to query BIOS enabling
  KVM: VMX: Check for full VMX support when verifying CPU compatibility
  x86/vmx: Introduce VMX_FEATURES_*
  x86/cpu: Detect VMX features on Intel, Centaur and Zhaoxin CPUs
  x86/cpu: Print VMX features as separate line item in /proc/cpuinfo
  x86/cpufeatures: Drop synthetic VMX feature flags
  KVM: VMX: Use VMX_FEATURE_* flags to define VMCS control bits
  x86/cpufeatures: Clean up synthetic virtualization flags
  perf/x86: Provide stubs of KVM helpers for non-Intel CPUs
  KVM: VMX: Allow KVM_INTEL when building for Centaur and/or Zhaoxin
    CPUs

 MAINTAINERS                           |   2 +-
 arch/x86/Kconfig.cpu                  |   8 ++
 arch/x86/boot/mkcpustr.c              |   1 +
 arch/x86/include/asm/cpufeatures.h    |  15 +---
 arch/x86/include/asm/perf_event.h     |  22 +++--
 arch/x86/include/asm/processor.h      |   4 +
 arch/x86/include/asm/vmx.h            | 105 +++++++++++-----------
 arch/x86/include/asm/vmxfeatures.h    | 121 ++++++++++++++++++++++++++
 arch/x86/kernel/cpu/Makefile          |   6 +-
 arch/x86/kernel/cpu/centaur.c         |  35 +-------
 arch/x86/kernel/cpu/common.c          |   3 +
 arch/x86/kernel/cpu/cpu.h             |   4 +
 arch/x86/kernel/cpu/feature_control.c | 106 ++++++++++++++++++++++
 arch/x86/kernel/cpu/intel.c           |  49 +----------
 arch/x86/kernel/cpu/mce/intel.c       |   7 +-
 arch/x86/kernel/cpu/mkcapflags.sh     |  15 +++-
 arch/x86/kernel/cpu/proc.c            |  15 ++++
 arch/x86/kernel/cpu/zhaoxin.c         |  35 +-------
 arch/x86/kvm/Kconfig                  |   9 +-
 arch/x86/kvm/vmx/vmx.c                |  41 ++-------
 20 files changed, 368 insertions(+), 235 deletions(-)
 create mode 100644 arch/x86/include/asm/vmxfeatures.h
 create mode 100644 arch/x86/kernel/cpu/feature_control.c

-- 
2.22.0


^ permalink raw reply	[flat|nested] 34+ messages in thread
* Re: [PATCH 10/16] x86/cpu: Detect VMX features on Intel, Centaur and Zhaoxin CPUs
@ 2019-10-10  7:34 Tony W Wang-oc
  0 siblings, 0 replies; 34+ messages in thread
From: Tony W Wang-oc @ 2019-10-10  7:34 UTC (permalink / raw)
  To: Sean Christopherson, Thomas Gleixner, Ingo Molnar,
	Borislav Petkov, x86, Peter Zijlstra, Arnaldo Carvalho de Melo,
	Paolo Bonzini, Radim Krčmář,
	Tony Luck
  Cc: H. Peter Anvin, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Namhyung Kim, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, linux-kernel, kvm, linux-edac, Borislav Petkov,
	Jarkko Sakkinen

On Sat, Oct 5, 2019, Sean Christopherson wrote:
>Add an entry in struct cpuinfo_x86 to track VMX capabilities and fill
>the capabilities during IA32_FEATURE_CONTROL MSR initialization.
>
>Make the VMX capabilities dependent on X86_INTEL_FEATURE_CONTROL and
>X86_FEATURE_NAMES so as to avoid unnecessary overhead on CPUs that
>can't
>possibly support VMX, or when /proc/cpuinfo is not available.
>
>Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
>---
> arch/x86/Kconfig.cpu                  |  4 ++
> arch/x86/include/asm/processor.h      |  3 ++
> arch/x86/include/asm/vmxfeatures.h    |  5 +++
> arch/x86/kernel/cpu/common.c          |  3 ++
> arch/x86/kernel/cpu/feature_control.c | 59
>+++++++++++++++++++++++++++
> 5 files changed, 74 insertions(+)
>
>diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu
>index e78f39adae7b..e7571bd0f515 100644
>--- a/arch/x86/Kconfig.cpu
>+++ b/arch/x86/Kconfig.cpu
>@@ -391,6 +391,10 @@ config X86_FEATURE_CONTROL_MSR
> 	def_bool y
> 	depends on CPU_SUP_INTEL || CPU_SUP_CENTAUR ||
>CPU_SUP_ZHAOXIN
>
>+config X86_VMX_FEATURE_NAMES
>+	def_bool y
>+	depends on X86_FEATURE_CONTROL_MSR &&
>X86_FEATURE_NAMES
>+
> menuconfig PROCESSOR_SELECT
> 	bool "Supported processor vendors" if EXPERT
> 	---help---
>diff --git a/arch/x86/include/asm/processor.h
>b/arch/x86/include/asm/processor.h
>index 4c3f41d7be5f..3b5dc9b1e7c4 100644
>--- a/arch/x86/include/asm/processor.h
>+++ b/arch/x86/include/asm/processor.h
>@@ -84,6 +84,9 @@ struct cpuinfo_x86 {
> #ifdef CONFIG_X86_64
> 	/* Number of 4K pages in DTLB/ITLB combined(in pages): */
> 	int			x86_tlbsize;
>+#endif
>+#ifdef CONFIG_X86_VMX_FEATURE_NAMES
>+	__u32			vmx_capability[NVMXINTS];
> #endif
> 	__u8			x86_virt_bits;
> 	__u8			x86_phys_bits;
>diff --git a/arch/x86/include/asm/vmxfeatures.h
>b/arch/x86/include/asm/vmxfeatures.h
>index ab82e3643d0c..d33ea1c165fd 100644
>--- a/arch/x86/include/asm/vmxfeatures.h
>+++ b/arch/x86/include/asm/vmxfeatures.h
>@@ -2,6 +2,11 @@
> #ifndef _ASM_X86_VMXFEATURES_H
> #define _ASM_X86_VMXFEATURES_H
>
>+/*
>+ * Defines VMX CPU feature bits
>+ */
>+#define NVMXINTS			3 /* N 32-bit words worth of info */
>+
> /*
>  * Note: If the comment begins with a quoted string, that string is used
>  * in /proc/cpuinfo instead of the macro name.  If the string is "",
>diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
>index 9ae7d1bcd4f4..33537556dac6 100644
>--- a/arch/x86/kernel/cpu/common.c
>+++ b/arch/x86/kernel/cpu/common.c
>@@ -1421,6 +1421,9 @@ static void identify_cpu(struct cpuinfo_x86 *c)
> #endif
> 	c->x86_cache_alignment = c->x86_clflush_size;
> 	memset(&c->x86_capability, 0, sizeof(c->x86_capability));
>+#ifdef CONFIG_X86_VMX_FEATURE_NAMES
>+	memset(&c->vmx_capability, 0, sizeof(c->vmx_capability));
>+#endif
>
> 	generic_identify(c);
>
>diff --git a/arch/x86/kernel/cpu/feature_control.c
>b/arch/x86/kernel/cpu/feature_control.c
>index 74c76159a046..43eb65e8cd18 100644
>--- a/arch/x86/kernel/cpu/feature_control.c
>+++ b/arch/x86/kernel/cpu/feature_control.c
>@@ -4,6 +4,61 @@
> #include <asm/cpufeature.h>
> #include <asm/msr-index.h>
> #include <asm/processor.h>
>+#include <asm/vmx.h>
>+
>+#ifdef CONFIG_X86_VMX_FEATURE_NAMES
>+enum vmx_feature_leafs {
>+	MISC_FEATURES = 0,
>+	PRIMARY_PROC_CONTROLS,
>+	SECONDARY_PROC_CONTROLS,
>+	NR_VMX_FEATURE_WORDS,
>+};
>+
>+#define EPT_BIT(x) BIT(VMX_FEATURE_##x & 0x1f)
>+
>+static void init_vmx_capabilities(struct cpuinfo_x86 *c)
>+{
>+	u32 supported, funcs, ept, vpid, ign;
>+
>+	BUILD_BUG_ON(NVMXINTS != NR_VMX_FEATURE_WORDS);
>+
>+	/*
>+	 * The high bits contain the allowed-1 settings, i.e. features that can
>+	 * be turned on.  The low bits contain the allowed-0 settings, i.e.
>+	 * features that can be turned off.  Ignore the allowed-0 settings,
>+	 * if a feature can be turned on then it's supported.
>+	 */
>+	rdmsr(MSR_IA32_VMX_PINBASED_CTLS, ign, supported);
>+	rdmsr_safe(MSR_IA32_VMX_VMFUNC, &ign, &funcs);
>+
>+	/*
>+	 * Except for EPT+VPID, which enumerates support for both in a single
>+	 * MSR, low for EPT, high for VPID.
>+	 */
>+	rdmsr_safe(MSR_IA32_VMX_EPT_VPID_CAP, &ept, &vpid);
>+
>+	/* Pin, EPT, VPID and VM-Func are merged into a single word. */
>+	WARN_ON_ONCE(supported >> 16);
>+	WARN_ON_ONCE(funcs >> 4);
>+	c->vmx_capability[MISC_FEATURES] = (supported & 0xffff) |
>+					   ((vpid & 0x1) << 24) |
>+					   ((funcs & 0xf) << 28);
>+
>+	/* EPT bits are scattered and must be manually handled. */
>+	if (ept & VMX_EPT_EXECUTE_ONLY_BIT)
>+		c->vmx_capability[MISC_FEATURES] |=
>EPT_BIT(EPT_EXECUTE_ONLY);
>+	if (ept & VMX_EPT_1GB_PAGE_BIT)

Typo? Should be: if (ept & VMX_EPT_AD_BIT)

TonyWWang-oc

>+		c->vmx_capability[MISC_FEATURES] |= EPT_BIT(EPT_AD);
>+	if (ept & VMX_EPT_1GB_PAGE_BIT)
>+		c->vmx_capability[MISC_FEATURES] |= EPT_BIT(EPT_1GB);
>+
>+	rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, ign, supported);
>+	c->vmx_capability[PRIMARY_PROC_CONTROLS] = supported;
>+
>+	rdmsr_safe(MSR_IA32_VMX_PROCBASED_CTLS2, &ign, &supported);
>+	c->vmx_capability[SECONDARY_PROC_CONTROLS] = supported;
>+}
>+#endif /* CONFIG_X86_VMX_FEATURE_NAMES */
>
> void init_feature_control_msr(struct cpuinfo_x86 *c)
> {
>@@ -43,5 +98,9 @@ void init_feature_control_msr(struct cpuinfo_x86 *c)
> 		pr_err_once("x86/cpu: VMX disabled by BIOS (TXT %s)\n",
> 			    tboot ? "enabled" : "disabled");
> 		clear_cpu_cap(c, X86_FEATURE_VMX);
>+	} else {
>+#ifdef CONFIG_X86_VMX_FEATURE_NAMES
>+		init_vmx_capabilities(c);
>+#endif
> 	}
> }
>--
>2.22.0


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

end of thread, other threads:[~2019-10-10  7:39 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-04 21:55 [PATCH 00/16] x86/cpu: Clean up handling of VMX features Sean Christopherson
2019-10-04 21:56 ` [PATCH 01/16] x86/intel: Initialize IA32_FEATURE_CONTROL MSR at boot Sean Christopherson
2019-10-07 17:05   ` Paolo Bonzini
2019-10-07 17:10     ` Sean Christopherson
2019-10-04 21:56 ` [PATCH 02/16] x86/mce: WARN once if IA32_FEATURE_CONTROL MSR is left unlocked Sean Christopherson
2019-10-04 21:56 ` [PATCH 03/16] x86/centaur: Use common IA32_FEATURE_CONTROL MSR initialization Sean Christopherson
2019-10-04 21:56 ` [PATCH 04/16] x86/zhaoxin: " Sean Christopherson
2019-10-04 21:56 ` [PATCH 05/16] KVM: VMX: Drop initialization of IA32_FEATURE_CONTROL MSR Sean Christopherson
2019-10-04 23:24   ` Jim Mattson
2019-10-04 21:56 ` [PATCH 06/16] x86/cpu: Clear VMX feature flag if VMX is not fully enabled Sean Christopherson
2019-10-04 21:56 ` [PATCH 07/16] KVM: VMX: Use VMX feature flag to query BIOS enabling Sean Christopherson
2019-10-04 23:26   ` Jim Mattson
2019-10-04 21:56 ` [PATCH 08/16] KVM: VMX: Check for full VMX support when verifying CPU compatibility Sean Christopherson
2019-10-04 23:35   ` Jim Mattson
2019-10-04 21:56 ` [PATCH 09/16] x86/vmx: Introduce VMX_FEATURES_* Sean Christopherson
2019-10-07 17:08   ` Paolo Bonzini
2019-10-07 17:13     ` Sean Christopherson
2019-10-04 21:56 ` [PATCH 10/16] x86/cpu: Detect VMX features on Intel, Centaur and Zhaoxin CPUs Sean Christopherson
2019-10-07 17:11   ` Paolo Bonzini
2019-10-07 19:54     ` Sean Christopherson
2019-10-08  6:55       ` Paolo Bonzini
2019-10-04 21:56 ` [PATCH 11/16] x86/cpu: Print VMX features as separate line item in /proc/cpuinfo Sean Christopherson
2019-10-07 17:12   ` Paolo Bonzini
2019-10-07 19:56     ` Sean Christopherson
2019-10-08  6:57       ` Paolo Bonzini
2019-10-08 16:53         ` Jim Mattson
2019-10-09 19:16         ` Sean Christopherson
2019-10-09 21:13           ` Paolo Bonzini
2019-10-04 21:56 ` [PATCH 12/16] x86/cpufeatures: Drop synthetic VMX feature flags Sean Christopherson
2019-10-04 21:56 ` [PATCH 13/16] KVM: VMX: Use VMX_FEATURE_* flags to define VMCS control bits Sean Christopherson
2019-10-04 21:56 ` [PATCH 14/16] x86/cpufeatures: Clean up synthetic virtualization flags Sean Christopherson
2019-10-04 21:56 ` [PATCH 15/16] perf/x86: Provide stubs of KVM helpers for non-Intel CPUs Sean Christopherson
2019-10-04 21:56 ` [PATCH 16/16] KVM: VMX: Allow KVM_INTEL when building for Centaur and/or Zhaoxin CPUs Sean Christopherson
2019-10-10  7:34 [PATCH 10/16] x86/cpu: Detect VMX features on Intel, Centaur and " Tony W Wang-oc

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).