- Man page typos and a dead variable in pmap_extract_and_hold(). (alc)
- Make vm_page_drop() assert that VPRC_BLOCKED is not the last reference. (kib)
- Fix a race in vm_page_dequeue_deferred_free(). (pho)
- Fix a page leak in vm_page_reclaim_run().
The race is due to the fact that the queue index may change after we
load it and before we set PGA_DEQUEUE. This currently can happen if the
page daemon uses vm_page_swapqueue() to deactivate a page as it is being
freed. To fix this, use a vm_page_pqstate_cmpset() loop in
vm_page_dequeue_deferred_free(). This ensures that we submit the page
to the right batch queue. The PGA_DEQUEUE flag acts as a barrier in
that vm_page_swapqueue() and vm_page_dequeue_deferred() will not update
a page that has PGA_DEQUEUE set.
I noticed the page leak while reading code. Just free the newly
allocated page if we lost the race with a wiring. If the page is
unmapped, an earlier check guarantees that the page being replaced does
not carry any wirings.