Module Name:    src
Committed By:   matt
Date:           Sat Jan 28 00:11:47 UTC 2012

Modified Files:
        src/sys/arch/arm/arm32: pmap.c

Log Message:
Don't use simple locks.


To generate a diff of this commit:
cvs rdiff -u -r1.225 -r1.226 src/sys/arch/arm/arm32/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/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.225 src/sys/arch/arm/arm32/pmap.c:1.226
--- src/sys/arch/arm/arm32/pmap.c:1.225	Fri Jan 27 19:48:38 2012
+++ src/sys/arch/arm/arm32/pmap.c	Sat Jan 28 00:11:46 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.225 2012/01/27 19:48:38 para Exp $	*/
+/*	$NetBSD: pmap.c,v 1.226 2012/01/28 00:11:46 matt Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -211,7 +211,7 @@
 #include <machine/param.h>
 #include <arm/arm32/katelib.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.225 2012/01/27 19:48:38 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.226 2012/01/28 00:11:46 matt Exp $");
 
 #ifdef PMAP_DEBUG
 
@@ -467,24 +467,6 @@ bool pmap_initialized;
  * Misc. locking data structures
  */
 
-#if 0 /* defined(MULTIPROCESSOR) || defined(LOCKDEBUG) */
-static struct lock pmap_main_lock;
-
-#define PMAP_MAP_TO_HEAD_LOCK() \
-     (void) spinlockmgr(&pmap_main_lock, LK_SHARED, NULL)
-#define PMAP_MAP_TO_HEAD_UNLOCK() \
-     (void) spinlockmgr(&pmap_main_lock, LK_RELEASE, NULL)
-#define PMAP_HEAD_TO_MAP_LOCK() \
-     (void) spinlockmgr(&pmap_main_lock, LK_EXCLUSIVE, NULL)
-#define PMAP_HEAD_TO_MAP_UNLOCK() \
-     spinlockmgr(&pmap_main_lock, LK_RELEASE, (void *) 0)
-#else
-#define PMAP_MAP_TO_HEAD_LOCK()		/* null */
-#define PMAP_MAP_TO_HEAD_UNLOCK()	/* null */
-#define PMAP_HEAD_TO_MAP_LOCK()		/* null */
-#define PMAP_HEAD_TO_MAP_UNLOCK()	/* null */
-#endif
-
 #define	pmap_acquire_pmap_lock(pm)			\
 	do {						\
 		if ((pm) != pmap_kernel())		\
@@ -543,7 +525,7 @@ struct l1_ttable {
  *    the userland pmaps which owns this L1) are moved to the TAIL.
  */
 static TAILQ_HEAD(, l1_ttable) l1_lru_list;
-static struct simplelock l1_lru_lock;
+static kmutex_t l1_lru_lock __cacheline_aligned;
 
 /*
  * A list of all L1 tables
@@ -871,7 +853,6 @@ pmap_enter_pv(struct vm_page_md *md, pad
 	pv->pv_va = va;
 	pv->pv_flags = flags;
 
-	simple_lock(&md->pvh_slock);	/* lock vm_page */
 	pvp = &SLIST_FIRST(&md->pvh_list);
 #ifdef PMAP_CACHE_VIPT
 	/*
@@ -924,7 +905,6 @@ pmap_enter_pv(struct vm_page_md *md, pad
 #endif
 
 	PMAPCOUNT(mappings);
-	simple_unlock(&md->pvh_slock);	/* unlock, done! */
 
 	if (pv->pv_flags & PVF_WIRED)
 		++pm->pm_stats.wired_count;
@@ -1144,7 +1124,7 @@ pmap_alloc_l1(pmap_t pm)
 	/*
 	 * Remove the L1 at the head of the LRU list
 	 */
-	simple_lock(&l1_lru_lock);
+	mutex_spin_enter(&l1_lru_lock);
 	l1 = TAILQ_FIRST(&l1_lru_list);
 	KDASSERT(l1 != NULL);
 	TAILQ_REMOVE(&l1_lru_list, l1, l1_lru);
@@ -1163,7 +1143,7 @@ pmap_alloc_l1(pmap_t pm)
 	if (++l1->l1_domain_use_count < PMAP_DOMAINS)
 		TAILQ_INSERT_TAIL(&l1_lru_list, l1, l1_lru);
 
-	simple_unlock(&l1_lru_lock);
+	mutex_spin_exit(&l1_lru_lock);
 
 	/*
 	 * Fix up the relevant bits in the pmap structure
@@ -1181,7 +1161,7 @@ pmap_free_l1(pmap_t pm)
 {
 	struct l1_ttable *l1 = pm->pm_l1;
 
-	simple_lock(&l1_lru_lock);
+	mutex_spin_enter(&l1_lru_lock);
 
 	/*
 	 * If this L1 is currently on the LRU list, remove it.
@@ -1207,7 +1187,7 @@ pmap_free_l1(pmap_t pm)
 	else
 		TAILQ_INSERT_TAIL(&l1_lru_list, l1, l1_lru);
 
-	simple_unlock(&l1_lru_lock);
+	mutex_spin_exit(&l1_lru_lock);
 }
 
 static inline void
@@ -1231,13 +1211,13 @@ pmap_use_l1(pmap_t pm)
 	if (l1->l1_domain_use_count == PMAP_DOMAINS)
 		return;
 
-	simple_lock(&l1_lru_lock);
+	mutex_spin_enter(&l1_lru_lock);
 
 	/*
 	 * Check the use count again, now that we've acquired the lock
 	 */
 	if (l1->l1_domain_use_count == PMAP_DOMAINS) {
-		simple_unlock(&l1_lru_lock);
+		mutex_spin_exit(&l1_lru_lock);
 		return;
 	}
 
@@ -1247,7 +1227,7 @@ pmap_use_l1(pmap_t pm)
 	TAILQ_REMOVE(&l1_lru_list, l1, l1_lru);
 	TAILQ_INSERT_TAIL(&l1_lru_list, l1, l1_lru);
 
-	simple_unlock(&l1_lru_lock);
+	mutex_spin_exit(&l1_lru_lock);
 }
 
 /*
@@ -2139,9 +2119,6 @@ pmap_clearbit(struct vm_page_md *md, pad
 	    printf("pmap_clearbit: md %p mask 0x%x\n",
 	    md, maskbits));
 
-	PMAP_HEAD_TO_MAP_LOCK();
-	simple_lock(&md->pvh_slock);
-
 #ifdef PMAP_CACHE_VIPT
 	/*
 	 * If we might want to sync the I-cache and we've modified it,
@@ -2166,8 +2143,6 @@ pmap_clearbit(struct vm_page_md *md, pad
 			PMAPCOUNT(exec_discarded_clearbit);
 		}
 #endif
-		simple_unlock(&md->pvh_slock);
-		PMAP_HEAD_TO_MAP_UNLOCK();
 		return;
 	}
 
@@ -2328,9 +2303,6 @@ pmap_clearbit(struct vm_page_md *md, pad
 			pmap_vac_me_harder(md, pa, NULL, 0);
 	}
 #endif
-
-	simple_unlock(&md->pvh_slock);
-	PMAP_HEAD_TO_MAP_UNLOCK();
 }
 
 /*
@@ -2578,9 +2550,6 @@ pmap_page_remove(struct vm_page_md *md, 
 	    printf("pmap_page_remove: md %p (0x%08lx)\n", md,
 	    pa));
 
-	PMAP_HEAD_TO_MAP_LOCK();
-	simple_lock(&md->pvh_slock);
-
 	pv = SLIST_FIRST(&md->pvh_list);
 	if (pv == NULL) {
 #ifdef PMAP_CACHE_VIPT
@@ -2593,8 +2562,6 @@ pmap_page_remove(struct vm_page_md *md, 
 		md->pvh_attrs &= ~PVF_EXEC;
 		KASSERT((md->urw_mappings + md->krw_mappings == 0) == !(md->pvh_attrs & PVF_WRITE));
 #endif
-		simple_unlock(&md->pvh_slock);
-		PMAP_HEAD_TO_MAP_UNLOCK();
 		return;
 	}
 #ifdef PMAP_CACHE_VIPT
@@ -2696,8 +2663,6 @@ pmap_page_remove(struct vm_page_md *md, 
 		md->pvh_attrs &= ~PVF_WRITE;
 	KASSERT((md->urw_mappings + md->krw_mappings == 0) == !(md->pvh_attrs & PVF_WRITE));
 #endif
-	simple_unlock(&md->pvh_slock);
-	PMAP_HEAD_TO_MAP_UNLOCK();
 
 	if (flush) {
 		/*
@@ -2799,7 +2764,6 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 	if (flags & PMAP_WIRED)
 		nflags |= PVF_WIRED;
 
-	PMAP_MAP_TO_HEAD_LOCK();
 	pmap_acquire_pmap_lock(pm);
 
 	/*
@@ -2813,7 +2777,6 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 	if (l2b == NULL) {
 		if (flags & PMAP_CANFAIL) {
 			pmap_release_pmap_lock(pm);
-			PMAP_MAP_TO_HEAD_UNLOCK();
 			return (ENOMEM);
 		}
 		panic("pmap_enter: failed to allocate L2 bucket");
@@ -2880,11 +2843,10 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 			/*
 			 * We're changing the attrs of an existing mapping.
 			 */
