Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 May 2010 23:27:24 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r208125 - in user/kmacy/stable_7_page_lock/sys/amd64: amd64 include
Message-ID:  <201005152327.o4FNROm2022334@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kmacy
Date: Sat May 15 23:27:23 2010
New Revision: 208125
URL: http://svn.freebsd.org/changeset/base/208125

Log:
  minimize trylock restarts by tracking generation counter

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

Modified: user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 23:15:24 2010	(r208124)
+++ user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 23:27:23 2010	(r208125)
@@ -3176,15 +3176,14 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	vm_paddr_t pa;
 	pd_entry_t *pde;
 	pt_entry_t *pte;
-	vm_paddr_t opa, lockedpa;
 	pt_entry_t origpte, newpte;
 	vm_page_t mpte, om;
 	boolean_t invlva, opalocked;
+	vm_paddr_t lockedpa, opa = 0;
 	pv_entry_t pv;
 	struct lock_stack ls;
 
 	va = trunc_page(va);
-
 	KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
 	KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS,
 	    ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", va));
@@ -3192,28 +3191,28 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	mpte = NULL;
 	pv = NULL;
 	lockedpa = pa = VM_PAGE_TO_PHYS(m);
-	opa = 0;
 	opalocked = FALSE;
 	ls_init(&ls);
 	ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 	ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+	PMAP_UPDATE_GEN_COUNT(pmap);
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
 		while ((pv = get_pv_entry(pmap)) == NULL) {
 			ls_popa(&ls);
 			VM_WAIT;
 			ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 			ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+			PMAP_UPDATE_GEN_COUNT(pmap);
 		}
 	}
-	
-restart:
+
 	/*
 	 * In the case that a page table page is not
 	 * resident, we are creating it here.
 	 */
-	if (va < VM_MAXUSER_ADDRESS && mpte == NULL)
+	if (va < VM_MAXUSER_ADDRESS)
 		mpte = pmap_allocpte(pmap, lockedpa, va, M_WAITOK);
-
+restart:
 	pde = pmap_pde(pmap, va);
 	if (pde != NULL && (*pde & PG_V) != 0) {
 		if ((*pde & PG_PS) != 0)
@@ -3228,6 +3227,7 @@ restart:
 		ls_popa(&ls);
 		ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 		ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+		PMAP_UPDATE_GEN_COUNT(pmap);
 		opalocked = FALSE;
 		opa = 0;
 		goto restart;
@@ -3247,6 +3247,7 @@ restart:
 				ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 			}
 			ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+			PMAP_UPDATE_GEN_COUNT(pmap);
 			goto restart;
 		}
 	}

Modified: user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h	Sat May 15 23:15:24 2010	(r208124)
+++ user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h	Sat May 15 23:27:23 2010	(r208125)
@@ -262,7 +262,14 @@ typedef struct pmap	*pmap_t;
 extern struct pmap	kernel_pmap_store;
 #define kernel_pmap	(&kernel_pmap_store)
 
-#define	PMAP_LOCK(pmap)		mtx_lock(&(pmap)->pm_mtx)
+#define PMAP_UPDATE_GEN_COUNT(pmap) (pmap)->pm_gen_count++
+
+#define	PMAP_LOCK(pmap)						\
+	do {							\
+		mtx_lock(&(pmap)->pm_mtx);			\
+		PMAP_UPDATE_GEN_COUNT((pmap));			\
+	} while (0)
+
 #define	PMAP_LOCKPTR(pmap)	(&(pmap)->pm_mtx)
 
 #define	PMAP_LOCK_ASSERT(pmap, type)					\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005152327.o4FNROm2022334>