Date: Tue, 26 May 2009 20:14:52 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r192851 - user/kmacy/releng_7_2_fcs/sys/vm Message-ID: <200905262014.n4QKEqiC072383@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Tue May 26 20:14:52 2009 New Revision: 192851 URL: http://svn.freebsd.org/changeset/base/192851 Log: further addition of _locked routines to avoid recursion on the page queue mutex Modified: user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c Modified: user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c Tue May 26 20:13:17 2009 (r192850) +++ user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c Tue May 26 20:14:52 2009 (r192851) @@ -148,7 +148,9 @@ TUNABLE_INT("vm.boot_pages", &boot_pages SYSCTL_INT(_vm, OID_AUTO, boot_pages, CTLFLAG_RD, &boot_pages, 0, "number of pages allocated for bootstrapping the VM system"); -static void vm_page_enqueue(int queue, vm_page_t m); +static void _vm_page_enqueue(int queue, vm_page_t m, int locked); +static void _vm_page_free_toq(vm_page_t m, int locked); +static void _vm_pageq_remove(vm_page_t m, int locked); /* * vm_set_page_size: @@ -517,6 +519,14 @@ vm_page_free(vm_page_t m) vm_page_free_toq(m); } +void +vm_page_free_locked(vm_page_t m) +{ + + m->flags &= ~PG_ZERO; + _vm_page_free_toq(m, 1); +} + /* * vm_page_free_zero: * @@ -530,6 +540,14 @@ vm_page_free_zero(vm_page_t m) vm_page_free_toq(m); } +void +vm_page_free_zero_locked(vm_page_t m) +{ + + m->flags |= PG_ZERO; + _vm_page_free_toq(m, 1); +} + /* * vm_page_sleep: * @@ -1266,13 +1284,15 @@ vm_page_requeue(vm_page_t m) * The queue containing the given page must be locked. * This routine may not block. */ -void -vm_pageq_remove_locked(vm_page_t m) +static __inline void +_vm_pageq_remove(vm_page_t m, int locked) { int queue; struct vpgqueues *pq; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + if (locked == 0) + vm_page_lock_queues(); + queue = VM_PAGE_GETQUEUE(m); if (queue != PQ_NONE) { VM_PAGE_SETQUEUE2(m, PQ_NONE); @@ -1280,14 +1300,23 @@ vm_pageq_remove_locked(vm_page_t m) TAILQ_REMOVE(&pq->pl, m, pageq); (*pq->cnt)--; } + if (locked == 0) + vm_page_unlock_queues(); } + +void +vm_pageq_remove_locked(vm_page_t m) +{ + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + _vm_pageq_remove(m, 1); +} + void vm_pageq_remove(vm_page_t m) { mtx_assert(&vm_page_queue_mtx, MA_NOTOWNED); - vm_page_lock_queues(); - vm_pageq_remove_locked(m); - vm_page_unlock_queues(); + _vm_pageq_remove(m, 0); } /* @@ -1298,23 +1327,26 @@ vm_pageq_remove(vm_page_t m) * The page queues must be locked. */ static void -vm_page_enqueue_locked(int queue, vm_page_t m) +_vm_page_enqueue(int queue, vm_page_t m, int locked) { struct vpgqueues *vpq; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + if (locked == 0) { + mtx_assert(&vm_page_queue_mtx, MA_NOTOWNED); + vm_page_lock_queues(); + } +#ifdef INVARIANTS + /* avoid dangling else */ + else + mtx_assert(&vm_page_queue_mtx, MA_OWNED); +#endif + vpq = &vm_page_queues[queue]; VM_PAGE_SETQUEUE2(m, queue); TAILQ_INSERT_TAIL(&vpq->pl, m, pageq); ++*vpq->cnt; -} - -static void -vm_page_enqueue(int queue, vm_page_t m) -{ - vm_page_lock_queues(); - vm_page_enqueue_locked(queue, m); - vm_page_unlock_queues(); + if (locked == 0) + vm_page_unlock_queues(); } /* @@ -1338,7 +1370,7 @@ vm_page_activate_locked(vm_page_t m) if (m->wire_count == 0 && (m->flags & PG_UNMANAGED) == 0) { if (m->act_count < ACT_INIT) m->act_count = ACT_INIT; - vm_page_enqueue(PQ_ACTIVE, m); + _vm_page_enqueue(PQ_ACTIVE, m, 1); } } else { if (m->act_count < ACT_INIT) @@ -1399,8 +1431,8 @@ vm_page_free_wakeup(void) * This routine may not block. */ -void -vm_page_free_toq(vm_page_t m) +static void +_vm_page_free_toq(vm_page_t m, int locked) { PCPU_INC(cnt.v_tfree); @@ -1440,7 +1472,7 @@ vm_page_free_toq(vm_page_t m) * return, otherwise delay object association removal. */ if ((m->flags & PG_FICTITIOUS) != 0) { - vm_pageq_remove(m); + _vm_pageq_remove(m, locked); return; } @@ -1449,12 +1481,10 @@ vm_page_free_toq(vm_page_t m) if (m->hold_count != 0) { m->flags &= ~PG_ZERO; - vm_page_lock_queues(); - vm_pageq_remove_locked(m); - vm_page_enqueue_locked(PQ_HOLD, m); - vm_page_unlock_queues(); + _vm_pageq_remove(m, locked); + _vm_page_enqueue(PQ_HOLD, m, locked); } else { - vm_pageq_remove(m); + _vm_pageq_remove(m, locked); mtx_lock(&vm_page_queue_free_mtx); m->flags |= PG_FREE; cnt.v_free_count++; @@ -1473,6 +1503,20 @@ vm_page_free_toq(vm_page_t m) } } +void +vm_page_free_toq(vm_page_t m) +{ + + _vm_page_free_toq(m, 0); +} + +void +vm_page_free_toq_locked(vm_page_t m) +{ + + _vm_page_free_toq(m, 1); +} + /* * vm_page_wire: * @@ -1546,10 +1590,10 @@ vm_page_unwire(vm_page_t m, int activate if (m->flags & PG_UNMANAGED) { ; } else if (activate) - vm_page_enqueue(PQ_ACTIVE, m); + _vm_page_enqueue(PQ_ACTIVE, m, 0); else { vm_page_flag_clear(m, PG_WINATCFLS); - vm_page_enqueue(PQ_INACTIVE, m); + _vm_page_enqueue(PQ_INACTIVE, m, 0); } } } else { @@ -1694,10 +1738,7 @@ _vm_page_cache(vm_page_t m, int locked) /* * Remove the page from the paging queues. */ - if (locked) - vm_pageq_remove_locked(m); - else - vm_pageq_remove(m); + _vm_pageq_remove(m, locked); /* * Remove the page from the object's collection of resident * pages. Modified: user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h Tue May 26 20:13:17 2009 (r192850) +++ user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h Tue May 26 20:14:52 2009 (r192851) @@ -314,6 +314,8 @@ void vm_page_hold(vm_page_t mem); void vm_page_unhold(vm_page_t mem); void vm_page_free(vm_page_t m); void vm_page_free_zero(vm_page_t m); +void vm_page_free_locked(vm_page_t m); +void vm_page_free_zero_locked(vm_page_t m); void vm_page_dirty(vm_page_t m); void vm_page_wakeup(vm_page_t m); @@ -353,6 +355,7 @@ void vm_page_test_dirty (vm_page_t); int vm_page_bits (int, int); void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid); void vm_page_free_toq(vm_page_t m); +void vm_page_free_toq_locked(vm_page_t m); void vm_page_zero_idle_wakeup(void); void vm_page_cowfault (vm_page_t); int vm_page_cowsetup(vm_page_t); Modified: user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c Tue May 26 20:13:17 2009 (r192850) +++ user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c Tue May 26 20:14:52 2009 (r192851) @@ -870,7 +870,7 @@ rescan0: /* * Invalid pages can be easily freed */ - vm_page_free(m); + vm_page_free_locked(m); cnt.v_dfree++; --page_shortage; } else if (m->dirty == 0) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905262014.n4QKEqiC072383>