svn commit: r206860 - user/kmacy/head_page_lock_2/sys/amd64/amd64

Kip Macy kmacy at FreeBSD.org
Mon Apr 19 20:08:19 UTC 2010


Author: kmacy
Date: Mon Apr 19 20:08:18 2010
New Revision: 206860
URL: http://svn.freebsd.org/changeset/base/206860

Log:
  ensure that the page lock is held in pmap_remove_pde when setting/clearing flags

Modified:
  user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c

Modified: user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c	Mon Apr 19 20:07:35 2010	(r206859)
+++ user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c	Mon Apr 19 20:08:18 2010	(r206860)
@@ -2762,17 +2762,21 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 		eva = sva + NBPDR;
 		for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
 		    va < eva; va += PAGE_SIZE, m++) {
-			/*
-			 * XXX do we need to individually lock each page? 
-			 *
-			 */
-			if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
-				vm_page_dirty(m);
-			if (oldpde & PG_A)
-				vm_page_flag_set(m, PG_REFERENCED);
-			if (TAILQ_EMPTY(&m->md.pv_list) &&
-			    TAILQ_EMPTY(&pvh->pv_list))
-				vm_page_flag_clear(m, PG_WRITEABLE);
+
+			if ((oldpde & (PG_M | PG_RW | PG_A)) ||
+			    (TAILQ_EMPTY(&m->md.pv_list) &&
+				TAILQ_EMPTY(&pvh->pv_list))) {
+				vm_page_lock(m);
+			
+				if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
+					vm_page_dirty(m);
+				if (oldpde & PG_A)
+					vm_page_flag_set(m, PG_REFERENCED);
+				if (TAILQ_EMPTY(&m->md.pv_list) &&
+				    TAILQ_EMPTY(&pvh->pv_list))
+					vm_page_flag_clear(m, PG_WRITEABLE);
+				vm_page_unlock(m);
+			}
 		}
 	}
 	if (pmap == kernel_pmap) {


More information about the svn-src-user mailing list