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. > + > 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