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

Kip Macy kmacy at FreeBSD.org
Mon Apr 26 02:35:38 UTC 2010


Author: kmacy
Date: Mon Apr 26 02:35:37 2010
New Revision: 207218
URL: http://svn.freebsd.org/changeset/base/207218

Log:
  - white space harmonize
  - collapse expressions and remove temporary in pmap_change_wiring
  - remove invalid XXX pmap lock drop
  - handle two cases of pmap lock drop with gen_count check

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 26 01:54:45 2010	(r207217)
+++ user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c	Mon Apr 26 02:35:37 2010	(r207218)
@@ -2946,10 +2946,6 @@ restart:
 			 */
 			if ((*pte & PG_G) == 0)
 				anyvalid = 1;
-			/*
-			 * XXX check if the pmap lock was dropped - maybe we need 
-			 * to restart
-			 */
 			if (pmap_remove_pte(pmap, pte, sva, ptpaddr, &free))
 				break;
 		}
@@ -3024,11 +3020,6 @@ pmap_remove_all(vm_page_t m)
 		if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
 			vm_page_dirty(m);
 		free = NULL;
-
-		/*
-		 * XXX pmap_unuse_pt can drop the pmap lock
-		 *
-		 */
 		pmap_unuse_pt(pmap, pv->pv_va, *pde, &free);
 		pmap_invalidate_page(pmap, pv->pv_va);
 		pmap_free_zero_pages(free);
@@ -3106,6 +3097,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
 	TAILQ_INIT(&pv_list);
 	pa = 0;
 	anychanged = 0;
+
 	PMAP_LOCK(pmap);
 restart:	
 	for (; sva < eva; sva = va_next) {
@@ -3690,7 +3682,6 @@ void
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
 {
 
-	vm_page_lock_assert(m, MA_OWNED);
 	PMAP_LOCK(pmap);
 	(void) pmap_enter_quick_locked(pmap, va, m, prot, NULL);
 	PMAP_UNLOCK(pmap);
@@ -3913,9 +3904,9 @@ pmap_change_wiring(pmap_t pmap, vm_offse
 {
 	pd_entry_t *pde;
 	pt_entry_t *pte;
-	vm_paddr_t pa;
-	boolean_t slept;
 	struct pv_list_head pv_list;
+	uint32_t gen_count;
+	vm_paddr_t pa = 0;
 
 	TAILQ_INIT(&pv_list);
 
@@ -3923,27 +3914,23 @@ pmap_change_wiring(pmap_t pmap, vm_offse
 	 * Wiring is not a hardware characteristic so there is no need to
 	 * invalidate TLB.
 	 */
-	pa = 0;
 	PMAP_LOCK(pmap);
 retry:
-	slept = FALSE;
 	pde = pmap_pde(pmap, va);
 	if ((*pde & PG_PS) && (!wired != ((*pde & PG_W) == 0))) {
-		if (TAILQ_EMPTY(&pv_list))
-			slept = pmap_pv_list_alloc(pmap, NPTEPG-1, &pv_list);
-		if (slept)
+		if (TAILQ_EMPTY(&pv_list) &&
+		    pmap_pv_list_alloc(pmap, NPTEPG-1, &pv_list))
 			goto retry;
-		
 		if (pa_tryrelock(pmap, *pde & PG_FRAME, &pa))
 			goto retry;
 	}
 	if ((*pde & PG_PS) != 0) {
 		if (!wired != ((*pde & PG_W) == 0)) {
-			/*
-			 * XXX do we need to check if the pmap lock was dropped
-			 */
+			gen_count = pmap->pm_gen_count;
 			if (!pmap_demote_pde(pmap, pde, va, &pv_list))
 				panic("pmap_change_wiring: demotion failed");
+			if (gen_count != pmap->pm_gen_count)
+				goto retry;
 		} else
 			goto out;
 	}
@@ -4298,6 +4285,7 @@ pmap_remove_pages(pmap_t pmap)
 	int field, idx, iter;
 	int64_t bit;
 	uint64_t inuse, bitmask;
+	uint32_t gen_count;
 	int allfree;
 
 	if (pmap != vmspace_pmap(curthread->td_proc->p_vmspace)) {
@@ -4402,11 +4390,11 @@ restart:
 							vm_page_flag_clear(m, PG_WRITEABLE);
 					}
 				}
-				/*
-				 *
-				 * XXX check if the pmap lock has been dropped
-				 */
+				gen_count = pmap->pm_gen_count;
 				pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free);
+				if (pmap->pm_gen_count != gen_count &&
+				    pmap->pm_gen_count != gen_count + 1)
+					goto restart;
 			}
 		}
 		if (allfree) {


More information about the svn-src-user mailing list