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>