svn commit: r208125 - in user/kmacy/stable_7_page_lock/sys/amd64:
amd64 include
Kip Macy
kmacy at FreeBSD.org
Sat May 15 23:27:24 UTC 2010
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) \
More information about the svn-src-user
mailing list