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
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user