[PATCH v3 15/18] KVM: VMX: Ensure CPU is stable when probing basic VMX support

Sean Christopherson posted 18 patches 2 years, 9 months ago
There is a newer version of this series
[PATCH v3 15/18] KVM: VMX: Ensure CPU is stable when probing basic VMX support
Posted by Sean Christopherson 2 years, 9 months ago
Disable migration when probing VMX support during module load to ensure
the CPU is stable, mostly to match similar SVM logic, where allowing
migration effective requires deliberately writing buggy code.  As a bonus,
KVM won't report the wrong CPU to userspace if VMX is unsupported, but in
practice that is a very, very minor bonus as the only way that reporting
the wrong CPU would actually matter is if hardware is broken or if the
system is misconfigured, i.e. if KVM gets migrated from a CPU that _does_
support VMX to a CPU that does _not_ support VMX.

Signed-off-by: Sean Christopherson <seanjc@google.com>
---
 arch/x86/kvm/vmx/vmx.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index e00dba166a9e..008914396180 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -2740,9 +2740,9 @@ static int setup_vmcs_config(struct vmcs_config *vmcs_conf,
 	return 0;
 }
 
-static bool kvm_is_vmx_supported(void)
+static bool __kvm_is_vmx_supported(void)
 {
-	int cpu = raw_smp_processor_id();
+	int cpu = smp_processor_id();
 
 	if (!(cpuid_ecx(1) & feature_bit(VMX))) {
 		pr_err("VMX not supported by CPU %d\n", cpu);
@@ -2758,13 +2758,24 @@ static bool kvm_is_vmx_supported(void)
 	return true;
 }
 
+static bool kvm_is_vmx_supported(void)
+{
+	bool supported;
+
+	migrate_disable();
+	supported = __kvm_is_vmx_supported();
+	migrate_enable();
+
+	return supported;
+}
+
 static int vmx_check_processor_compat(void)
 {
 	int cpu = raw_smp_processor_id();
 	struct vmcs_config vmcs_conf;
 	struct vmx_capability vmx_cap;
 
-	if (!kvm_is_vmx_supported())
+	if (!__kvm_is_vmx_supported())
 		return -EIO;
 
 	if (setup_vmcs_config(&vmcs_conf, &vmx_cap) < 0) {
-- 
2.40.1.606.ga4b1b128d6-goog
Re: [PATCH v3 15/18] KVM: VMX: Ensure CPU is stable when probing basic VMX support
Posted by Huang, Kai 2 years, 8 months ago
On Fri, 2023-05-12 at 16:50 -0700, Sean Christopherson wrote:
> Disable migration when probing VMX support during module load to ensure
> the CPU is stable, mostly to match similar SVM logic, where allowing
> migration effective requires deliberately writing buggy code.  As a bonus,
> KVM won't report the wrong CPU to userspace if VMX is unsupported, but in
> practice that is a very, very minor bonus as the only way that reporting
> the wrong CPU would actually matter is if hardware is broken or if the
> system is misconfigured, i.e. if KVM gets migrated from a CPU that _does_
> support VMX to a CPU that does _not_ support VMX.
> 
> Signed-off-by: Sean Christopherson <seanjc@google.com>

Reviewed-by: Kai Huang <kai.huang@intel.com>

> ---
>  arch/x86/kvm/vmx/vmx.c | 17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index e00dba166a9e..008914396180 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -2740,9 +2740,9 @@ static int setup_vmcs_config(struct vmcs_config *vmcs_conf,
>  	return 0;
>  }
>  
> -static bool kvm_is_vmx_supported(void)
> +static bool __kvm_is_vmx_supported(void)
>  {
> -	int cpu = raw_smp_processor_id();
> +	int cpu = smp_processor_id();
>  
>  	if (!(cpuid_ecx(1) & feature_bit(VMX))) {
>  		pr_err("VMX not supported by CPU %d\n", cpu);
> @@ -2758,13 +2758,24 @@ static bool kvm_is_vmx_supported(void)
>  	return true;
>  }
>  
> +static bool kvm_is_vmx_supported(void)
> +{
> +	bool supported;
> +
> +	migrate_disable();
> +	supported = __kvm_is_vmx_supported();
> +	migrate_enable();
> +
> +	return supported;
> +}
> +
>  static int vmx_check_processor_compat(void)
>  {
>  	int cpu = raw_smp_processor_id();
>  	struct vmcs_config vmcs_conf;
>  	struct vmx_capability vmx_cap;
>  
> -	if (!kvm_is_vmx_supported())
> +	if (!__kvm_is_vmx_supported())
>  		return -EIO;
>  
>  	if (setup_vmcs_config(&vmcs_conf, &vmx_cap) < 0) {
> -- 
> 2.40.1.606.ga4b1b128d6-goog
>