Maxim Levitsky <mlevitsk@xxxxxxxxxx> writes: > On Fri, 2022-07-08 at 16:42 +0200, Vitaly Kuznetsov wrote: >> With the updated eVMCSv1 definition, there's no known 'problematic' >> controls which are exposed in VMX control MSRs but are not present in >> eVMCSv1. Get rid of VMX control MSRs filtering for KVM on Hyper-V. > > If I understand correctly we are taking about running KVM as a nested guest of Hyper-V here: > > Don't we need to check the new CPUID bit and only then use the new fields of eVMCS, > aka check that the 'cpu' supports the updated eVMCS version? > I've checked various Hyper-V versions available around and it seems there's no need for that: these new features are exposed in VMX control MSRs only when the updated eVMCS is supported. We can, in theory, preserve the filtering for non-updated eVMCS verison but I'd vote for putting a WARN_ON() or something around: we can eventually get rid of it in case we don't get any reports. > Best regards, > Maxim Levitsky > > > >> >> Note: VMX control MSRs filtering for Hyper-V on KVM >> (nested_evmcs_filter_control_msr()) stays as even the updated eVMCSv1 >> definition doesn't have all the features implemented by KVM and some >> fields are still missing. Moreover, nested_evmcs_filter_control_msr() >> has to support the original eVMCSv1 version when VMM wishes so. >> >> Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> >> --- >> arch/x86/kvm/vmx/evmcs.c | 13 ------------- >> arch/x86/kvm/vmx/evmcs.h | 1 - >> arch/x86/kvm/vmx/vmx.c | 5 ----- >> 3 files changed, 19 deletions(-) >> >> diff --git a/arch/x86/kvm/vmx/evmcs.c b/arch/x86/kvm/vmx/evmcs.c >> index 52a53debd806..b5cfbf7d487b 100644 >> --- a/arch/x86/kvm/vmx/evmcs.c >> +++ b/arch/x86/kvm/vmx/evmcs.c >> @@ -320,19 +320,6 @@ const struct evmcs_field vmcs_field_to_evmcs_1[] = { >> }; >> const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); >> >> -#if IS_ENABLED(CONFIG_HYPERV) >> -__init void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf) >> -{ >> - vmcs_conf->cpu_based_exec_ctrl &= ~EVMCS1_UNSUPPORTED_EXEC_CTRL; >> - vmcs_conf->pin_based_exec_ctrl &= ~EVMCS1_UNSUPPORTED_PINCTRL; >> - vmcs_conf->cpu_based_2nd_exec_ctrl &= ~EVMCS1_UNSUPPORTED_2NDEXEC; >> - vmcs_conf->cpu_based_3rd_exec_ctrl = 0; >> - >> - vmcs_conf->vmexit_ctrl &= ~EVMCS1_UNSUPPORTED_VMEXIT_CTRL; >> - vmcs_conf->vmentry_ctrl &= ~EVMCS1_UNSUPPORTED_VMENTRY_CTRL; >> -} >> -#endif >> - >> bool nested_enlightened_vmentry(struct kvm_vcpu *vcpu, u64 *evmcs_gpa) >> { >> struct hv_vp_assist_page assist_page; >> diff --git a/arch/x86/kvm/vmx/evmcs.h b/arch/x86/kvm/vmx/evmcs.h >> index 4b809c79ae63..0feac101cce4 100644 >> --- a/arch/x86/kvm/vmx/evmcs.h >> +++ b/arch/x86/kvm/vmx/evmcs.h >> @@ -203,7 +203,6 @@ static inline void evmcs_load(u64 phys_addr) >> vp_ap->enlighten_vmentry = 1; >> } >> >> -__init void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf); >> #else /* !IS_ENABLED(CONFIG_HYPERV) */ >> static __always_inline void evmcs_write64(unsigned long field, u64 value) {} >> static inline void evmcs_write32(unsigned long field, u32 value) {} >> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c >> index b4915d841357..dd905ad72637 100644 >> --- a/arch/x86/kvm/vmx/vmx.c >> +++ b/arch/x86/kvm/vmx/vmx.c >> @@ -2689,11 +2689,6 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf, >> vmcs_conf->vmexit_ctrl = _vmexit_control; >> vmcs_conf->vmentry_ctrl = _vmentry_control; >> >> -#if IS_ENABLED(CONFIG_HYPERV) >> - if (enlightened_vmcs) >> - evmcs_sanitize_exec_ctrls(vmcs_conf); >> -#endif >> - >> return 0; >> } >> > > -- Vitaly