diff options
| author | Alan Cox <alc@FreeBSD.org> | 2003-09-20 23:54:36 +0000 |
|---|---|---|
| committer | Alan Cox <alc@FreeBSD.org> | 2003-09-20 23:54:36 +0000 |
| commit | f8363bdee9789f251450b79b0aabe5e56b5ebf3d (patch) | |
| tree | 45dac8566fbba87039dc31985ac505c9f3b5971c | |
| parent | 926074e580140962a3046e0c64b5de6b20327acb (diff) | |
Notes
| -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 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(); } |
