diff options
author | alc <alc@FreeBSD.org> | 2003-09-20 23:54:36 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-09-20 23:54:36 +0000 |
commit | 6c696bcaf254dea1c085dde90c9360613f067c0c (patch) | |
tree | 45dac8566fbba87039dc31985ac505c9f3b5971c /sys/i386 | |
parent | a2bf473742575b09fc2f2bd6554d7256facb7f2e (diff) | |
download | FreeBSD-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.c | 15 |
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(); } |