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

Kip Macy kmacy at FreeBSD.org
Wed Apr 21 04:35:24 UTC 2010


Author: kmacy
Date: Wed Apr 21 04:35:23 2010
New Revision: 206977
URL: http://svn.freebsd.org/changeset/base/206977

Log:
  simplify gen_count tracking

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	Wed Apr 21 03:37:28 2010	(r206976)
+++ user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c	Wed Apr 21 04:35:23 2010	(r206977)
@@ -553,7 +553,7 @@ static int
 pa_tryrelock(pmap_t pmap, vm_paddr_t pa, vm_paddr_t *locked)
 {
 	vm_paddr_t lockpa;
-	uint16_t gen_count;
+	uint32_t gen_count;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	gen_count = pmap->pm_gen_count;
@@ -568,16 +568,13 @@ pa_tryrelock(pmap_t pmap, vm_paddr_t pa,
 	}
 	if (PA_TRYLOCK(pa))
 		return (0);
-	pmap->pm_retry_depth++;
 	PMAP_UNLOCK(pmap);
 	atomic_add_int((volatile int *)&pmap_tryrelock_restart, 1);
 	PA_LOCK(pa);
-	mtx_lock(&(pmap)->pm_mtx);
-	pmap->pm_retry_depth--;
-	if (pmap->pm_retry_depth)
-		pmap->pm_gen_count++;
+	PMAP_LOCK(pmap);
 
-	if (gen_count != pmap->pm_gen_count) {
+	if (pmap->pm_gen_count != gen_count + 1) {
+		pmap->pm_retries++;
 		atomic_add_int((volatile int *)&pmap_tryrelock_race, 1);
 		return (EAGAIN);
 	}
@@ -2021,8 +2018,8 @@ pmap_release(pmap_t pmap)
 	vm_page_t m;
 
 	KASSERT(pmap->pm_stats.resident_count == 0,
-	    ("pmap_release: pmap resident count %ld != 0 gen_count == %d ",
-		pmap->pm_stats.resident_count, pmap->pm_gen_count));
+	    ("pmap_release: pmap resident count %ld != 0 retries == %d ",
+		pmap->pm_stats.resident_count, pmap->pm_retries));
 	KASSERT(pmap->pm_root == NULL,
 	    ("pmap_release: pmap has reserved page table page(s)"));
 

Modified: user/kmacy/head_page_lock_2/sys/amd64/include/pmap.h
==============================================================================
--- user/kmacy/head_page_lock_2/sys/amd64/include/pmap.h	Wed Apr 21 03:37:28 2010	(r206976)
+++ user/kmacy/head_page_lock_2/sys/amd64/include/pmap.h	Wed Apr 21 04:35:23 2010	(r206977)
@@ -246,8 +246,8 @@ 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 */
-	uint16_t		pm_gen_count;	/* generation count (pmap lock dropped) */
-	uint16_t		pm_retry_depth;	/* number of cases in retry */
+	uint32_t		pm_gen_count;	/* generation count (pmap lock dropped) */
+	u_int			pm_retries;
 	struct pmap_statistics	pm_stats;	/* pmap statistics */
 	vm_page_t		pm_root;	/* spare page table pages */
 	vm_page_t		pm_free;	/* Temporary free pages. */
@@ -261,8 +261,7 @@ extern struct pmap	kernel_pmap_store;
 
 #define PMAP_UPDATE_GEN_COUNT(pmap)				\
 	do {							\
-		if (pmap->pm_retry_depth)			\
-			pmap->pm_gen_count++;			\
+		pmap->pm_gen_count++;				\
 	} while (0)
 
 #define	PMAP_LOCK(pmap)						\


More information about the svn-src-user mailing list