diff options
-rw-r--r-- | sys/ia64/ia64/pmap.c | 16 | ||||
-rw-r--r-- | sys/sparc64/sparc64/pmap.c | 9 | ||||
-rw-r--r-- | sys/sun4v/sun4v/pmap.c | 15 |
3 files changed, 12 insertions, 28 deletions
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index a7c47ef..91b2e07 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -1450,19 +1450,13 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) if (pmap_prot(pte) == prot) continue; - if (pmap_managed(pte)) { - vm_offset_t pa = pmap_ppn(pte); + if ((prot & VM_PROT_WRITE) == 0 && + pmap_managed(pte) && pmap_dirty(pte)) { + vm_paddr_t pa = pmap_ppn(pte); vm_page_t m = PHYS_TO_VM_PAGE(pa); - if (pmap_dirty(pte)) { - vm_page_dirty(m); - pmap_clear_dirty(pte); - } - - if (pmap_accessed(pte)) { - vm_page_flag_set(m, PG_REFERENCED); - pmap_clear_accessed(pte); - } + vm_page_dirty(m); + pmap_clear_dirty(pte); } if (prot & VM_PROT_EXECUTE) diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index d97900c..22ae860 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -1273,13 +1273,10 @@ pmap_protect_tte(struct pmap *pm, struct pmap *pm2, struct tte *tp, u_long data; vm_page_t m; - data = atomic_clear_long(&tp->tte_data, TD_REF | TD_SW | TD_W); - if ((data & TD_PV) != 0) { + data = atomic_clear_long(&tp->tte_data, TD_SW | TD_W); + if ((data & (TD_PV | TD_W)) == (TD_PV | TD_W)) { m = PHYS_TO_VM_PAGE(TD_PA(data)); - if ((data & TD_REF) != 0) - vm_page_flag_set(m, PG_REFERENCED); - if ((data & TD_W) != 0) - vm_page_dirty(m); + vm_page_dirty(m); } return (1); } diff --git a/sys/sun4v/sun4v/pmap.c b/sys/sun4v/sun4v/pmap.c index 2633b8e..cbd8106 100644 --- a/sys/sun4v/sun4v/pmap.c +++ b/sys/sun4v/sun4v/pmap.c @@ -1824,17 +1824,10 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) if (!anychanged && (otte_data & VTD_W)) anychanged = 1; - if (otte_data & VTD_MANAGED) { - m = NULL; - - if (otte_data & VTD_REF) { - m = PHYS_TO_VM_PAGE(TTE_GET_PA(otte_data)); - vm_page_flag_set(m, PG_REFERENCED); - } - if (otte_data & VTD_W) { - m = PHYS_TO_VM_PAGE(TTE_GET_PA(otte_data)); - vm_page_dirty(m); - } + if ((otte_data & (VTD_MANAGED | VTD_W)) == (VTD_MANAGED | + VTD_W)) { + m = PHYS_TO_VM_PAGE(TTE_GET_PA(otte_data)); + vm_page_dirty(m); } } |