These two fields encode the "queue state" of a page. The page lock is
required to set `PGA_{DEQUEUE,REQUEUE,REQUEUE_HEAD}`, and the page queue
lock corresponding to the "queue" field's value is required to clear
them. The page queue lock is also required when modifying the "queue"
field or setting and clearing `PGA_ENQUEUED`.
My goal is to support freeing pages without the page lock. However,
`vm_page_free_prep()` must set `PGA_DEQUEUE` in
`vm_page_dequeue_deferred_free()`. Since the page is being freed, the
scope of possible races is limited to the page daemon scanning the page.
Introduce a new function, `vm_page_aflag_queue_cmpset()`, which atomically
updates both fields containing queue state. It relies on "aflags" and
"queue" being in the same self-aligned 32-bit word. This primitive is
used by the page daemon in `vm_page_swapqueue()` and
`vm_page_dequeue_deferred()`. It allows the page daemon to avoid
modifying queue state after `vm_page_dequeue_deferred_free()` has already
set `PGA_DEQUEUE`. Once the page daemon has acquire the object lock, it
has a stable reference to the page and no longer needs to handle races, so the
only modifications to the page queue scans occur in places where the object
lock is not held. `vm_pageout_reinsert_inactive_page()` does not require
modification since it takes the page queue lock and is thus serialized with
the `vm_page_dequeue()` calls in the page allocator functions.