diff options
author | kib <kib@FreeBSD.org> | 2017-02-26 10:53:02 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2017-02-26 10:53:02 +0000 |
commit | 9819b36e61acfd5bb1d5649008d08e8a4426eb55 (patch) | |
tree | a000319ded9542ca2bb5e82789f2d20e2d13f53a | |
parent | 1a38ee169aa4c23a64b45b79b51a953808108166 (diff) | |
download | FreeBSD-src-9819b36e61acfd5bb1d5649008d08e8a4426eb55.zip FreeBSD-src-9819b36e61acfd5bb1d5649008d08e8a4426eb55.tar.gz |
MFC r313933, r313939, r313966:
Microoptimize pmap_protect_pde() on amd64, i386 and
pmap_protect_pte1() on armv6.
-rw-r--r-- | sys/amd64/amd64/pmap.c | 6 | ||||
-rw-r--r-- | sys/arm/arm/pmap-v6.c | 5 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 6 |
3 files changed, 8 insertions, 9 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 2d88398..2e2b1e1 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -4015,12 +4015,12 @@ pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot) anychanged = FALSE; retry: oldpde = newpde = *pde; - if (oldpde & PG_MANAGED) { + if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) == + (PG_MANAGED | PG_M | PG_RW)) { eva = sva + NBPDR; for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME); va < eva; va += PAGE_SIZE, m++) - if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) - vm_page_dirty(m); + vm_page_dirty(m); } if ((prot & VM_PROT_WRITE) == 0) newpde &= ~(PG_RW | PG_M); diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c index 3a13e8a..2894c35 100644 --- a/sys/arm/arm/pmap-v6.c +++ b/sys/arm/arm/pmap-v6.c @@ -4806,12 +4806,11 @@ pmap_protect_pte1(pmap_t pmap, pt1_entry_t *pte1p, vm_offset_t sva, ("%s: sva is not 1mpage aligned", __func__)); opte1 = npte1 = pte1_load(pte1p); - if (pte1_is_managed(opte1)) { + if (pte1_is_managed(opte1) && pte1_is_dirty(opte1)) { eva = sva + PTE1_SIZE; for (va = sva, m = PHYS_TO_VM_PAGE(pte1_pa(opte1)); va < eva; va += PAGE_SIZE, m++) - if (pte1_is_dirty(opte1)) - vm_page_dirty(m); + vm_page_dirty(m); } if ((prot & VM_PROT_WRITE) == 0) npte1 |= PTE1_RO | PTE1_NM; diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index ed87fc4..db71c4d 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -3146,12 +3146,12 @@ pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot) anychanged = FALSE; retry: oldpde = newpde = *pde; - if (oldpde & PG_MANAGED) { + if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) == + (PG_MANAGED | PG_M | PG_RW)) { eva = sva + NBPDR; for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME); va < eva; va += PAGE_SIZE, m++) - if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) - vm_page_dirty(m); + vm_page_dirty(m); } if ((prot & VM_PROT_WRITE) == 0) newpde &= ~(PG_RW | PG_M); |