diff options
author | alc <alc@FreeBSD.org> | 2010-05-28 06:49:57 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-05-28 06:49:57 +0000 |
commit | f89998ed7146d90bbe92b6abc6c786edb7fcae52 (patch) | |
tree | 8383a6d2c554a98095f8d6dbe9405e3d260cf146 /sys/i386 | |
parent | 5260c24925856c73d97c996edf8c1220a73ba0b7 (diff) | |
download | FreeBSD-src-f89998ed7146d90bbe92b6abc6c786edb7fcae52.zip FreeBSD-src-f89998ed7146d90bbe92b6abc6c786edb7fcae52.tar.gz |
Defer freeing any page table pages in pmap_remove_all() until after the
page queues lock is released. This may reduce the amount of time that the
page queues lock is held by pmap_remove_all().
Diffstat (limited to 'sys/i386')
-rw-r--r-- | sys/i386/i386/pmap.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 2af5598..8ecd793 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -2900,6 +2900,7 @@ pmap_remove_all(vm_page_t m) KASSERT((m->flags & PG_FICTITIOUS) == 0, ("pmap_remove_all: page %p is fictitious", m)); + free = NULL; vm_page_lock_queues(); sched_pin(); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -2930,10 +2931,8 @@ pmap_remove_all(vm_page_t m) */ if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - free = NULL; pmap_unuse_pt(pmap, pv->pv_va, &free); pmap_invalidate_page(pmap, pv->pv_va); - pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); free_pv_entry(pmap, pv); PMAP_UNLOCK(pmap); @@ -2941,6 +2940,7 @@ pmap_remove_all(vm_page_t m) vm_page_flag_clear(m, PG_WRITEABLE); sched_unpin(); vm_page_unlock_queues(); + pmap_free_zero_pages(free); } /* |