-			simple_lock(&md->pvh_slock);
+			KASSERT(uvm_page_locked_p(pg));
 			oflags = pmap_modify_pv(md, pa, pm, va,
 			    PVF_WRITE | PVF_EXEC | PVF_WIRED |
 			    PVF_MOD | PVF_REF, nflags);
-			simple_unlock(&md->pvh_slock);
 
 #ifdef PMAP_CACHE_VIVT
 			/*
@@ -2911,10 +2873,9 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 				 * It is part of our managed memory so we
 				 * must remove it from the PV list
 				 */
-				simple_lock(&omd->pvh_slock);
+				KASSERT(uvm_page_locked_p(opg));
 				pv = pmap_remove_pv(omd, opa, pm, va);
 				pmap_vac_me_harder(omd, opa, pm, 0);
-				simple_unlock(&omd->pvh_slock);
 				oflags = pv->pv_flags;
 
 #ifdef PMAP_CACHE_VIVT
@@ -2945,12 +2906,12 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 				if (pm != pmap_kernel())
 					pmap_free_l2_bucket(pm, l2b, 0);
 				pmap_release_pmap_lock(pm);
-				PMAP_MAP_TO_HEAD_UNLOCK();
 				NPDEBUG(PDB_ENTER,
 				    printf("pmap_enter: ENOMEM\n"));
 				return (ENOMEM);
 			}
 
