On 12/06/2025 16:14, Joey Gouly wrote: > Hi Steven, > > On Wed, Jun 11, 2025 at 11:48:38AM +0100, Steven Price wrote: >> Select KVM_GENERIC_PRIVATE_MEM and provide the necessary support >> functions. >> >> Signed-off-by: Steven Price <steven.price@xxxxxxx> >> Reviewed-by: Gavin Shan <gshan@xxxxxxxxxx> >> --- >> Changes since v2: >> * Switch kvm_arch_has_private_mem() to a macro to avoid overhead of a >> function call. >> * Guard definitions of kvm_arch_{pre,post}_set_memory_attributes() with >> #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES. >> * Early out in kvm_arch_post_set_memory_attributes() if the WARN_ON >> should trigger. >> --- >> arch/arm64/include/asm/kvm_host.h | 6 ++++++ >> arch/arm64/kvm/Kconfig | 1 + >> arch/arm64/kvm/mmu.c | 24 ++++++++++++++++++++++++ >> 3 files changed, 31 insertions(+) >> >> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h >> index a1857802db64..9903b0e8ef3f 100644 >> --- a/arch/arm64/include/asm/kvm_host.h >> +++ b/arch/arm64/include/asm/kvm_host.h >> @@ -1514,6 +1514,12 @@ struct kvm *kvm_arch_alloc_vm(void); >> >> #define vcpu_is_protected(vcpu) kvm_vm_is_protected((vcpu)->kvm) >> >> +#ifdef CONFIG_KVM_PRIVATE_MEM >> +#define kvm_arch_has_private_mem(kvm) ((kvm)->arch.is_realm) >> +#else >> +#define kvm_arch_has_private_mem(kvm) false >> +#endif > > I don't understand the ifdef here (or below). In the Kconfig you 'select > KVM_GENERIC_PRIVATE_MEM', so it will always be on/defined? Unless I'm > misunderstanding something. I have to admit this is somewhat cargo-culted from x86. And I think they have more build configurations which don't include KVM_GENERIC_PRIVATE_MEM. It is possible to build without KVM_GENERIC_PRIVATE_MEM (by disabling CONFIG_KVM). But that's probably not very interesting here - the definition shouldn't actually matter in that case. So I think you're right - there's no need for the #ifdeffery here. Thanks, Steve >> + >> int kvm_arm_vcpu_finalize(struct kvm_vcpu *vcpu, int feature); >> bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu); >> >> diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig >> index 713248f240e0..3a04b040869d 100644 >> --- a/arch/arm64/kvm/Kconfig >> +++ b/arch/arm64/kvm/Kconfig >> @@ -37,6 +37,7 @@ menuconfig KVM >> select HAVE_KVM_VCPU_RUN_PID_CHANGE >> select SCHED_INFO >> select GUEST_PERF_EVENTS if PERF_EVENTS >> + select KVM_GENERIC_PRIVATE_MEM >> help >> Support hosting virtualized guest machines. >> >> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c >> index 580ed362833c..c866891fd8f9 100644 >> --- a/arch/arm64/kvm/mmu.c >> +++ b/arch/arm64/kvm/mmu.c >> @@ -2384,6 +2384,30 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, >> return ret; >> } >> >> +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES >> +bool kvm_arch_pre_set_memory_attributes(struct kvm *kvm, >> + struct kvm_gfn_range *range) >> +{ >> + WARN_ON_ONCE(!kvm_arch_has_private_mem(kvm)); >> + return false; >> +} >> + >> +bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, >> + struct kvm_gfn_range *range) >> +{ >> + if (WARN_ON_ONCE(!kvm_arch_has_private_mem(kvm))) >> + return false; >> + >> + if (range->arg.attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE) >> + range->attr_filter = KVM_FILTER_SHARED; >> + else >> + range->attr_filter = KVM_FILTER_PRIVATE; >> + kvm_unmap_gfn_range(kvm, range); >> + >> + return false; >> +} >> +#endif >> + >> void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot) >> { >> } >> -- >> 2.43.0 >> > > Thanks, > Joey