Index: sys/arch/sparc/sparc/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc/sparc/pmap.c,v retrieving revision 1.365 diff -p -u -r1.365 pmap.c --- sys/arch/sparc/sparc/pmap.c 3 Sep 2018 16:29:27 -0000 1.365 +++ sys/arch/sparc/sparc/pmap.c 13 Jan 2019 06:08:22 -0000 @@ -176,8 +176,13 @@ paddr_t vm_first_phys = (paddr_t)-1; paddr_t vm_last_phys = 0; psize_t vm_num_phys; +#if 0 #define PMAP_LOCK() KERNEL_LOCK(1, NULL) #define PMAP_UNLOCK() KERNEL_UNLOCK_ONE(NULL) +#else +#define PMAP_LOCK() mutex_enter(&pmap_lock) +#define PMAP_UNLOCK() mutex_exit(&pmap_lock) +#endif /* * Flags in pvlist.pv_flags. Note that PV_MOD must be 1 and PV_REF must be 2 @@ -347,6 +352,7 @@ mmuq_insert_tail(struct mmuentry *head, int seginval; /* [4/4c] the invalid segment number */ int reginval; /* [4/3mmu] the invalid region number */ +static kmutex_t pmap_lock; static kmutex_t demap_lock; static bool lock_available = false; /* demap_lock has been initialized */ @@ -3070,6 +3076,7 @@ pmap_bootstrap(int nctx, int nregion, in } pmap_page_upload(); + mutex_init(&pmap_lock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&demap_lock, MUTEX_DEFAULT, IPL_VM); mutex_init(&ctx_lock, MUTEX_DEFAULT, IPL_SCHED); lock_available = true; @@ -4662,7 +4669,7 @@ pmap_remove(struct pmap *pm, vaddr_t va, } ctx = getcontext(); - s = splvm(); /* XXX conservative */ + s = splvm(); PMAP_LOCK(); for (; va < endva; va = nva) { /* do one virtual segment at a time */ @@ -6022,7 +6029,7 @@ pmap_kenter_pa4_4c(vaddr_t va, paddr_t p splx(s); } -#if notyet +#if notyet /* XXXMRG delete */ void pmap_lockmmu(vaddr_t sva, size_t sz); void @@ -6286,7 +6293,7 @@ pmap_enk4m(struct pmap *pm, vaddr_t va, sp = &rp->rg_segmap[vs]; kpreempt_disable(); - s = splvm(); /* XXX way too conservative */ + s = splvm(); PMAP_LOCK(); if (rp->rg_seg_ptps == NULL) /* enter new region */ @@ -6372,7 +6379,7 @@ pmap_enu4m(struct pmap *pm, vaddr_t va, vr = VA_VREG(va); vs = VA_VSEG(va); rp = &pm->pm_regmap[vr]; - s = splvm(); /* XXX conservative */ + s = splvm(); PMAP_LOCK(); if (rp->rg_segmap == NULL) {