+			KASSERT(uvm_page_locked_p(pg));
 			pmap_enter_pv(md, pa, pv, pm, va, nflags);
 		}
 	} else {
@@ -2980,10 +2941,9 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 			struct vm_page_md *omd = VM_PAGE_TO_MD(opg);
 			paddr_t opa = VM_PAGE_TO_PHYS(opg);
 
-			simple_lock(&omd->pvh_slock);
+			KASSERT(uvm_page_locked_p(opg));
 			pv = pmap_remove_pv(omd, opa, pm, va);
 			pmap_vac_me_harder(omd, opa, pm, 0);
-			simple_unlock(&omd->pvh_slock);
 			oflags = pv->pv_flags;
 
 #ifdef PMAP_CACHE_VIVT
@@ -3064,24 +3024,21 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 		if (pg != NULL) {
 			struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 
-			simple_lock(&md->pvh_slock);
+			KASSERT(uvm_page_locked_p(pg));
 			pmap_vac_me_harder(md, pa, pm, va);
-			simple_unlock(&md->pvh_slock);
 		}
 	}
 #if defined(PMAP_CACHE_VIPT) && defined(DIAGNOSTIC)
 	if (pg) {
 		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 
-		simple_lock(&md->pvh_slock);
+		KASSERT(uvm_page_locked_p(pg));
 		KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
 		KASSERT(((md->pvh_attrs & PVF_WRITE) == 0) == (md->urw_mappings + md->krw_mappings == 0));
-		simple_unlock(&md->pvh_slock);
 	}
 #endif
 
 	pmap_release_pmap_lock(pm);
-	PMAP_MAP_TO_HEAD_UNLOCK();
 
 	return (0);
 }
@@ -3127,7 +3084,6 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
 	/*
 	 * we lock in the pmap => pv_head direction
 	 */
