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