@@ -59,9 +59,30 @@ config KVM
If unsure, say N.
+if KVM=y
+
+choice
+ prompt "KVM built-in support"
+ help
+ In order to build a kernel with support for both AMD and Intel
+ CPUs, you need to set CONFIG_KVM=m instead.
+
+config KVM_AMD_STATIC
+ select KVM_AMD
+ bool "AMD"
+
+config KVM_INTEL_STATIC
+ select KVM_INTEL
+ bool "Intel"
+
+endchoice
+
+endif
+
config KVM_INTEL
- tristate "KVM for Intel processors support"
- depends on KVM
+ tristate
+ prompt "KVM for Intel processors support" if KVM=m
+ depends on (KVM=m && m) || KVM_INTEL_STATIC
# for perf_guest_get_msrs():
depends on CPU_SUP_INTEL
---help---
@@ -72,8 +93,9 @@ config KVM_INTEL
will be called kvm-intel.
config KVM_AMD
- tristate "KVM for AMD processors support"
- depends on KVM
+ tristate
+ prompt "KVM for AMD processors support" if KVM=m
+ depends on (KVM=m && m) || KVM_AMD_STATIC
---help---
Provides support for KVM on AMD processors equipped with the AMD-V
(SVM) extensions.
@@ -12,9 +12,8 @@ kvm-y += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \
i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o \
hyperv.o page_track.o debugfs.o
-kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o vmx/evmcs.o vmx/nested.o
-kvm-amd-y += svm.o pmu_amd.o
+kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o vmx/evmcs.o vmx/nested.o $(kvm-y)
+kvm-amd-y += svm.o pmu_amd.o $(kvm-y)
-obj-$(CONFIG_KVM) += kvm.o
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
obj-$(CONFIG_KVM_AMD) += kvm-amd.o
This is the first commit of a patch series that aims to replace the modular kvm.ko kernel module with a monolithic kvm-intel/kvm-amd model. This change has the only possible cons of wasting some disk space in /lib/modules/. The pros are that it saves CPUS and some minor iTLB and RAM which are more scarse resources than disk space. The pointer to function virtual template model cannot provide any runtime benefit because kvm-intel and kvm-amd can't be loaded at the same time. This removes kvm.ko and it links and duplicates all kvm.ko objects to both kvm-amd and kvm-intel. Linking both vmx and svm into the kernel at the same time isn't possible anymore or the kvm_x86/kvm_x86_pmu external function names would collide. Explanation of Kbuild from Paolo Bonzini follows: === The left side of the "||" ensures that, if KVM=m, you can only choose module build for both KVM_INTEL and KVM_AMD. Having just "depends on KVM" would allow a pre-existing .config to choose the now-invalid combination CONFIG_KVM=y CONFIG_KVM_INTEL=y CONFIG_KVM_AMD=y The right side of the "||" part is just for documentation, to avoid that a selected symbol does not satisfy its dependencies. ==== Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> --- arch/x86/kvm/Kconfig | 30 ++++++++++++++++++++++++++---- arch/x86/kvm/Makefile | 5 ++--- 2 files changed, 28 insertions(+), 7 deletions(-)