grab, grab_pages, and grab_valid all have slightly different ZERO semantics. The next three patches resolve that. grab() did not set the page to valid if zero was passed in. Making this change allows me to simplify and improve the vm_page.c internal busy logic so there is less redundancy. I reviewed all callers. pmap uses it but does not care if the page is valid. Other grab users intentionally set the page valid after.
Making this change allows me to handle the zeroing and wiring in vm_page_grab_release() so it is identical to all implementations which are all using this convenience function. It simplifies the upgrade to and downgrade from exclusive so that we can zero and set valid.