svn commit: r207373 - in head/sys: ia64/ia64 sparc64/sparc64
sun4v/sun4v
Alan Cox
alc at FreeBSD.org
Thu Apr 29 15:47:31 UTC 2010
Author: alc
Date: Thu Apr 29 15:47:31 2010
New Revision: 207373
URL: http://svn.freebsd.org/changeset/base/207373
Log:
MFamd64/i386 r207205
Clearing a page table entry's accessed bit and setting the page's
PG_REFERENCED flag in pmap_protect() can't really be justified, so
don't do it. Moreover, on ia64, don't set the page's dirty field
unless pmap_protect() is removing write access.
Modified:
head/sys/ia64/ia64/pmap.c
head/sys/sparc64/sparc64/pmap.c
head/sys/sun4v/sun4v/pmap.c
Modified: head/sys/ia64/ia64/pmap.c
==============================================================================
--- head/sys/ia64/ia64/pmap.c Thu Apr 29 15:42:24 2010 (r207372)
+++ head/sys/ia64/ia64/pmap.c Thu Apr 29 15:47:31 2010 (r207373)
@@ -1450,19 +1450,13 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
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)
Modified: head/sys/sparc64/sparc64/pmap.c
==============================================================================
--- head/sys/sparc64/sparc64/pmap.c Thu Apr 29 15:42:24 2010 (r207372)
+++ head/sys/sparc64/sparc64/pmap.c Thu Apr 29 15:47:31 2010 (r207373)
@@ -1273,13 +1273,10 @@ pmap_protect_tte(struct pmap *pm, struct
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);
}
Modified: head/sys/sun4v/sun4v/pmap.c
==============================================================================
--- head/sys/sun4v/sun4v/pmap.c Thu Apr 29 15:42:24 2010 (r207372)
+++ head/sys/sun4v/sun4v/pmap.c Thu Apr 29 15:47:31 2010 (r207373)
@@ -1824,17 +1824,10 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
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);
}
}
More information about the svn-src-all
mailing list