-	PMAP_MAP_TO_HEAD_LOCK();
 	pmap_acquire_pmap_lock(pm);
 
 	if (pm->pm_remove_all || !pmap_is_cached(pm)) {
@@ -3180,10 +3136,9 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
 				struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 				struct pv_entry *pv;
 
-				simple_lock(&md->pvh_slock);
+				KASSERT(uvm_page_locked_p(pg));
 				pv = pmap_remove_pv(md, pa, pm, sva);
 				pmap_vac_me_harder(md, pa, pm, 0);
-				simple_unlock(&md->pvh_slock);
 				if (pv != NULL) {
 					if (pm->pm_remove_all == false) {
 						is_exec =
@@ -3296,7 +3251,6 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
 	}
 
 	pmap_release_pmap_lock(pm);
-	PMAP_MAP_TO_HEAD_UNLOCK();
 }
 
 #ifdef PMAP_CACHE_VIPT
@@ -3307,7 +3261,7 @@ pmap_kremove_pg(struct vm_page *pg, vadd
 	paddr_t pa = VM_PAGE_TO_PHYS(pg);
 	struct pv_entry *pv;
 
-	simple_lock(&md->pvh_slock);
+	KASSERT(uvm_page_locked_p(pg));
 	KASSERT(arm_cache_prefer_mask == 0 || md->pvh_attrs & (PVF_COLORED|PVF_NC));
 	KASSERT((md->pvh_attrs & PVF_KMPAGE) == 0);
 
@@ -3331,7 +3285,6 @@ pmap_kremove_pg(struct vm_page *pg, vadd
 		}
 	}
 	pmap_vac_me_harder(md, pa, pmap_kernel(), 0);
-	simple_unlock(&md->pvh_slock);
 
 	return pv;
 }
@@ -3381,9 +3334,8 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 			KASSERT(opg != pg);
 			KASSERT((omd->pvh_attrs & PVF_KMPAGE) == 0);
 			KASSERT((flags & PMAP_KMPAGE) == 0);
-			simple_lock(&omd->pvh_slock);
+			KASSERT(uvm_page_locked_p(opg));
 			pv = pmap_kremove_pg(opg, va);
