diff options
author | alc <alc@FreeBSD.org> | 2010-05-08 20:34:01 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-05-08 20:34:01 +0000 |
commit | 40b44f9713de70170857e6291876dfce94b6ef43 (patch) | |
tree | 55e1683864edab13ef62b5f9fac6a4928f23f506 /sys/sun4v | |
parent | 94ac1169df0fe3609aa671582574d421e89b7ff3 (diff) | |
download | FreeBSD-src-40b44f9713de70170857e6291876dfce94b6ef43.zip FreeBSD-src-40b44f9713de70170857e6291876dfce94b6ef43.tar.gz |
Push down the page queues into vm_page_cache(), vm_page_try_to_cache(), and
vm_page_try_to_free(). Consequently, push down the page queues lock into
pmap_enter_quick(), pmap_page_wired_mapped(), pmap_remove_all(), and
pmap_remove_write().
Push down the page queues lock into Xen's pmap_page_is_mapped(). (I
overlooked the Xen pmap in r207702.)
Switch to a per-processor counter for the total number of pages cached.
Diffstat (limited to 'sys/sun4v')
-rw-r--r-- | sys/sun4v/sun4v/pmap.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/sun4v/sun4v/pmap.c b/sys/sun4v/sun4v/pmap.c index 0c84421..34d7ed1 100644 --- a/sys/sun4v/sun4v/pmap.c +++ b/sys/sun4v/sun4v/pmap.c @@ -1211,8 +1211,11 @@ pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, void pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) { + + vm_page_lock_queues(); PMAP_LOCK(pmap); pmap_enter_quick_locked(pmap, va, m, prot); + vm_page_unlock_queues(); PMAP_UNLOCK(pmap); } @@ -1714,7 +1717,7 @@ pmap_page_wired_mappings(vm_page_t m) count = 0; if ((m->flags & PG_FICTITIOUS) != 0) return (count); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { pmap = pv->pv_pmap; PMAP_LOCK(pmap); @@ -1723,6 +1726,7 @@ pmap_page_wired_mappings(vm_page_t m) count++; PMAP_UNLOCK(pmap); } + vm_page_unlock_queues(); return (count); } @@ -1732,12 +1736,15 @@ pmap_page_wired_mappings(vm_page_t m) void pmap_remove_write(vm_page_t m) { + if ((m->flags & PG_WRITEABLE) == 0) return; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + vm_page_lock_queues(); tte_clear_phys_bit(m, VTD_SW_W|VTD_W); vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_unlock_queues(); } + /* * Initialize the pmap associated with process 0. */ @@ -1956,7 +1963,7 @@ pmap_remove_all(vm_page_t m) uint64_t tte_data; DPRINTF("pmap_remove_all 0x%lx\n", VM_PAGE_TO_PHYS(m)); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + vm_page_lock_queues(); while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { PMAP_LOCK(pv->pv_pmap); pv->pv_pmap->pm_stats.resident_count--; @@ -1986,6 +1993,7 @@ pmap_remove_all(vm_page_t m) free_pv_entry(pv); } vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_unlock_queues(); } static void |