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:
parent
49ff556b75
commit
1a1e9f41e5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=111712
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user