[PATCH v4 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 c935a375f57c..805d28f0e705 100644 --- a/arch/s390/kvm/vsie.c +++ b/arch/s390/kvm/vsie.c @@ -1503,6 +1503,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. * @@ -1538,7 +1556,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); @@ -1558,9 +1576,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 >> 9); + /* 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 >> 9, vsie_page)) { @@ -1663,7 +1681,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 >> 9); - 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