[PATCH v2 09/20] KVM: s390: vsie: Replace radix_tree with xarray addr_to_page
Christoph Schlameuss <[email protected]>
| Newsgroups | org.kernel.vger.linux-s390,org.kernel.vger.kvm |
|---|---|
| Message-ID | <[email protected]> |
The underlying implementation of radix_tree is xarray since v4.20. Changing to the xarray API directly relaxes some of the locking obligations and provides more symmetry with the next vsie changes in the series. Signed-off-by: Christoph Schlameuss <[email protected]> --- arch/s390/include/asm/kvm_host.h | 2 +- arch/s390/kvm/vsie.c | 40 ++++++++++++++++------------------------ 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 6617d1161c68..766bbb053421 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h @@ -629,7 +629,7 @@ struct vsie_page; struct kvm_s390_vsie { struct mutex mutex; - struct radix_tree_root addr_to_page; + struct xarray addr_to_page; int page_count; int next; struct vsie_page *pages[KVM_MAX_VCPUS]; diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c index 20e5fcbe382c..6bde6a3ee850 100644 --- a/arch/s390/kvm/vsie.c +++ b/arch/s390/kvm/vsie.c @@ -56,8 +56,7 @@ struct vsie_page { gpa_t sdnx_gpa; /* 0x0250 */ /* * guest address of the original SCB. Remains set for free vsie - * pages, so we can properly look them up in our addr_to_page - * radix tree. + * pages, so we can properly look them up in our addr_to_page map. */ gpa_t scb_gpa; /* 0x0258 */ /* the shadow gmap in use by the vsie_page */ @@ -1532,19 +1531,15 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr) struct vsie_page *vsie_page; int nr_vcpus; - rcu_read_lock(); - vsie_page = radix_tree_lookup(&kvm->arch.vsie.addr_to_page, addr >> SCB_ALIGNMENT_SHIFT); - rcu_read_unlock(); - if (vsie_page) { - if (try_get_vsie_page(vsie_page)) { - if (vsie_page->scb_gpa == addr) - return vsie_page; - /* - * We raced with someone reusing + putting this vsie - * page before we grabbed it. - */ - put_vsie_page(vsie_page); - } + vsie_page = xa_load(&kvm->arch.vsie.addr_to_page, addr >> SCB_ALIGNMENT_SHIFT); + if (vsie_page && try_get_vsie_page(vsie_page)) { + if (vsie_page->scb_gpa == addr) + return vsie_page; + /* + * We raced with someone reusing + putting this vsie + * page before we grabbed it. + */ + put_vsie_page(vsie_page); } /* @@ -1573,15 +1568,15 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr) kvm->arch.vsie.next %= nr_vcpus; } if (vsie_page->scb_gpa != ULONG_MAX) - radix_tree_delete(&kvm->arch.vsie.addr_to_page, - vsie_page->scb_gpa >> SCB_ALIGNMENT_SHIFT); + xa_erase(&kvm->arch.vsie.addr_to_page, + vsie_page->scb_gpa >> SCB_ALIGNMENT_SHIFT); /* Mark it as invalid until it resides in the tree. */ vsie_page->scb_gpa = ULONG_MAX; } /* Double use of the same address or allocation failure. */ - if (radix_tree_insert(&kvm->arch.vsie.addr_to_page, addr >> SCB_ALIGNMENT_SHIFT, - vsie_page)) { + if (xa_insert(&kvm->arch.vsie.addr_to_page, addr >> SCB_ALIGNMENT_SHIFT, vsie_page, + GFP_KERNEL_ACCOUNT)) { put_vsie_page(vsie_page); mutex_unlock(&kvm->arch.vsie.mutex); return NULL; @@ -1660,7 +1655,7 @@ int kvm_s390_handle_vsie(struct kvm_vcpu *vcpu) void kvm_s390_vsie_init(struct kvm *kvm) { mutex_init(&kvm->arch.vsie.mutex); - INIT_RADIX_TREE(&kvm->arch.vsie.addr_to_page, GFP_KERNEL_ACCOUNT); + xa_init_flags(&kvm->arch.vsie.addr_to_page, XA_FLAGS_ACCOUNT); } /* Destroy the vsie data structures. To be called when a vm is destroyed. */ @@ -1676,12 +1671,9 @@ void kvm_s390_vsie_destroy(struct kvm *kvm) if (vsie_page->gmap_cache.gmap) release_gmap_shadow(vsie_page); kvm->arch.vsie.pages[i] = NULL; - /* free the radix tree entry */ - if (vsie_page->scb_gpa != ULONG_MAX) - radix_tree_delete(&kvm->arch.vsie.addr_to_page, - vsie_page->scb_gpa >> SCB_ALIGNMENT_SHIFT); free_vsie_page(vsie_page); } + xa_destroy(&kvm->arch.vsie.addr_to_page); kvm->arch.vsie.page_count = 0; mutex_unlock(&kvm->arch.vsie.mutex); } -- 2.55.0