It seems like there are several more things you might want to do.
You probably should mirror the split freelists by creating
uvm.page_active[VM_NFREELIST], and also do the same thing for
fields like uvmexp.free.
Then, in uvm_pagealloc_strat(), I'm afraid the decision to wakeup
the pageout daemon now depends on the allocation strategy and the
state of the selected freelist; I'm not sure you can still make
that decision at the top of the routine...in any case it's a more
complex matter. Don't you want to clean the "low" priority (but more
critical) list if it's out?
In uvmpd_scan(), I think it needs to preferentially inactivate the
the low priority uvm.page_active[] list(s), and both inactive and
free targets may be needed, completely with logic to keep going
until all targets are met.
An alternative to all this is to inactivate and free pages from
the "low" priority list (the one you want most to have free frames)
by "cleaning" them a different way: by moving the data to a frame
allocated from the "high priority" list...which is the one you want
to keep busy. But that's questionable.
Finally, I would think page coloring should be at a similar priority
to this mod, yet the two interact and probably don't layer very
well. I don't suppose you would be interested in dealing with
this, too? (Hopefully yes!)
A page coloring mod would affect about the same code sections,
although interestingly enough it involves a "spread-spectrum" of
freelists based on the low order frame bits rather than the high
order ones. :-)