On Tue, 2022-07-12 at 14:14 +0200, Vitaly Kuznetsov wrote: > 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. Makes sense now. Might be worth a comment somewhere. Best regards, Maxim Levitsky > > 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; > > > } > > > > > > > >