[PATCH v2 08/20] KVM: s390: vsie: Create helpers to alloc and free vsie_pages
Christoph Schlameuss <[email protected]>
| Newsgroups | org.kernel.vger.linux-s390,org.kernel.vger.kvm |
|---|---|
| Message-ID | <[email protected]> |
Encapsulate allocation of struct vsie_page and free into its own methods to allow this from multiple code paths. Signed-off-by: Christoph Schlameuss <[email protected]> --- arch/s390/kvm/vsie.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c index 86e1c605f4ce..20e5fcbe382c 100644 --- a/arch/s390/kvm/vsie.c +++ b/arch/s390/kvm/vsie.c @@ -1502,6 +1502,24 @@ static void put_vsie_page(struct vsie_page *vsie_page) clear_bit(VSIE_PAGE_IN_USE, &vsie_page->flags); } +static void free_vsie_page(struct vsie_page *vsie_page) +{ + free_page((unsigned long)vsie_page); +} + +static struct vsie_page *alloc_vsie_page(struct kvm *kvm) +{ + struct vsie_page *vsie_page; + + vsie_page = (struct vsie_page *)__get_free_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO | GFP_DMA); + if (!vsie_page) + return vsie_page; + + /* Mark it as invalid until it resides in the tree. */ + vsie_page->scb_gpa = ULONG_MAX; + return vsie_page; +} + /* * Get or create a vsie page for a scb address. * @@ -1537,7 +1555,7 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr) mutex_lock(&kvm->arch.vsie.mutex); if (kvm->arch.vsie.page_count < nr_vcpus) { - vsie_page = (void *)__get_free_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO | GFP_DMA); + vsie_page = alloc_vsie_page(kvm); if (!vsie_page) { mutex_unlock(&kvm->arch.vsie.mutex); return ERR_PTR(-ENOMEM); @@ -1557,9 +1575,9 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr) if (vsie_page->scb_gpa != ULONG_MAX) radix_tree_delete(&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; } - /* 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, @@ -1662,7 +1680,7 @@ void kvm_s390_vsie_destroy(struct kvm *kvm) if (vsie_page->scb_gpa != ULONG_MAX) radix_tree_delete(&kvm->arch.vsie.addr_to_page, vsie_page->scb_gpa >> SCB_ALIGNMENT_SHIFT); - free_page((unsigned long)vsie_page); + free_vsie_page(vsie_page); } kvm->arch.vsie.page_count = 0; mutex_unlock(&kvm->arch.vsie.mutex); -- 2.55.0