From b4129106642b8ba219c3e79710f3106248f0c39a Mon Sep 17 00:00:00 2001 From: kib Date: Wed, 30 May 2018 20:47:20 +0000 Subject: [PATCH] Use pmap_pte_ufast() instead of pmap_pte() in pmap_extract(), pmap_is_prefaultable() and pmap_incore(), pushing the number of shootdown IPIs back to the 3/1 kernel. Benchmarked by: bde Tested by: pho Sponsored by: The FreeBSD Foundation --- sys/i386/i386/pmap.c | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 813fa82500c3..48a09859f45c 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -1628,7 +1628,7 @@ vm_paddr_t pmap_extract(pmap_t pmap, vm_offset_t va) { vm_paddr_t rtval; - pt_entry_t *pte; + pt_entry_t pte; pd_entry_t pde; rtval = 0; @@ -1638,9 +1638,8 @@ pmap_extract(pmap_t pmap, vm_offset_t va) if ((pde & PG_PS) != 0) rtval = (pde & PG_PS_FRAME) | (va & PDRMASK); else { - pte = pmap_pte(pmap, va); - rtval = (*pte & PG_FRAME) | (va & PAGE_MASK); - pmap_pte_release(pte); + pte = pmap_pte_ufast(pmap, va, pde); + rtval = (pte & PG_FRAME) | (va & PAGE_MASK); } } PMAP_UNLOCK(pmap); @@ -4787,19 +4786,14 @@ pmap_is_modified_pvh(struct md_page *pvh) boolean_t pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr) { - pd_entry_t *pde; - pt_entry_t *pte; + pd_entry_t pde; boolean_t rv; rv = FALSE; PMAP_LOCK(pmap); - pde = pmap_pde(pmap, addr); - if (*pde != 0 && (*pde & PG_PS) == 0) { - pte = pmap_pte(pmap, addr); - if (pte != NULL) - rv = *pte == 0; - pmap_pte_release(pte); - } + pde = *pmap_pde(pmap, addr); + if (pde != 0 && (pde & PG_PS) == 0) + rv = pmap_pte_ufast(pmap, addr, pde) == 0; PMAP_UNLOCK(pmap); return (rv); } @@ -5584,25 +5578,23 @@ pmap_change_attr(vm_offset_t va, vm_size_t size, int mode) int pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) { - pd_entry_t *pdep; - pt_entry_t *ptep, pte; + pd_entry_t pde; + pt_entry_t pte; vm_paddr_t pa; int val; PMAP_LOCK(pmap); retry: - pdep = pmap_pde(pmap, addr); - if (*pdep != 0) { - if (*pdep & PG_PS) { - pte = *pdep; + pde = *pmap_pde(pmap, addr); + if (pde != 0) { + if ((pde & PG_PS) != 0) { + pte = pde; /* Compute the physical address of the 4KB page. */ - pa = ((*pdep & PG_PS_FRAME) | (addr & PDRMASK)) & + pa = ((pde & PG_PS_FRAME) | (addr & PDRMASK)) & PG_FRAME; val = MINCORE_SUPER; } else { - ptep = pmap_pte(pmap, addr); - pte = *ptep; - pmap_pte_release(ptep); + pte = pmap_pte_ufast(pmap, addr, pde); pa = pte & PG_FRAME; val = 0; }