diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 98f9521bc57c..eef5b72ff0c0 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1565,6 +1565,8 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) if (pmap->pm_stats.resident_count == 0) return; + anyvalid = 0; + vm_page_lock_queues(); PMAP_LOCK(pmap); @@ -1581,8 +1583,6 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) } } - anyvalid = 0; - for (; sva < eva; sva = va_next) { if (pmap->pm_stats.resident_count == 0) @@ -1644,11 +1644,10 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) break; } } - - if (anyvalid) - pmap_invalidate_all(pmap); out: vm_page_unlock_queues(); + if (anyvalid) + pmap_invalidate_all(pmap); PMAP_UNLOCK(pmap); } @@ -1818,9 +1817,9 @@ retry: } } } + vm_page_unlock_queues(); if (anychanged) pmap_invalidate_all(pmap); - vm_page_unlock_queues(); PMAP_UNLOCK(pmap); } diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index b795bbf5b705..e363da1c9d1e 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -1650,6 +1650,8 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) if (pmap->pm_stats.resident_count == 0) return; + anyvalid = 0; + vm_page_lock_queues(); sched_pin(); PMAP_LOCK(pmap); @@ -1665,8 +1667,6 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) goto out; } - anyvalid = 0; - for (; sva < eva; sva = pdnxt) { unsigned pdirindex; @@ -1714,12 +1714,11 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) break; } } - - if (anyvalid) - pmap_invalidate_all(pmap); out: sched_unpin(); vm_page_unlock_queues(); + if (anyvalid) + pmap_invalidate_all(pmap); PMAP_UNLOCK(pmap); } @@ -1879,10 +1878,10 @@ retry: } } } - if (anychanged) - pmap_invalidate_all(pmap); sched_unpin(); vm_page_unlock_queues(); + if (anychanged) + pmap_invalidate_all(pmap); PMAP_UNLOCK(pmap); } diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index 3f62fd61e7d4..06c7d6bb9553 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -1351,11 +1351,10 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) } } } - out: + vm_page_unlock_queues(); pmap_install(oldpmap); PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); } /* @@ -1468,9 +1467,9 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) sva += PAGE_SIZE; } + vm_page_unlock_queues(); pmap_install(oldpmap); PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); } /*