-			simple_unlock(&omd->pvh_slock);
 		}
 #endif
 		if (l2pte_valid(opte)) {
@@ -3400,8 +3352,8 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 	PTE_SYNC(ptep);
 
 	if (pg) {
+		KASSERT(uvm_page_locked_p(pg));
 		if (flags & PMAP_KMPAGE) {
-			simple_lock(&md->pvh_slock);
 			KASSERT(md->urw_mappings == 0);
 			KASSERT(md->uro_mappings == 0);
 			KASSERT(md->krw_mappings == 0);
@@ -3432,7 +3384,6 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 			md->pvh_attrs |= PVF_KMPAGE;
 #endif
 			pmap_kmpages++;
-			simple_unlock(&md->pvh_slock);
 #ifdef PMAP_CACHE_VIPT
 		} else {
 			if (pv == NULL) {
@@ -3446,9 +3397,7 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 			    && !(md->pvh_attrs & PVF_NC))
 				md->pvh_attrs |= PVF_DIRTY;
 			KASSERT((prot & VM_PROT_WRITE) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
-			simple_lock(&md->pvh_slock);
 			pmap_vac_me_harder(md, pa, pmap_kernel(), va);
-			simple_unlock(&md->pvh_slock);
 #endif
 		}
 #ifdef PMAP_CACHE_VIPT
@@ -3490,10 +3439,10 @@ pmap_kremove(vaddr_t va, vsize_t len)
 			opte = *ptep;
 			opg = PHYS_TO_VM_PAGE(l2pte_pa(opte));
 			if (opg) {
+				KASSERT(uvm_page_locked_p(opg));
 				struct vm_page_md *omd = VM_PAGE_TO_MD(opg);
 
 				if (omd->pvh_attrs & PVF_KMPAGE) {
-					simple_lock(&omd->pvh_slock);
 					KASSERT(omd->urw_mappings == 0);
 					KASSERT(omd->uro_mappings == 0);
 					KASSERT(omd->krw_mappings == 0);
@@ -3503,7 +3452,6 @@ pmap_kremove(vaddr_t va, vsize_t len)
 					omd->pvh_attrs &= ~PVF_WRITE;
 #endif
 					pmap_kmpages--;
-					simple_unlock(&omd->pvh_slock);
 #ifdef PMAP_CACHE_VIPT
 				} else {
 					pool_put(&pmap_pv_pool,
@@ -3618,7 +3566,6 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad
 		return;
 	}
 
-	PMAP_MAP_TO_HEAD_LOCK();
 	pmap_acquire_pmap_lock(pm);
 
 	flush = ((eva - sva) >= (PAGE_SIZE * 4)) ? 0 : -1;
@@ -3663,13 +3610,13 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad
 					struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 					paddr_t pa = VM_PAGE_TO_PHYS(pg);
 
-					simple_lock(&md->pvh_slock);
+					KASSERT(uvm_page_locked_p(pg));
 					f = pmap_modify_pv(md, pa, pm, sva,
 					    clr_mask, 0);
 					pmap_vac_me_harder(md, pa, pm, sva);
-					simple_unlock(&md->pvh_slock);
-				} else
+				} else {
 					f = PVF_REF | PVF_EXEC;
+				}
 
 				if (flush >= 0) {
 					flush++;
@@ -3688,7 +3635,6 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad
 	}
 
 	pmap_release_pmap_lock(pm);
-	PMAP_MAP_TO_HEAD_UNLOCK();
 
 	if (flush) {
 		if (PV_BEEN_EXECD(flags))
@@ -3711,7 +3657,6 @@ pmap_icache_sync_range(pmap_t pm, vaddr_
 	    printf("pmap_icache_sync_range: pm %p sva 0x%lx eva 0x%lx\n",
 	    pm, sva, eva));
 
-	PMAP_MAP_TO_HEAD_LOCK();
 	pmap_acquire_pmap_lock(pm);
 
 	while (sva < eva) {
@@ -3736,7 +3681,6 @@ pmap_icache_sync_range(pmap_t pm, vaddr_
 	}
 
 	pmap_release_pmap_lock(pm);
-	PMAP_MAP_TO_HEAD_UNLOCK();
 }
 
 void
@@ -3749,6 +3693,8 @@ pmap_page_protect(struct vm_page *pg, vm
 	    printf("pmap_page_protect: md %p (0x%08lx), prot 0x%x\n",
 	    md, pa, prot));
 
+	KASSERT(uvm_page_locked_p(pg));
+
 	switch(prot) {
 	case VM_PROT_READ|VM_PROT_WRITE:
 #if defined(PMAP_CHECK_VIPT) && defined(PMAP_APX)
@@ -3785,6 +3731,8 @@ pmap_clear_modify(struct vm_page *pg)
 	paddr_t pa = VM_PAGE_TO_PHYS(pg);
 	bool rv;
 
+	KASSERT(uvm_page_locked_p(pg));
+
 	if (md->pvh_attrs & PVF_MOD) {
 		rv = true;
 #ifdef PMAP_CACHE_VIPT
@@ -3815,6 +3763,8 @@ pmap_clear_reference(struct vm_page *pg)
 	paddr_t pa = VM_PAGE_TO_PHYS(pg);
 	bool rv;
 
+	KASSERT(uvm_page_locked_p(pg));
+
 	if (md->pvh_attrs & PVF_REF) {
 		rv = true;
 		pmap_clearbit(md, pa, PVF_REF);
@@ -3849,7 +3799,6 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 	u_int l1idx;
 	int rv = 0;
 
-	PMAP_MAP_TO_HEAD_LOCK();
 	pmap_acquire_pmap_lock(pm);
 
 	l1idx = L1_IDX(va);
@@ -3903,11 +3852,10 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 
 		/* Get the current flags for this page. */
-		simple_lock(&md->pvh_slock);
+		KASSERT(uvm_page_locked_p(pg));
 
 		pv = pmap_find_pv(md, pm, va);
 		if (pv == NULL) {
-	    		simple_unlock(&md->pvh_slock);
 			goto out;
 		}
 
@@ -3919,7 +3867,6 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 		 * and also set the modified bit
 		 */
 		if ((pv->pv_flags & PVF_WRITE) == 0) {
-		    	simple_unlock(&md->pvh_slock);
 			goto out;
 		}
 
@@ -3936,7 +3883,6 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 		if ((md->pvh_attrs & PVF_NC) == 0)
 			md->pvh_attrs |= PVF_DIRTY;
 #endif
-		simple_unlock(&md->pvh_slock);
 
 		/* 
 		 * Re-enable write permissions for the page.  No need to call
@@ -3964,17 +3910,15 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 
 		/* Get the current flags for this page. */
-		simple_lock(&md->pvh_slock);
+		KASSERT(uvm_page_locked_p(pg));
 
 		pv = pmap_find_pv(md, pm, va);
 		if (pv == NULL) {
-	    		simple_unlock(&md->pvh_slock);
 			goto out;
 		}
 
 		md->pvh_attrs |= PVF_REF;
 		pv->pv_flags |= PVF_REF;
-		simple_unlock(&md->pvh_slock);
 
 		NPDEBUG(PDB_FOLLOW,
 		    printf("pmap_fault_fixup: ref emul. pm %p, va 0x%08lx, pa 0x%08lx\n",
@@ -4074,7 +4018,6 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 
 out:
 	pmap_release_pmap_lock(pm);
-	PMAP_MAP_TO_HEAD_UNLOCK();
 
 	return (rv);
 }
@@ -4111,7 +4054,6 @@ pmap_unwire(pmap_t pm, vaddr_t va)
 
 	NPDEBUG(PDB_WIRING, printf("pmap_unwire: pm %p, va 0x%08lx\n", pm, va));
 
-	PMAP_MAP_TO_HEAD_LOCK();
 	pmap_acquire_pmap_lock(pm);
 
 	l2b = pmap_get_l2_bucket(pm, va);
@@ -4127,13 +4069,11 @@ pmap_unwire(pmap_t pm, vaddr_t va)
 		/* Update the wired bit in the pv entry for this page. */
 		struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 
-		simple_lock(&md->pvh_slock);
+		KASSERT(uvm_page_locked_p(pg));
 		(void) pmap_modify_pv(md, pa, pm, va, PVF_WIRED, 0);
-		simple_unlock(&md->pvh_slock);
 	}
 
 	pmap_release_pmap_lock(pm);
-	PMAP_MAP_TO_HEAD_UNLOCK();
 }
 
 void
@@ -4663,7 +4603,7 @@ pmap_copy_page_generic(paddr_t src, padd
 	 * the duration of the copy so that no other mappings can
 	 * be created while we have a potentially aliased mapping.
 	 */
-	simple_lock(&src_md->pvh_slock);
+	KASSERT(uvm_page_locked_p(src_pg));
 #ifdef PMAP_CACHE_VIVT
 	(void) pmap_clean_page(SLIST_FIRST(&src_md->pvh_list), true);
 #endif
@@ -4693,7 +4633,6 @@ pmap_copy_page_generic(paddr_t src, padd
 #ifdef PMAP_CACHE_VIVT
 	cpu_dcache_inv_range(csrcp + src_va_offset, PAGE_SIZE);
 #endif
-	simple_unlock(&src_md->pvh_slock); /* cache is safe again */
 #ifdef PMAP_CACHE_VIVT
 	cpu_dcache_wbinv_range(cdstp + dst_va_offset, PAGE_SIZE);
 #endif
@@ -4728,7 +4667,8 @@ pmap_copy_page_generic(paddr_t src, padd
 void
 pmap_copy_page_xscale(paddr_t src, paddr_t dst)
 {
-	struct vm_page_md *src_md = VM_PAGE_TO_MD(PHYS_TO_VM_PAGE(src));
+	struct vm_page *src_pg = PHYS_TO_VM_PAGE(src);
+	struct vm_page_md *src_md = VM_PAGE_TO_MD(src_pg);
 #ifdef DEBUG
 	struct vm_page_md *dst_md = VM_PAGE_TO_MD(PHYS_TO_VM_PAGE(dst));
 
@@ -4744,7 +4684,7 @@ pmap_copy_page_xscale(paddr_t src, paddr
 	 * the duration of the copy so that no other mappings can
 	 * be created while we have a potentially aliased mapping.
 	 */
-	simple_lock(&src_md->pvh_slock);
+	KASSERT(uvm_page_locked_p(src_pg));
 #ifdef PMAP_CACHE_VIVT
 	(void) pmap_clean_page(SLIST_FIRST(&src_md->pvh_list), true);
 #endif
@@ -4766,7 +4706,6 @@ pmap_copy_page_xscale(paddr_t src, paddr
 	cpu_tlb_flushD_SE(cdstp);
 	cpu_cpwait();
 	bcopy_page(csrcp, cdstp);
-	simple_unlock(&src_md->pvh_slock); /* cache is safe again */
 	xscale_cache_clean_minidata();
 }
 #endif /* ARM_MMU_XSCALE == 1 */
@@ -5282,14 +5221,13 @@ pmap_bootstrap(vaddr_t vstart, vaddr_t v
 	/*
 	 * init the static-global locks and global pmap list.
 	 */
-	/* spinlockinit(&pmap_main_lock, "pmaplk", 0); */
+	mutex_init(&l1_lru_lock, MUTEX_DEFAULT, IPL_VM);
 
 	/*
 	 * We can now initialise the first L1's metadata.
 	 */
 	SLIST_INIT(&l1_list);
 	TAILQ_INIT(&l1_lru_list);
-	simple_lock_init(&l1_lru_lock);
 	pmap_init_l1(l1, l1pt);
 
 	/* Set up vector page L1 details, if necessary */

Reply via email to