1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-14 10:09:48 +00:00

Teach vm_page_sleep_if_busy() to release the vm_object lock before sleeping.

This commit is contained in:
Alan Cox 2003-03-01 19:16:32 +00:00
parent 49ff556b75
commit 1a1e9f41e5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=111712

View File

@ -427,11 +427,20 @@ vm_page_free_zero(vm_page_t m)
int int
vm_page_sleep_if_busy(vm_page_t m, int also_m_busy, const char *msg) 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); mtx_assert(&vm_page_queue_mtx, MA_OWNED);
if ((m->flags & PG_BUSY) || (also_m_busy && m->busy)) { if ((m->flags & PG_BUSY) || (also_m_busy && m->busy)) {
vm_page_flag_set(m, PG_WANTED | PG_REFERENCED); 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); msleep(m, &vm_page_queue_mtx, PDROP | PVM, msg, 0);
if (is_object_locked)
mtx_lock(&m->object->mtx);
return (TRUE); return (TRUE);
} }
return (FALSE); return (FALSE);