summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2004-12-02 04:06:40 +0000
committeralc <alc@FreeBSD.org>2004-12-02 04:06:40 +0000
commit833856a52126d07eeee6cfca7da12b06953be833 (patch)
tree947a280172ef92e7da87d8c4811f50f4d4ae613b /sys/amd64
parent38bcfbb659366dda03f60671c5f354cecd295cb4 (diff)
downloadFreeBSD-src-833856a52126d07eeee6cfca7da12b06953be833.zip
FreeBSD-src-833856a52126d07eeee6cfca7da12b06953be833.tar.gz
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@
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/pmap.c32
1 files 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) {
OpenPOWER on IntegriCloud