Index: sys/uvm/pmap/pmap.c =================================================================== RCS file: /cvsroot/src/sys/uvm/pmap/pmap.c,v retrieving revision 1.21 diff -u -p -r1.21 pmap.c --- sys/uvm/pmap/pmap.c 20 Aug 2016 20:09:47 -0000 1.21 +++ sys/uvm/pmap/pmap.c 16 Sep 2016 16:37:42 -0000 @@ -800,9 +800,12 @@ pmap_page_remove(struct vm_page *pg) } } + pmap_page_clear_attributes(mdpg, VM_PAGEMD_EXECPAGE #ifdef PMAP_VIRTUAL_CACHE_ALIASES - pmap_page_clear_attributes(mdpg, VM_PAGEMD_UNCACHED); + | VM_PAGEMD_UNCACHED #endif + ); + pmap_pvlist_check(mdpg); VM_PAGEMD_PVLIST_UNLOCK(mdpg); kpreempt_enable(); @@ -1967,7 +1970,7 @@ pmap_remove_pv(pmap_t pmap, vaddr_t va, */ if (npv) pmap_pv_free(npv); - if (VM_PAGEMD_EXECPAGE_P(mdpg) && dirty) { + if (VM_PAGEMD_EXECPAGE_P(mdpg)) { if (last) { /* * If this was the page's last mapping, we no longer @@ -1976,11 +1979,11 @@ pmap_remove_pv(pmap_t pmap, vaddr_t va, UVMHIST_LOG(pmapexechist, "pg %p (pa %#"PRIxPADDR")%s: %s", pg, VM_PAGE_TO_PHYS(pg), - last ? " [last mapping]" : "", + " [last mapping]", "execpage cleared"); pmap_page_clear_attributes(mdpg, VM_PAGEMD_EXECPAGE); PMAP_COUNT(exec_uncached_remove); - } else { + } else if (dirty) { /* * Someone still has it mapped as an executable page * so we must sync it. @@ -1988,7 +1991,7 @@ pmap_remove_pv(pmap_t pmap, vaddr_t va, UVMHIST_LOG(pmapexechist, "pg %p (pa %#"PRIxPADDR")%s: %s", pg, VM_PAGE_TO_PHYS(pg), - last ? " [last mapping]" : "", + "", "performed syncicache"); pmap_page_syncicache(pg); PMAP_COUNT(exec_synced_remove);