Module Name: src
Committed By: yamt
Date: Fri Nov 18 00:51:29 UTC 2011
Modified Files:
src/sys/arch/x86/include [yamt-pagecache]: pmap.h
src/sys/arch/x86/x86 [yamt-pagecache]: pmap.c
Log Message:
share a lock among pmap uobjs
To generate a diff of this commit:
cvs rdiff -u -r1.43.2.1 -r1.43.2.2 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.137.2.3 -r1.137.2.4 src/sys/arch/x86/x86/pmap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.43.2.1 src/sys/arch/x86/include/pmap.h:1.43.2.2
--- src/sys/arch/x86/include/pmap.h:1.43.2.1 Thu Nov 10 14:31:43 2011
+++ src/sys/arch/x86/include/pmap.h Fri Nov 18 00:51:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.43.2.1 2011/11/10 14:31:43 yamt Exp $ */
+/* $NetBSD: pmap.h,v 1.43.2.2 2011/11/18 00:51:28 yamt Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -130,9 +130,7 @@ extern kmutex_t pmaps_lock; /* protec
* note that the pm_obj contains the lock pointer, the reference count,
* page list, and number of PTPs within the pmap.
*
- * pm_lock is the same as the lock for vm object 0. Changes to
- * the other objects may only be made if that lock has been taken
- * (the other object locks are only used when uvm_pagealloc is called)
+ * pm_lock is shared among vm objects.
*
* XXX If we ever support processor numbers higher than 31, we'll have
* XXX to rethink the CPU mask.
@@ -140,8 +138,7 @@ extern kmutex_t pmaps_lock; /* protec
struct pmap {
struct uvm_object pm_obj[PTP_LEVELS-1]; /* objects for lvl >= 1) */
-#define pm_lock pm_obj[0].vmobjlock
- kmutex_t pm_obj_lock[PTP_LEVELS-1]; /* locks for pm_objs */
+ kmutex_t pm_lock[1]; /* lock for pm_objs */
LIST_ENTRY(pmap) pm_list; /* list (lck by pm_list lock) */
pd_entry_t *pm_pdir; /* VA of PD (lck by object lock) */
paddr_t pm_pdirpa[PDP_SIZE]; /* PA of PDs (read-only after create) */
Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.137.2.3 src/sys/arch/x86/x86/pmap.c:1.137.2.4
--- src/sys/arch/x86/x86/pmap.c:1.137.2.3 Thu Nov 10 14:32:36 2011
+++ src/sys/arch/x86/x86/pmap.c Fri Nov 18 00:51:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.137.2.3 2011/11/10 14:32:36 yamt Exp $ */
+/* $NetBSD: pmap.c,v 1.137.2.4 2011/11/18 00:51:28 yamt Exp $ */
/*-
* Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
@@ -171,7 +171,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.137.2.3 2011/11/10 14:32:36 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.137.2.4 2011/11/18 00:51:28 yamt Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
@@ -324,24 +324,6 @@ kmutex_t pmaps_lock;
static vaddr_t pmap_maxkvaddr;
/*
- * XXX kludge: dummy locking to make KASSERTs in uvm_page.c comfortable.
- * actual locking is done by pm_lock.
- */
-#if defined(DIAGNOSTIC)
-#define PMAP_SUBOBJ_LOCK(pm, idx) \
- KASSERT(mutex_owned((pm)->pm_lock)); \
- if ((idx) != 0) \
- mutex_enter((pm)->pm_obj[(idx)].vmobjlock)
-#define PMAP_SUBOBJ_UNLOCK(pm, idx) \
- KASSERT(mutex_owned((pm)->pm_lock)); \
- if ((idx) != 0) \
- mutex_exit((pm)->pm_obj[(idx)].vmobjlock)
-#else /* defined(DIAGNOSTIC) */
-#define PMAP_SUBOBJ_LOCK(pm, idx) /* nothing */
-#define PMAP_SUBOBJ_UNLOCK(pm, idx) /* nothing */
-#endif /* defined(DIAGNOSTIC) */
-
-/*
* Misc. event counters.
*/
struct evcnt pmap_iobmp_evcnt;
@@ -1224,10 +1206,10 @@ pmap_bootstrap(vaddr_t kva_start)
*/
kpm = pmap_kernel();
+ mutex_init(kpm->pm_lock, MUTEX_DEFAULT, IPL_NONE);
for (i = 0; i < PTP_LEVELS - 1; i++) {
- mutex_init(&kpm->pm_obj_lock[i], MUTEX_DEFAULT, IPL_NONE);
uvm_obj_init(&kpm->pm_obj[i], NULL, false, 1);
- uvm_obj_setlock(&kpm->pm_obj[i], &kpm->pm_obj_lock[i]);
+ uvm_obj_setlock(&kpm->pm_obj[i], kpm->pm_lock);
kpm->pm_ptphint[i] = NULL;
}
memset(&kpm->pm_list, 0, sizeof(kpm->pm_list)); /* pm_list not used */
@@ -1781,10 +1763,7 @@ pmap_find_ptp(struct pmap *pmap, vaddr_t
pa == VM_PAGE_TO_PHYS(pmap->pm_ptphint[lidx])) {
return (pmap->pm_ptphint[lidx]);
}
- PMAP_SUBOBJ_LOCK(pmap, lidx);
pg = uvm_pagelookup(&pmap->pm_obj[lidx], ptp_va2o(va, level));
- PMAP_SUBOBJ_UNLOCK(pmap, lidx);
-
KASSERT(pg == NULL || pg->wire_count >= 1);
return pg;
}
@@ -1944,7 +1923,6 @@ pmap_get_ptp(struct pmap *pmap, vaddr_t
obj = &pmap->pm_obj[i-2];
l = curlwp;
- PMAP_SUBOBJ_LOCK(pmap, i - 2);
ncsw = l->l_ncsw;
ptp = uvm_pagealloc(obj, ptp_va2o(va, i - 1), NULL,
UVM_PGA_USERESERVE|UVM_PGA_ZERO);
@@ -1957,13 +1935,10 @@ pmap_get_ptp(struct pmap *pmap, vaddr_t
if (ptp != NULL) {
uvm_pagefree(ptp);
}
- PMAP_SUBOBJ_UNLOCK(pmap, i - 2);
/* XXX shut up the assertion in pmap_unmap_ptes */
pmap->pm_ncsw = l->l_ncsw;
return EAGAIN;
}
- PMAP_SUBOBJ_UNLOCK(pmap, i - 2);
-
if (ptp == NULL)
return ENOMEM;
@@ -2218,10 +2193,10 @@ pmap_create(void)
pmap = pool_cache_get(&pmap_cache, PR_WAITOK);
/* init uvm_object */
+ mutex_init(pmap->pm_lock, MUTEX_DEFAULT, IPL_NONE);
for (i = 0; i < PTP_LEVELS - 1; i++) {
- mutex_init(&pmap->pm_obj_lock[i], MUTEX_DEFAULT, IPL_NONE);
uvm_obj_init(&pmap->pm_obj[i], NULL, false, 1);
- uvm_obj_setlock(&pmap->pm_obj[i], &pmap->pm_obj_lock[i]);
+ uvm_obj_setlock(&pmap->pm_obj[i], pmap->pm_lock);
pmap->pm_ptphint[i] = NULL;
}
pmap->pm_stats.wired_count = 0;
@@ -2393,8 +2368,8 @@ pmap_destroy(struct pmap *pmap)
for (i = 0; i < PTP_LEVELS - 1; i++) {
uvm_obj_destroy(&pmap->pm_obj[i], false);
- mutex_destroy(&pmap->pm_obj_lock[i]);
}
+ mutex_destroy(pmap->pm_lock);
pool_cache_put(&pmap_cache, pmap);
}