aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2003-09-20 23:54:36 +0000
committerAlan Cox <alc@FreeBSD.org>2003-09-20 23:54:36 +0000
commitf8363bdee9789f251450b79b0aabe5e56b5ebf3d (patch)
tree45dac8566fbba87039dc31985ac505c9f3b5971c
parent926074e580140962a3046e0c64b5de6b20327acb (diff)
Notes
-rw-r--r--sys/i386/i386/pmap.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 2b64cb7462376..0306528b34eb5 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -1363,15 +1363,9 @@ pmap_lazyfix(pmap_t pmap)
void
pmap_release(pmap_t pmap)
{
- vm_object_t object;
- vm_page_t m;
+ vm_page_t m, ptdpg[NPGPTD];
int i;
- object = pmap->pm_pteobj;
-
- KASSERT(object->ref_count == 1,
- ("pmap_release: pteobj reference count %d != 1",
- object->ref_count));
KASSERT(pmap->pm_stats.resident_count == 0,
("pmap_release: pmap resident count %ld != 0",
pmap->pm_stats.resident_count));
@@ -1381,6 +1375,9 @@ pmap_release(pmap_t pmap)
LIST_REMOVE(pmap, pm_list);
mtx_unlock_spin(&allpmaps_lock);
+ for (i = 0; i < NPGPTD; i++)
+ ptdpg[i] = PHYS_TO_VM_PAGE(pmap->pm_pdir[PTDPTDI + i]);
+
bzero(pmap->pm_pdir + PTDPTDI, (nkpt + NPGPTD) *
sizeof(*pmap->pm_pdir));
#ifdef SMP
@@ -1391,7 +1388,7 @@ pmap_release(pmap_t pmap)
vm_page_lock_queues();
for (i = 0; i < NPGPTD; i++) {
- m = TAILQ_FIRST(&object->memq);
+ m = ptdpg[i];
#ifdef PAE
KASSERT(VM_PAGE_TO_PHYS(m) == (pmap->pm_pdpt[i] & PG_FRAME),
("pmap_release: got wrong ptd page"));
@@ -1401,8 +1398,6 @@ pmap_release(pmap_t pmap)
vm_page_busy(m);
vm_page_free_zero(m);
}
- KASSERT(TAILQ_EMPTY(&object->memq),
- ("pmap_release: leaking page table pages"));
vm_page_unlock_queues();
}