summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-09-20 23:54:36 +0000
committeralc <alc@FreeBSD.org>2003-09-20 23:54:36 +0000
commit6c696bcaf254dea1c085dde90c9360613f067c0c (patch)
tree45dac8566fbba87039dc31985ac505c9f3b5971c /sys/i386
parenta2bf473742575b09fc2f2bd6554d7256facb7f2e (diff)
downloadFreeBSD-src-6c696bcaf254dea1c085dde90c9360613f067c0c.zip
FreeBSD-src-6c696bcaf254dea1c085dde90c9360613f067c0c.tar.gz
Reimplement pmap_release() such that it uses the page table rather than the
pte object to locate the page table directory pages. (This is another step toward the elimination of the pte object.)
Diffstat (limited to 'sys/i386')
-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 2b64cb7..0306528 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();
}
OpenPOWER on IntegriCloud