On Wed, 2023-11-08 at 11:17 +0000, Nicolas Saenz Julienne wrote: > Decouple kvm_get_memory_attributes() from struct kvm's mem_attr_array to > allow other memory attribute sources to use the function. > > Signed-off-by: Nicolas Saenz Julienne <nsaenz@xxxxxxxxxx> > --- > arch/x86/kvm/mmu/mmu.c | 5 +++-- > include/linux/kvm_host.h | 8 +++++--- > 2 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index a1fbb905258b..96421234ca88 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -7301,7 +7301,7 @@ static bool hugepage_has_attrs(struct kvm *kvm, struct kvm_memory_slot *slot, > > for (gfn = start; gfn < end; gfn += KVM_PAGES_PER_HPAGE(level - 1)) { > if (hugepage_test_mixed(slot, gfn, level - 1) || > - attrs != kvm_get_memory_attributes(kvm, gfn)) > + attrs != kvm_get_memory_attributes(&kvm->mem_attr_array, gfn)) > return false; > } > return true; > @@ -7401,7 +7401,8 @@ void kvm_mmu_init_memslot_memory_attributes(struct kvm *kvm, > * be manually checked as the attributes may already be mixed. > */ > for (gfn = start; gfn < end; gfn += nr_pages) { > - unsigned long attrs = kvm_get_memory_attributes(kvm, gfn); > + unsigned long attrs = > + kvm_get_memory_attributes(&kvm->mem_attr_array, gfn); > > if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) > hugepage_clear_mixed(slot, gfn, level); > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 631fd532c97a..4242588e3dfb 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -2385,9 +2385,10 @@ static inline void kvm_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, > } > > #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES > -static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn_t gfn) > +static inline unsigned long > +kvm_get_memory_attributes(struct xarray *mem_attr_array, gfn_t gfn) > { > - return xa_to_value(xa_load(&kvm->mem_attr_array, gfn)); > + return xa_to_value(xa_load(mem_attr_array, gfn)); > } Can we wrap the 'struct xarray *' with a struct even if it will have a single member to make it clearer what type the 'kvm_get_memory_attributes' receives. Also maybe rename this to something like 'kvm_get_memory_attributes_for_gfn'? > > bool kvm_range_has_memory_attributes(struct kvm *kvm, gfn_t start, gfn_t end, > @@ -2400,7 +2401,8 @@ bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, > static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) > { > return IS_ENABLED(CONFIG_KVM_PRIVATE_MEM) && > - kvm_get_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE; > + kvm_get_memory_attributes(&kvm->mem_attr_array, gfn) & > + KVM_MEMORY_ATTRIBUTE_PRIVATE; > } > #else > static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) Also if we go with VM per VTL approach, we won't need this, each VM can already have its own memory attributes. Best regards, Maxim Levitsky