svn commit: r206936 - in user/kmacy/head_page_lock_2/sys/amd64: amd64 include

Kip Macy kmacy at FreeBSD.org
Tue Apr 20 21:51:28 UTC 2010


Author: kmacy
Date: Tue Apr 20 21:51:28 2010
New Revision: 206936
URL: http://svn.freebsd.org/changeset/base/206936

Log:
  - comment "XXX" on  functions that may drop the pmap lock opening us up to race conditions
  - add generation counter to pmap to allow caller to know that the pmap lock was dropped

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

Modified: user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c	Tue Apr 20 21:48:48 2010	(r206935)
+++ user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c	Tue Apr 20 21:51:28 2010	(r206936)
@@ -566,6 +566,7 @@ pa_tryrelock(pmap_t pmap, vm_paddr_t pa,
 	atomic_add_int((volatile int *)&pmap_tryrelock_restart, 1);
 	PA_LOCK(pa);
 	PMAP_LOCK(pmap);
+	pmap->pm_gen_count++;
 
 	return (EAGAIN);
 }
@@ -2707,23 +2708,17 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 		pvh = pa_to_pvh(oldpde & PG_PS_FRAME);
 		pmap_pvh_free(pvh, pmap, sva);
 		eva = sva + NBPDR;
+		panic("XXX - not properly locked");
 		for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
 		    va < eva; va += PAGE_SIZE, m++) {
 
-			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 ((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 (pmap == kernel_pmap) {
@@ -2991,6 +2986,11 @@ restart:
 				continue;
 			} else
 				ptpaddr = *pde;
+
+			/*
+			 * XXX do we need to check if pmap_demote_pde dropped the lock?
+			 *
+			 */
 		}
 
 		/*
@@ -3017,6 +3017,10 @@ 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;
 		}
@@ -3091,7 +3095,13 @@ 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);
 		TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
@@ -4004,6 +4014,9 @@ retry:
 	}
 	if ((*pde & PG_PS) != 0) {
 		if (!wired != ((*pde & PG_W) == 0)) {
+			/*
+			 * XXX do we need to check if the pmap lock was dropped
+			 */
 			if (!pmap_demote_pde(pmap, pde, va, &pv_list))
 				panic("pmap_change_wiring: demotion failed");
 		} else
@@ -4460,6 +4473,10 @@ restart:
 							vm_page_flag_clear(m, PG_WRITEABLE);
 					}
 				}
+				/*
+				 *
+				 * XXX check if the pmap lock has been dropped
+				 */
 				pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free);
 			}
 		}
@@ -5104,6 +5121,10 @@ pmap_change_attr_locked(vm_offset_t va, 
 				tmpva += NBPDR;
 				continue;
 			}
+			/*
+			 * XXX do we need to check if the lock was dropped
+			 *
+			 */
 			if (!pmap_demote_pde(kernel_pmap, pde, tmpva, &pv_list))
 				return (ENOMEM);
 		}

Modified: user/kmacy/head_page_lock_2/sys/amd64/include/pmap.h
==============================================================================
--- user/kmacy/head_page_lock_2/sys/amd64/include/pmap.h	Tue Apr 20 21:48:48 2010	(r206935)
+++ user/kmacy/head_page_lock_2/sys/amd64/include/pmap.h	Tue Apr 20 21:51:28 2010	(r206936)
@@ -246,6 +246,7 @@ struct pmap {
 	pml4_entry_t		*pm_pml4;	/* KVA of level 4 page table */
 	TAILQ_HEAD(,pv_chunk)	pm_pvchunk;	/* list of mappings in pmap */
 	u_int			pm_active;	/* active on cpus */
+	u_int			pm_gen_count;	/* generation count (pmap lock dropped) */
 	/* spare u_int here due to padding */
 	struct pmap_statistics	pm_stats;	/* pmap statistics */
 	vm_page_t		pm_root;	/* spare page table pages */


More information about the svn-src-user mailing list