From b62a0bf95825aab317cc09654602c7e934decee3 Mon Sep 17 00:00:00 2001 From: Steffen Eiden Date: Wed, 30 Sep 2026 19:34:18 +0200 Subject: [PATCH] KVM: Replace CONFIG_KVM_MMIO with __KVM_NO_MMIO Defining KVM_MMIO is not flexible enough for multi-KVM systems where one KVM implements MMIO but others do not. Therefore, remove KVM_MMIO from the config space and use the macro __KVM_NO_MMIO instead. Define __KVM_NO_MMIO for KVM/s390 and for HV-only 64-bit Book3s (aka pSeries/sPAPR) configurations. In particular, for PowerPC configurations: * KVM_BOOK3S_32 got KVM_MMIO via KVM_BOOK3S_32_HANDLER and KVM_BOOK3S_PR_POSSIBLE * KVM_BOOK3S_64 got KVM_MMIO via KVM_BOOK3S_PR_POSSIBLE if !KVM_BOOK3S_HV_POSSIBLE * KVM_BOOK3S_64 + KVM_BOOK3S_64_PR got KVM_MMIO via KVM_BOOK3S_PR_POSSIBLE * likewise for KVM_BOOK3S_64 + KVM_BOOK3S_64_PR + KVM_BOOK3S_64_HV * KVM_E500V2 and KVM_E500MC directly selected KVM_MMIO but KVM_BOOK3S_64 + KVM_BOOK3S_64_HV didn't and therefore needs __KVM_NO_MMIO. coalesced_mmio.c is now always compiled and linked. However, for architectures/configurations defining __KVM_NO_MMIO this effectively collapses to an empty object with no mmio code. No functional changes. Suggested-by: Marc Zyngier Signed-off-by: Steffen Eiden Link: https://patch.msgid.link/20260930173441.66762-4-seiden@linux.ibm.com [Simplify powerpc condition, add underscores. - Paolo] Signed-off-by: Paolo Bonzini --- arch/arm64/kvm/Kconfig | 1 - arch/loongarch/kvm/Kconfig | 1 - arch/mips/kvm/Kconfig | 1 - arch/powerpc/include/asm/kvm_host.h | 4 ++++ arch/powerpc/kvm/Kconfig | 4 ---- arch/riscv/kvm/Kconfig | 1 - arch/s390/include/asm/kvm_host_s390.h | 2 ++ arch/x86/kvm/Kconfig | 1 - include/linux/kvm_host.h | 2 +- virt/kvm/Kconfig | 3 --- virt/kvm/Makefile.kvm | 4 ++-- virt/kvm/coalesced_mmio.c | 4 ++++ virt/kvm/coalesced_mmio.h | 2 +- virt/kvm/kvm_main.c | 8 ++++---- 14 files changed, 18 insertions(+), 20 deletions(-) diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 7329124deb2f..8475f32ad9e6 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -22,7 +22,6 @@ menuconfig KVM select KVM_COMMON select KVM_GENERIC_HARDWARE_ENABLING select HAVE_KVM_CPU_RELAX_INTERCEPT - select KVM_MMIO select KVM_GENERIC_DIRTYLOG_READ_PROTECT select VIRT_XFER_TO_GUEST_WORK select KVM_VFIO diff --git a/arch/loongarch/kvm/Kconfig b/arch/loongarch/kvm/Kconfig index a427429a2b05..fd387326d2f2 100644 --- a/arch/loongarch/kvm/Kconfig +++ b/arch/loongarch/kvm/Kconfig @@ -26,7 +26,6 @@ config KVM select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_GENERIC_HARDWARE_ENABLING - select KVM_MMIO select VIRT_XFER_TO_GUEST_WORK select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS diff --git a/arch/mips/kvm/Kconfig b/arch/mips/kvm/Kconfig index c24b872afbcb..849ce7c7c4df 100644 --- a/arch/mips/kvm/Kconfig +++ b/arch/mips/kvm/Kconfig @@ -22,7 +22,6 @@ config KVM select EXPORT_UASM select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT - select KVM_MMIO select KVM_GENERIC_HARDWARE_ENABLING help Support for hosting Guest kernels. diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index d8ef70c14aad..708a32f89776 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -29,6 +29,10 @@ #define __KVM_HAVE_ARCH_VCPU_DEBUGFS +#if defined(CONFIG_KVM_BOOK3S_HV_POSSIBLE) && !defined(CONFIG_KVM_BOOK3S_PR_POSSIBLE) +#define __KVM_NO_MMIO +#endif + #define KVM_MAX_VCPUS NR_CPUS #define KVM_MAX_VCORES NR_CPUS diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index 1fae2de8fa68..cacc22e34afd 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig @@ -30,7 +30,6 @@ config KVM_BOOK3S_HANDLER config KVM_BOOK3S_32_HANDLER bool select KVM_BOOK3S_HANDLER - select KVM_MMIO config KVM_BOOK3S_64_HANDLER bool @@ -38,7 +37,6 @@ config KVM_BOOK3S_64_HANDLER config KVM_BOOK3S_PR_POSSIBLE bool - select KVM_MMIO config KVM_BOOK3S_HV_POSSIBLE bool @@ -201,7 +199,6 @@ config KVM_E500V2 depends on PPC_E500 && !PPC_E500MC depends on !CONTEXT_TRACKING_USER select KVM - select KVM_MMIO help Support running unmodified E500 guest kernels in virtual machines on E500v2 host processors. @@ -216,7 +213,6 @@ config KVM_E500MC depends on PPC_E500MC depends on !CONTEXT_TRACKING_USER select KVM - select KVM_MMIO select KVM_BOOKE_HV help Support running unmodified E500MC/E5500/E6500 guest kernels in diff --git a/arch/riscv/kvm/Kconfig b/arch/riscv/kvm/Kconfig index 3cb4f8037300..2e3c4e6c1cd7 100644 --- a/arch/riscv/kvm/Kconfig +++ b/arch/riscv/kvm/Kconfig @@ -26,7 +26,6 @@ config KVM select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_GENERIC_HARDWARE_ENABLING - select KVM_MMIO select VIRT_XFER_TO_GUEST_WORK select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/kvm_host_s390.h index a00353ba0343..f7802600b3fb 100644 --- a/arch/s390/include/asm/kvm_host_s390.h +++ b/arch/s390/include/asm/kvm_host_s390.h @@ -39,6 +39,8 @@ #define KVM_S390_MANAGES_S390_GUEST 1 +#define __KVM_NO_MMIO + /* * These seem to be used for allocating ->chip in the routing table, which we * don't use. 1 is as small as we can get to reduce the needed memory. If we diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 294684b217bb..42e79c3c87ff 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -31,7 +31,6 @@ config KVM_X86 select VHOST_TASK select KVM_ASYNC_PF select USER_RETURN_NOTIFIER - select KVM_MMIO select SCHED_INFO select PERF_EVENTS select GUEST_PERF_EVENTS diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index e4ae201a1707..c8a29162b3f9 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -847,7 +847,7 @@ struct kvm { struct kvm_vm_stat stat; struct kvm_arch arch; refcount_t users_count; -#ifdef CONFIG_KVM_MMIO +#ifndef __KVM_NO_MMIO struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; spinlock_t ring_lock; struct list_head coalesced_zones; diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index f3d7f66746c8..24d7dfceb828 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -40,9 +40,6 @@ config NEED_KVM_DIRTY_RING_WITH_BITMAP bool depends on HAVE_KVM_DIRTY_RING -config KVM_MMIO - bool - config KVM_ASYNC_PF bool diff --git a/virt/kvm/Makefile.kvm b/virt/kvm/Makefile.kvm index b39f7b2a5f6e..ec7da5942354 100644 --- a/virt/kvm/Makefile.kvm +++ b/virt/kvm/Makefile.kvm @@ -10,9 +10,9 @@ KVM_DEV_MINOR ?= KVM_MINOR ccflags-y +=-DKVM_DEV_NAME=$(KVM_DEV_NAME) -DKVM_DEV_MINOR=$(KVM_DEV_MINOR) -kvm-y := $(KVM)/kvm_main.o $(KVM)/eventfd.o $(KVM)/binary_stats.o +kvm-y := $(KVM)/kvm_main.o $(KVM)/eventfd.o $(KVM)/binary_stats.o \ + $(KVM)/coalesced_mmio.o kvm-$(CONFIG_KVM_VFIO) += $(KVM)/vfio.o -kvm-$(CONFIG_KVM_MMIO) += $(KVM)/coalesced_mmio.o kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o kvm-$(CONFIG_HAVE_KVM_IRQ_ROUTING) += $(KVM)/irqchip.o kvm-$(CONFIG_HAVE_KVM_DIRTY_RING) += $(KVM)/dirty_ring.o diff --git a/virt/kvm/coalesced_mmio.c b/virt/kvm/coalesced_mmio.c index 6b1d90161099..3b5430036cae 100644 --- a/virt/kvm/coalesced_mmio.c +++ b/virt/kvm/coalesced_mmio.c @@ -15,6 +15,8 @@ #include #include +#ifndef __KVM_NO_MMIO + #include "coalesced_mmio.h" static inline struct kvm_coalesced_mmio_dev *to_mmio(struct kvm_io_device *dev) @@ -188,3 +190,5 @@ int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm, */ return 0; } + +#endif /* !__KVM_NO_MMIO */ diff --git a/virt/kvm/coalesced_mmio.h b/virt/kvm/coalesced_mmio.h index 36f84264ed25..77b811dee27c 100644 --- a/virt/kvm/coalesced_mmio.h +++ b/virt/kvm/coalesced_mmio.h @@ -11,7 +11,7 @@ * */ -#ifdef CONFIG_KVM_MMIO +#ifndef __KVM_NO_MMIO #include diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index fe6dc0bf3bde..ba546c1a92f5 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4073,7 +4073,7 @@ static vm_fault_t kvm_vcpu_fault(struct vm_fault *vmf) else if (vmf->pgoff == KVM_PIO_PAGE_OFFSET) page = virt_to_page(vcpu->arch.pio_data); #endif -#ifdef CONFIG_KVM_MMIO +#ifndef __KVM_NO_MMIO else if (vmf->pgoff == KVM_COALESCED_MMIO_PAGE_OFFSET) page = virt_to_page(vcpu->kvm->coalesced_mmio_ring); #endif @@ -4914,7 +4914,7 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) case KVM_CAP_ENABLE_CAP_VM: case KVM_CAP_HALT_POLL: return 1; -#ifdef CONFIG_KVM_MMIO +#ifndef __KVM_NO_MMIO case KVM_CAP_COALESCED_MMIO: return KVM_COALESCED_MMIO_PAGE_OFFSET; case KVM_CAP_COALESCED_PIO: @@ -5255,7 +5255,7 @@ static long kvm_vm_ioctl(struct file *filp, break; } #endif -#ifdef CONFIG_KVM_MMIO +#ifndef __KVM_NO_MMIO case KVM_REGISTER_COALESCED_MMIO: { struct kvm_coalesced_mmio_zone zone; @@ -5584,7 +5584,7 @@ static long kvm_dev_ioctl(struct file *filp, #ifdef CONFIG_X86 r += PAGE_SIZE; /* pio data page */ #endif -#ifdef CONFIG_KVM_MMIO +#ifndef __KVM_NO_MMIO r += PAGE_SIZE; /* coalesced mmio ring page */ #endif break;