This patch adds two new flags, VM_ALLOC_NOCREAT & VM_ALLOC_VALID, so that we can move more consumers to grab() and eliminate hand-rolled loops with sensitive synchronization.
NOCREAT does the lookup/busy/wire in a loop but fails if it has to allocate a page.
VALID only returns existing valid pages.
There are other callers which can be refactored into this paradigm later.
The second part of the patch implements vm_page_busy_acquire() which does a looping busy acquire so callers are not coding their own sleep_if_busy() loops or blindly calling vm_page_xbusy() and expecting it to succeed.