diff options
author | alc <alc@FreeBSD.org> | 2004-07-17 22:20:53 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2004-07-17 22:20:53 +0000 |
commit | a556ccfd2208e542a79f9eb74858d8eb64fbc1cf (patch) | |
tree | ea05f50ca9caec43b2685f20e5a60b1c704833ac | |
parent | ccfd16b40a882ec2b27ae7985db2791ee887133c (diff) | |
download | FreeBSD-src-a556ccfd2208e542a79f9eb74858d8eb64fbc1cf.zip FreeBSD-src-a556ccfd2208e542a79f9eb74858d8eb64fbc1cf.tar.gz |
- Utilize pmap_pte_quick() rather than pmap_pte() in pmap_remove() and
pmap_remove_page(). The reason being that pmap_pte_quick() requires
the page queues lock, which is already held, rather than Giant.
- Assert that the page queues lock is held in pmap_remove_page() and
pmap_remove_pte().
-rw-r--r-- | sys/i386/i386/pmap.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 6b516b5..aed779d 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -1568,6 +1568,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va) pt_entry_t oldpte; vm_page_t m; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); oldpte = pte_load_clear(ptq); if (oldpte & PG_W) @@ -1608,8 +1609,9 @@ pmap_remove_page(pmap_t pmap, vm_offset_t va) { pt_entry_t *pte; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - if ((pte = pmap_pte(pmap, va)) == NULL || *pte == 0) + if ((pte = pmap_pte_quick(pmap, va)) == NULL || *pte == 0) return; pmap_remove_pte(pmap, pte, va); pmap_invalidate_page(pmap, va); @@ -1693,7 +1695,7 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) pdnxt = eva; for (; sva != pdnxt; sva += PAGE_SIZE) { - if ((pte = pmap_pte(pmap, sva)) == NULL || + if ((pte = pmap_pte_quick(pmap, sva)) == NULL || *pte == 0) continue; anyvalid = 1; |