From 1a1e9f41e50e17822654ac623365f06646d64abc Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sat, 1 Mar 2003 19:16:32 +0000 Subject: Teach vm_page_sleep_if_busy() to release the vm_object lock before sleeping. --- sys/vm/vm_page.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'sys/vm') diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index cbdcc4c6fc34..0f0ef50654ef 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -427,11 +427,20 @@ vm_page_free_zero(vm_page_t m) int vm_page_sleep_if_busy(vm_page_t m, int also_m_busy, const char *msg) { + int is_object_locked; mtx_assert(&vm_page_queue_mtx, MA_OWNED); if ((m->flags & PG_BUSY) || (also_m_busy && m->busy)) { vm_page_flag_set(m, PG_WANTED | PG_REFERENCED); + /* + * Remove mtx_owned() after vm_object locking is finished. + */ + if ((is_object_locked = m->object != NULL && + mtx_owned(&m->object->mtx))) + mtx_unlock(&m->object->mtx); msleep(m, &vm_page_queue_mtx, PDROP | PVM, msg, 0); + if (is_object_locked) + mtx_lock(&m->object->mtx); return (TRUE); } return (FALSE); -- cgit v1.2.3