Index: sys/arch/mips/mips/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/mips/mips/pmap.c,v retrieving revision 1.220 diff -u -p -r1.220 pmap.c --- sys/arch/mips/mips/pmap.c 5 Nov 2015 06:26:15 -0000 1.220 +++ sys/arch/mips/mips/pmap.c 22 Jun 2016 21:58:17 -0000 @@ -1054,6 +1054,10 @@ pmap_page_protect(struct vm_page *pg, vm while (pv != NULL) { const pmap_t pmap = pv->pv_pmap; const uint16_t gen = PG_MD_PVLIST_GEN(md); + if (pv->pv_va & PV_KENTER) { + pv = pv->pv_next; + continue; + } va = trunc_page(pv->pv_va); PG_MD_PVLIST_UNLOCK(md); pmap_protect(pmap, va, va + PAGE_SIZE, prot); @@ -1080,13 +1084,25 @@ pmap_page_protect(struct vm_page *pg, vm } (void)PG_MD_PVLIST_LOCK(md, false); pv = &md->pvh_first; - while (pv->pv_pmap != NULL) { - const pmap_t pmap = pv->pv_pmap; - va = trunc_page(pv->pv_va); - PG_MD_PVLIST_UNLOCK(md); - pmap_remove(pmap, va, va + PAGE_SIZE); - pmap_update(pmap); - (void)PG_MD_PVLIST_LOCK(md, false); + if (pv->pv_pmap != NULL) { + while (pv != NULL) { + const pmap_t pmap = pv->pv_pmap; + const uint16_t gen = PG_MD_PVLIST_GEN(md); + if (pv->pv_va & PV_KENTER) { + pv = pv->pv_next; + continue; + } + pv_entry_t npv = pv->pv_next; + va = trunc_page(pv->pv_va); + PG_MD_PVLIST_UNLOCK(md); + pmap_remove(pmap, va, va + PAGE_SIZE); + pmap_update(pmap); + if (gen != PG_MD_PVLIST_LOCK(md, false)) { + pv = &md->pvh_first; + } else { + pv = npv; + } + } } PG_MD_PVLIST_UNLOCK(md); }