Without this change, UMA uses a strict implementation of first-touch: if
the local domain does not have any free pages, UMA will either return
failure or sleep even if other domains have plenty of free pages.
The implementation came from before we had cross-domain frees, and the
first-touch policy was only used for the bucket zones (for which
allocations are always M_NOWAIT). Now it makes more sense to permit UMA
to allocate from other domains if necessary to make progress.
The change modifies the keg's domainset_ref to always point to the
correct policy, and modifies keg_fetch_slab() to simply iterate using
the keg's domainset reference.
N.B.: a lot of the complexity in keg_fetch_slab() came from wanting to
ensure that the per-keg domain iterator is updated atomically. However,
this was broken by commit 8b987a77691da95f and I don't see a nice way to
fix it. We don't have a global keg lock anymore. We could perhaps add
an iterator type that works atomically, or add a per-CPU array of
domainset refs and bracket updates to the iterator with critical
enter/exit.