From 937e8f20af2c940c554a1d5887c14f4f6b3de2c9 Mon Sep 17 00:00:00 2001 From: Justin Hibbits Date: Thu, 8 Aug 2019 03:18:35 +0000 Subject: [PATCH] powerpc/pmap: Minor optimizations to 64-bit booke pmap Don't recalculate the VM page of the page table pages, just pass them down to free. Also, use the pmap's page zero function instead of bzero(). --- sys/powerpc/booke/pmap.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index b2e10a79686f..886d64313a36 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -264,7 +264,7 @@ static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0; #ifdef __powerpc64__ static pte_t *ptbl_alloc(mmu_t, pmap_t, pte_t **, unsigned int, boolean_t); -static void ptbl_free(mmu_t, pmap_t, pte_t **, unsigned int); +static void ptbl_free(mmu_t, pmap_t, pte_t **, unsigned int, vm_page_t); static void ptbl_hold(mmu_t, pmap_t, pte_t **, unsigned int); static int ptbl_unhold(mmu_t, pmap_t, vm_offset_t); #else @@ -615,19 +615,16 @@ pdir_alloc(mmu_t mmu, pmap_t pmap, unsigned int pp2d_idx, bool nosleep) /* Zero whole ptbl. */ pdir = (pte_t **)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)); - bzero(pdir, PAGE_SIZE); + mmu_booke_zero_page(mmu, m); return (pdir); } /* Free pdir pages and invalidate pdir entry. */ static void -pdir_free(mmu_t mmu, pmap_t pmap, unsigned int pp2d_idx) +pdir_free(mmu_t mmu, pmap_t pmap, unsigned int pp2d_idx, vm_page_t m) { pte_t **pdir; - vm_paddr_t pa; - vm_offset_t va; - vm_page_t m; pdir = pmap->pm_pp2d[pp2d_idx]; @@ -635,9 +632,6 @@ pdir_free(mmu_t mmu, pmap_t pmap, unsigned int pp2d_idx) pmap->pm_pp2d[pp2d_idx] = NULL; - va = (vm_offset_t) pdir; - pa = DMAP_TO_PHYS(va); - m = PHYS_TO_VM_PAGE(pa); vm_page_free_zero(m); } @@ -667,7 +661,7 @@ pdir_unhold(mmu_t mmu, pmap_t pmap, u_int pp2d_idx) * Free pdir page if there are no dir entries in this pdir. */ if (vm_page_unwire_noq(m)) { - pdir_free(mmu, pmap, pp2d_idx); + pdir_free(mmu, pmap, pp2d_idx, m); return (1); } return (0); @@ -717,19 +711,16 @@ ptbl_alloc(mmu_t mmu, pmap_t pmap, pte_t ** pdir, unsigned int pdir_idx, /* Zero whole ptbl. */ ptbl = (pte_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)); - bzero(ptbl, PAGE_SIZE); + mmu_booke_zero_page(mmu, m); return (ptbl); } /* Free ptbl pages and invalidate pdir entry. */ static void -ptbl_free(mmu_t mmu, pmap_t pmap, pte_t ** pdir, unsigned int pdir_idx) +ptbl_free(mmu_t mmu, pmap_t pmap, pte_t ** pdir, unsigned int pdir_idx, vm_page_t m) { pte_t *ptbl; - vm_paddr_t pa; - vm_offset_t va; - vm_page_t m; ptbl = pdir[pdir_idx]; @@ -737,9 +728,6 @@ ptbl_free(mmu_t mmu, pmap_t pmap, pte_t ** pdir, unsigned int pdir_idx) pdir[pdir_idx] = NULL; - va = (vm_offset_t) ptbl; - pa = DMAP_TO_PHYS(va); - m = PHYS_TO_VM_PAGE(pa); vm_page_free_zero(m); } @@ -776,7 +764,7 @@ ptbl_unhold(mmu_t mmu, pmap_t pmap, vm_offset_t va) * last page. */ if (vm_page_unwire_noq(m)) { - ptbl_free(mmu, pmap, pdir, pdir_idx); + ptbl_free(mmu, pmap, pdir, pdir_idx, m); pdir_unhold(mmu, pmap, pp2d_idx); return (1); }