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