Fix a page leak in vm_page_reclaim_run().
After r352110 the attempt to remove mappings of the page being replaced may fail if the page is wired. In this case we must free the replacement page. Reviewed by: alc, kib Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D21639
This commit is contained in:
parent
dcb49eef76
commit
b17d3089a7
@ -2596,17 +2596,24 @@ retry:
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* Unmap the page and check for new
|
||||
* wirings that may have been acquired
|
||||
* through a pmap lookup.
|
||||
*/
|
||||
if (object->ref_count != 0 &&
|
||||
!vm_page_try_remove_all(m)) {
|
||||
vm_page_free(m_new);
|
||||
error = EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace "m" with the new page. For
|
||||
* vm_page_replace(), "m" must be busy
|
||||
* and dequeued. Finally, change "m"
|
||||
* as if vm_page_free() was called.
|
||||
*/
|
||||
if (object->ref_count != 0 &&
|
||||
!vm_page_try_remove_all(m)) {
|
||||
error = EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
m_new->aflags = m->aflags &
|
||||
~PGA_QUEUE_STATE_MASK;
|
||||
KASSERT(m_new->oflags == VPO_UNMANAGED,
|
||||
|
Loading…
x
Reference in New Issue
Block a user