On Wed, Oct 25, 2023, Vitaly Kuznetsov wrote: > Hyper-V emulation in KVM is a fairly big chunk and in some cases it may be > desirable to not compile it in to reduce module sizes as well as the attack > surface. Introduce CONFIG_KVM_HYPERV option to make it possible. > > Note, there's room for further nVMX/nSVM code optimizations when > !CONFIG_KVM_HYPERV, this will be done in follow-up patches. > > Reorganize Makefile a bit so all CONFIG_HYPERV and CONFIG_KVM_HYPERV files > are grouped together. > > Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> > --- ... > diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile > index 8ea872401cd6..b97b875ad75f 100644 > --- a/arch/x86/kvm/Makefile > +++ b/arch/x86/kvm/Makefile > @@ -11,32 +11,33 @@ include $(srctree)/virt/kvm/Makefile.kvm > > kvm-y += x86.o emulate.o i8259.o irq.o lapic.o \ > i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o \ > - hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o \ > + debugfs.o mmu/mmu.o mmu/page_track.o \ > mmu/spte.o > > -ifdef CONFIG_HYPERV > -kvm-y += kvm_onhyperv.o > -endif > - > kvm-$(CONFIG_X86_64) += mmu/tdp_iter.o mmu/tdp_mmu.o > +kvm-$(CONFIG_KVM_HYPERV) += hyperv.o > kvm-$(CONFIG_KVM_XEN) += xen.o > kvm-$(CONFIG_KVM_SMM) += smm.o > > kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ > - vmx/hyperv.o vmx/hyperv_evmcs.o vmx/nested.o vmx/posted_intr.o > -kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o > + vmx/nested.o vmx/posted_intr.o > > -ifdef CONFIG_HYPERV > -kvm-intel-y += vmx/vmx_onhyperv.o > -endif > +kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o > > kvm-amd-y += svm/svm.o svm/vmenter.o svm/pmu.o svm/nested.o svm/avic.o \ > - svm/sev.o svm/hyperv.o > + svm/sev.o > > ifdef CONFIG_HYPERV > +kvm-y += kvm_onhyperv.o > +kvm-intel-y += vmx/vmx_onhyperv.o vmx/hyperv_evmcs.o > kvm-amd-y += svm/svm_onhyperv.o > endif > > +ifdef CONFIG_KVM_HYPERV > +kvm-intel-y += vmx/hyperv.o vmx/hyperv_evmcs.o > +kvm-amd-y += svm/hyperv.o > +endif My strong preference is to avoid the unnecessary ifdef and instead do: kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ vmx/nested.o vmx/posted_intr.o kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o kvm-intel-$(CONFIG_KVM_HYPERV) += vmx/hyperv.o vmx/hyperv_evmcs.o kvm-amd-y += svm/svm.o svm/vmenter.o svm/pmu.o svm/nested.o svm/avic.o \ svm/sev.o kvm-amd-$(CONFIG_KVM_HYPERV) += svm/hyperv.o CONFIG_HYPERV needs an ifdef because it can be 'y' or 'm', but otherwise ifdefs just tend to be noisier. > static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu) > { > @@ -3552,11 +3563,13 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch) > if (!nested_vmx_check_permission(vcpu)) > return 1; > > +#ifdef CONFIG_KVM_HYPERV > evmptrld_status = nested_vmx_handle_enlightened_vmptrld(vcpu, launch); > if (evmptrld_status == EVMPTRLD_ERROR) { > kvm_queue_exception(vcpu, UD_VECTOR); > return 1; > } > +#endif > > kvm_pmu_trigger_event(vcpu, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); This fails to build with CONFIG_KVM_HYPERV=n && CONFIG_KVM_WERROR=y: arch/x86/kvm/vmx/nested.c:3577:9: error: variable 'evmptrld_status' is uninitialized when used here [-Werror,-Wuninitialized] if (CC(evmptrld_status == EVMPTRLD_VMFAIL)) ^~~~~~~~~~~~~~~ Sadly, simply wrapping with an #ifdef also fails because then evmptrld_status becomes unused. I'd really prefer to avoid having to tag it __maybe_unused, and adding more #ifdef would also be ugly. Any ideas?