Skip to content

Commit d1e54dd

Browse files
Fuad Tabbabonzini
authored andcommitted
KVM: x86: Enable KVM_GUEST_MEMFD for all 64-bit builds
Enable KVM_GUEST_MEMFD for all KVM x86 64-bit builds, i.e. for "default" VM types when running on 64-bit KVM. This will allow using guest_memfd to back non-private memory for all VM shapes, by supporting mmap() on guest_memfd. Opportunistically clean up various conditionals that become tautologies once x86 selects KVM_GUEST_MEMFD more broadly. Specifically, because SW protected VMs, SEV, and TDX are all 64-bit only, private memory no longer needs to take explicit dependencies on KVM_GUEST_MEMFD, because it is effectively a prerequisite. Suggested-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Fuad Tabba <tabba@google.com> Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-ID: <20250729225455.670324-10-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent 68d1899 commit d1e54dd

4 files changed

Lines changed: 9 additions & 20 deletions

File tree

arch/x86/include/asm/kvm_host.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2276,10 +2276,8 @@ void kvm_configure_mmu(bool enable_tdp, int tdp_forced_root_level,
22762276
int tdp_max_root_level, int tdp_huge_page_level);
22772277

22782278

2279-
#ifdef CONFIG_KVM_GUEST_MEMFD
2279+
#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES
22802280
#define kvm_arch_has_private_mem(kvm) ((kvm)->arch.has_private_mem)
2281-
#else
2282-
#define kvm_arch_has_private_mem(kvm) false
22832281
#endif
22842282

22852283
#define kvm_arch_has_readonly_mem(kvm) (!(kvm)->arch.has_protected_state)

arch/x86/kvm/Kconfig

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ config KVM_X86
4747
select KVM_GENERIC_HARDWARE_ENABLING
4848
select KVM_GENERIC_PRE_FAULT_MEMORY
4949
select KVM_WERROR if WERROR
50+
select KVM_GUEST_MEMFD if X86_64
5051

5152
config KVM
5253
tristate "Kernel-based Virtual Machine (KVM) support"
@@ -79,16 +80,11 @@ config KVM_WERROR
7980

8081
If in doubt, say "N".
8182

82-
config KVM_X86_PRIVATE_MEM
83-
select KVM_GENERIC_MEMORY_ATTRIBUTES
84-
select KVM_GUEST_MEMFD
85-
bool
86-
8783
config KVM_SW_PROTECTED_VM
8884
bool "Enable support for KVM software-protected VMs"
8985
depends on EXPERT
9086
depends on KVM_X86 && X86_64
91-
select KVM_X86_PRIVATE_MEM
87+
select KVM_GENERIC_MEMORY_ATTRIBUTES
9288
help
9389
Enable support for KVM software-protected VMs. Currently, software-
9490
protected VMs are purely a development and testing vehicle for
@@ -138,7 +134,7 @@ config KVM_INTEL_TDX
138134
bool "Intel Trust Domain Extensions (TDX) support"
139135
default y
140136
depends on INTEL_TDX_HOST
141-
select KVM_X86_PRIVATE_MEM
137+
select KVM_GENERIC_MEMORY_ATTRIBUTES
142138
select HAVE_KVM_ARCH_GMEM_POPULATE
143139
help
144140
Provides support for launching Intel Trust Domain Extensions (TDX)
@@ -162,7 +158,7 @@ config KVM_AMD_SEV
162158
depends on KVM_AMD && X86_64
163159
depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=y && CRYPTO_DEV_CCP_DD=m)
164160
select ARCH_HAS_CC_PLATFORM
165-
select KVM_X86_PRIVATE_MEM
161+
select KVM_GENERIC_MEMORY_ATTRIBUTES
166162
select HAVE_KVM_ARCH_GMEM_PREPARE
167163
select HAVE_KVM_ARCH_GMEM_INVALIDATE
168164
select HAVE_KVM_ARCH_GMEM_POPULATE

include/linux/kvm_host.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -719,11 +719,7 @@ static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu)
719719
}
720720
#endif
721721

722-
/*
723-
* Arch code must define kvm_arch_has_private_mem if support for guest_memfd is
724-
* enabled.
725-
*/
726-
#if !defined(kvm_arch_has_private_mem) && !IS_ENABLED(CONFIG_KVM_GUEST_MEMFD)
722+
#ifndef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES
727723
static inline bool kvm_arch_has_private_mem(struct kvm *kvm)
728724
{
729725
return false;
@@ -2505,8 +2501,7 @@ bool kvm_arch_post_set_memory_attributes(struct kvm *kvm,
25052501

25062502
static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn)
25072503
{
2508-
return IS_ENABLED(CONFIG_KVM_GUEST_MEMFD) &&
2509-
kvm_get_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE;
2504+
return kvm_get_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE;
25102505
}
25112506
#else
25122507
static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn)

virt/kvm/kvm_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,7 +1588,7 @@ static int check_memory_region_flags(struct kvm *kvm,
15881588
{
15891589
u32 valid_flags = KVM_MEM_LOG_DIRTY_PAGES;
15901590

1591-
if (kvm_arch_has_private_mem(kvm))
1591+
if (IS_ENABLED(CONFIG_KVM_GUEST_MEMFD))
15921592
valid_flags |= KVM_MEM_GUEST_MEMFD;
15931593

15941594
/* Dirty logging private memory is not currently supported. */
@@ -4917,7 +4917,7 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
49174917
#endif
49184918
#ifdef CONFIG_KVM_GUEST_MEMFD
49194919
case KVM_CAP_GUEST_MEMFD:
4920-
return !kvm || kvm_arch_has_private_mem(kvm);
4920+
return 1;
49214921
#endif
49224922
default:
49234923
break;

0 commit comments

Comments
 (0)