summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/ia64/ia64/pmap.c16
-rw-r--r--sys/sparc64/sparc64/pmap.c9
-rw-r--r--sys/sun4v/sun4v/pmap.c15
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);
}
}
OpenPOWER on IntegriCloud