- if (cpu_feature_enabled(X86_FEATURE_FRED) &&
guest_cpuid_has(&vmx->vcpu, X86_FEATURE_FRED)) {
IIUC, vmx_prepare_switch_to_host() is called from IRQ-disabled context. using guest_cpuid_has() in this context is not desired, see lockdep_assert_irqs_enabled() in cpuid_entry2_find().
Nice catch!
Anyway it's a bad idea to do a search call here, let me find a better way for all FRED CPUID checks.
diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h index f8c02bd37069..328a3447f064 100644 --- a/arch/x86/kvm/vmx/vmx.h +++ b/arch/x86/kvm/vmx/vmx.h @@ -276,6 +276,8 @@ struct vcpu_vmx { #ifdef CONFIG_X86_64 u64 msr_host_kernel_gs_base; u64 msr_guest_kernel_gs_base;
- u64 msr_host_fred_rsp0;
- u64 msr_guest_fred_rsp0;
resetting guest fred rsp0 to 0 during vcpu reset is missing.
hmm, I assume it gets the same treatment as guest_kernel_gs_base.
It seems we don't reset guest_kernel_gs_base. No?