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);
 }
 

Reply via email to