From 833856a52126d07eeee6cfca7da12b06953be833 Mon Sep 17 00:00:00 2001 From: alc Date: Thu, 2 Dec 2004 04:06:40 +0000 Subject: For efficiency eliminate the call to pmap_pte() from pmap_protect()'s and pmap_remove()'s inner loop. Instead, call pmap_pde_to_pte(), a new function, prior to the inner loop. Reviewed by: peter@, tegge@ --- sys/amd64/amd64/pmap.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index dfa8806..75596b5 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -318,18 +318,26 @@ pmap_pde(pmap_t pmap, vm_offset_t va) /* Return a pointer to the PT slot that corresponds to a VA */ static __inline pt_entry_t * +pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va) +{ + pt_entry_t *pte; + + pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME); + return (&pte[pmap_pte_index(va)]); +} + +/* Return a pointer to the PT slot that corresponds to a VA */ +static __inline pt_entry_t * pmap_pte(pmap_t pmap, vm_offset_t va) { pd_entry_t *pde; - pt_entry_t *pte; pde = pmap_pde(pmap, va); if (pde == NULL || (*pde & PG_V) == 0) return NULL; if ((*pde & PG_PS) != 0) /* compat with i386 pmap_pte() */ return ((pt_entry_t *)pde); - pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME); - return (&pte[pmap_pte_index(va)]); + return (pmap_pde_to_pte(pde, va)); } @@ -337,7 +345,6 @@ static __inline pt_entry_t * pmap_pte_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *ptepde) { pd_entry_t *pde; - pt_entry_t *pte; pde = pmap_pde(pmap, va); if (pde == NULL || (*pde & PG_V) == 0) @@ -345,8 +352,7 @@ pmap_pte_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *ptepde) *ptepde = *pde; if ((*pde & PG_PS) != 0) /* compat with i386 pmap_pte() */ return ((pt_entry_t *)pde); - pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME); - return (&pte[pmap_pte_index(va)]); + return (pmap_pde_to_pte(pde, va)); } @@ -1630,9 +1636,9 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) if (va_next > eva) va_next = eva; - for (; sva != va_next; sva += PAGE_SIZE) { - pte = pmap_pte(pmap, sva); - if (pte == NULL || *pte == 0) + for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++, + sva += PAGE_SIZE) { + if (*pte == 0) continue; anyvalid = 1; if (pmap_remove_pte(pmap, pte, sva, ptpaddr)) @@ -1722,6 +1728,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) pml4_entry_t *pml4e; pdp_entry_t *pdpe; pd_entry_t ptpaddr, *pde; + pt_entry_t *pte; int anychanged; if ((prot & VM_PROT_READ) == VM_PROT_NONE) { @@ -1777,14 +1784,11 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) if (va_next > eva) va_next = eva; - for (; sva != va_next; sva += PAGE_SIZE) { + for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++, + sva += PAGE_SIZE) { pt_entry_t obits, pbits; - pt_entry_t *pte; vm_page_t m; - pte = pmap_pte(pmap, sva); - if (pte == NULL) - continue; retry: obits = pbits = *pte; if (pbits & PG_MANAGED) { -- cgit v1.1