summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2004-07-17 22:20:53 +0000
committeralc <alc@FreeBSD.org>2004-07-17 22:20:53 +0000
commita556ccfd2208e542a79f9eb74858d8eb64fbc1cf (patch)
treeea05f50ca9caec43b2685f20e5a60b1c704833ac /sys
parentccfd16b40a882ec2b27ae7985db2791ee887133c (diff)
downloadFreeBSD-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().
Diffstat (limited to 'sys')
-rw-r--r--sys/i386/i386/pmap.c6
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;
OpenPOWER on IntegriCloud