Module Name:    src
Committed By:   matt
Date:           Wed Apr  2 14:05:54 UTC 2014

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

Log Message:
Init the page_lock to IPL_VM iff VIPT && arm_cache_prefer_mask != 0 otherwise
use IPL_NONE.  Don't bother with page_lock for KMPAGEs.


To generate a diff of this commit:
cvs rdiff -u -r1.277 -r1.278 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.277 src/sys/arch/arm/arm32/pmap.c:1.278
--- src/sys/arch/arm/arm32/pmap.c:1.277	Wed Apr  2 13:26:22 2014
+++ src/sys/arch/arm/arm32/pmap.c	Wed Apr  2 14:05:54 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.277 2014/04/02 13:26:22 matt Exp $	*/
+/*	$NetBSD: pmap.c,v 1.278 2014/04/02 14:05:54 matt Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -216,7 +216,7 @@
 #include <arm/locore.h>
 //#include <arm/arm32/katelib.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.277 2014/04/02 13:26:22 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.278 2014/04/02 14:05:54 matt Exp $");
 
 //#define PMAP_DEBUG
 #ifdef PMAP_DEBUG
@@ -3725,16 +3725,17 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 				PMAPCOUNT(vac_flush_lots2);
 				pmap_flush_page(md, pa, PMAP_FLUSH_SECONDARY);
 			}
-			pmap_acquire_page_lock(md);
+			/*
+			 * Since this is a KMPAGE, there can be no contention
+			 * for this page so don't lock it.
+			 */
 			md->pvh_attrs &= PAGE_SIZE - 1;
 			md->pvh_attrs |= PVF_KMPAGE | PVF_COLORED | PVF_DIRTY
 			    | (va & arm_cache_prefer_mask);
 #else /* !PMAP_CACHE_VIPT || ARM_MMU_EXTENDED */
-			pmap_acquire_page_lock(md);
 			md->pvh_attrs |= PVF_KMPAGE;
 #endif
-			pmap_kmpages++;
-			pmap_release_page_lock(md);
+			atomic_inc_32(&pmap_kmpages);
 #if defined(PMAP_CACHE_VIPT) && !defined(ARM_MMU_EXTENDED)
 		} else if (arm_cache_prefer_mask != 0) {
 			if (pv == NULL) {
@@ -3800,7 +3801,6 @@ pmap_kremove(vaddr_t va, vsize_t len)
 			if (opg != NULL) {
 				struct vm_page_md *omd = VM_PAGE_TO_MD(opg);
 
-				pmap_acquire_page_lock(omd);
 				if (omd->pvh_attrs & PVF_KMPAGE) {
 					KASSERT(omd->urw_mappings == 0);
 					KASSERT(omd->uro_mappings == 0);
@@ -3812,14 +3812,15 @@ pmap_kremove(vaddr_t va, vsize_t len)
 						omd->pvh_attrs &= ~PVF_WRITE;
 					}
 #endif
-					pmap_kmpages--;
+					atomic_dec_32(&pmap_kmpages);
 #if defined(PMAP_CACHE_VIPT) && !defined(ARM_MMU_EXTENDED)
 				} else if (arm_cache_prefer_mask != 0) {
+					pmap_acquire_page_lock(omd);
 					pool_put(&pmap_pv_pool,
 					    pmap_kremove_pg(opg, va));
+					pmap_release_page_lock(omd);
 #endif
 				}
-				pmap_release_page_lock(omd);
 			}
 			if (l2pte_valid_p(opte)) {
 #ifdef PMAP_CACHE_VIVT
@@ -5948,7 +5949,15 @@ pmap_bootstrap(vaddr_t vstart, vaddr_t v
 #ifdef VERBOSE_INIT_ARM
 	printf("locks ");
 #endif
-	mutex_init(&pmap_lock, MUTEX_DEFAULT, IPL_NONE);
+#if defined(PMAP_CACHE_VIPT) && !defined(ARM_MMU_EXTENDED)
+	if (arm_cache_prefer_mask != 0) {
+		mutex_init(&pmap_lock, MUTEX_DEFAULT, IPL_VM);
+	} else {
+#endif
+		mutex_init(&pmap_lock, MUTEX_DEFAULT, IPL_NONE);
+#if defined(PMAP_CACHE_VIPT) && !defined(ARM_MMU_EXTENDED)
+	}
+#endif
 	mutex_init(&pm->pm_obj_lock, MUTEX_DEFAULT, IPL_NONE);
 	uvm_obj_init(&pm->pm_obj, NULL, false, 1);
 	uvm_obj_setlock(&pm->pm_obj, &pm->pm_obj_lock);

Reply via email to