Remove from vm_page_object_remove the responsibility for removing a page from its radix tree, and pass that responsibility on to its callers.
For one of those callers, vm_page_rename, pass the responsibility along to its two callers.
For each of them, vm_object_split and vm_object_collapse_scan, use a pctrie_iter to walk over the pages of the object, and use vm_radix_iter_remove to remove the page from the object tree without searching for its location.
Define a method vm_page_remove_free that does "if (remove) free" without affecting the radix tree. Use it in the two functions above.
Rewrite vm_object_page_remove to use iterators, and use vm_page_remove_free, instead of vm_page_free.
Because vm_radix_iter_remove isn't defined yet, define it in vm_radix.h.
Because this code modifies the pindex of a page while it's in one tree, and inserts it into another, before removing it from the first, relax the conditions in pctrie_iter_remove so that the leaf removed doesn't have to match the index associated with the iterator.