Hi, On Fri, Apr 12, 2024 at 9:44 AM Steven Price <steven.price@xxxxxxx> wrote: > > Select KVM_GENERIC_PRIVATE_MEM and provide the necessary support > functions. > > Signed-off-by: Steven Price <steven.price@xxxxxxx> > --- > arch/arm64/include/asm/kvm_host.h | 4 ++++ > arch/arm64/kvm/Kconfig | 1 + > arch/arm64/kvm/arm.c | 5 +++++ > arch/arm64/kvm/mmu.c | 19 +++++++++++++++++++ > 4 files changed, 29 insertions(+) > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h > index 902923402f6e..93de7f5009fe 100644 > --- a/arch/arm64/include/asm/kvm_host.h > +++ b/arch/arm64/include/asm/kvm_host.h > @@ -1259,6 +1259,10 @@ static inline bool kvm_vm_is_protected(struct kvm *kvm) > return false; > } > > +#ifdef CONFIG_KVM_PRIVATE_MEM > +bool kvm_arch_has_private_mem(struct kvm *kvm); > +#endif > + I think it might be better to define kvm_arch_has_private_mem() for both cases, whether KVM_PRIVATE_MEM is enabled or not, similar to the way it's defined in arch/x86/include/asm/kvm_host.h > 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 58f09370d17e..8da57e74c86a 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 I don't think this should be enabled by default, but should depend on whether RME is configured. That said, I can't find the config option for RME... > help > Support hosting virtualized guest machines. > > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > index 2dd014d3c366..a66d0a6eb4fa 100644 > --- a/arch/arm64/kvm/arm.c > +++ b/arch/arm64/kvm/arm.c > @@ -89,6 +89,11 @@ int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) > return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE; > } > > +bool kvm_arch_has_private_mem(struct kvm *kvm) > +{ > + return kvm_is_realm(kvm); > +} > + Related to my earlier comment on kvm_arch_has_private_mem(), and considering how often this function is called, wouldn't it be better to define this in a way similar to arch/x86/include/asm/kvm_host.h ? > int kvm_vm_ioctl_enable_cap(struct kvm *kvm, > struct kvm_enable_cap *cap) > { > diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c > index 48c957e21c83..808bceebad4d 100644 > --- a/arch/arm64/kvm/mmu.c > +++ b/arch/arm64/kvm/mmu.c > @@ -2171,6 +2171,25 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, > return ret; > } The following two functions should be gated by #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) > +{ > + WARN_ON_ONCE(!kvm_arch_has_private_mem(kvm)); I think this should return here, not just warn. Cheers, /fuad > + > + if (range->arg.attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE) > + range->only_shared = true; > + kvm_unmap_gfn_range(kvm, range); > + > + return false; > +} > + > void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot) > { > } > -- > 2.34.1 >