Index: sys/vm/vm_object.c =================================================================== --- sys/vm/vm_object.c +++ sys/vm/vm_object.c @@ -1604,8 +1604,9 @@ continue; } - /* vm_page_rename() will dirty the page. */ - if (vm_page_rename(&pages, new_object, m->pindex - offidxstart)) { + /* vm_page_iter_rename() will dirty the page. */ + if (!vm_page_iter_rename(&pages, m, new_object, m->pindex - + offidxstart)) { vm_page_xunbusy(m); VM_OBJECT_WUNLOCK(new_object); VM_OBJECT_WUNLOCK(orig_object); @@ -1791,7 +1792,7 @@ * If the page was mapped to a process, it can remain mapped * through the rename. vm_page_rename() will dirty the page. */ - if (vm_page_rename(&pages, object, new_pindex)) { + if (!vm_page_iter_rename(&pages, p, object, new_pindex)) { vm_page_xunbusy(p); next = vm_object_collapse_scan_wait(&pages, object, NULL); Index: sys/vm/vm_page.h =================================================================== --- sys/vm/vm_page.h +++ sys/vm/vm_page.h @@ -655,6 +655,8 @@ void vm_page_iter_limit_init(struct pctrie_iter *, vm_object_t, vm_pindex_t); vm_page_t vm_page_iter_lookup(struct pctrie_iter *, vm_pindex_t); bool vm_page_iter_remove(struct pctrie_iter *pages); +bool vm_page_iter_rename(struct pctrie_iter *old_pages, vm_page_t m, + vm_object_t new_object, vm_pindex_t new_pindex); void vm_page_launder(vm_page_t m); vm_page_t vm_page_lookup(vm_object_t, vm_pindex_t); vm_page_t vm_page_lookup_unlocked(vm_object_t, vm_pindex_t); @@ -682,7 +684,6 @@ vm_page_t vm_page_relookup(vm_object_t, vm_pindex_t); bool vm_page_remove(vm_page_t); bool vm_page_remove_xbusy(vm_page_t); -int vm_page_rename(struct pctrie_iter *, vm_object_t, vm_pindex_t); void vm_page_replace(vm_page_t mnew, vm_object_t object, vm_pindex_t pindex, vm_page_t mold); int vm_page_sbusied(vm_page_t m); Index: sys/vm/vm_page.c =================================================================== --- sys/vm/vm_page.c +++ sys/vm/vm_page.c @@ -2065,10 +2065,11 @@ } /* - * vm_page_rename: + * vm_page_iter_rename: * - * Move the current page, as identified by iterator, from its current - * object to the specified target object/offset. + * Tries to move the specified page from its current object to a new object + * and pindex, using the given iterator to remove the page from its current + * object. Returns true if the move is successful, and false otherwise. * * Note: swap associated with the page must be invalidated by the move. We * have to do this for several reasons: (1) we aren't freeing the @@ -2082,18 +2083,17 @@ * * The objects must be locked. */ -int -vm_page_rename(struct pctrie_iter *pages, +bool +vm_page_iter_rename(struct pctrie_iter *old_pages, vm_page_t m, vm_object_t new_object, vm_pindex_t new_pindex) { - vm_page_t m, mpred; + vm_page_t mpred; vm_pindex_t opidx; + KASSERT(m->ref_count != 0, ("%s: page %p has no refs", __func__, m)); + VM_OBJECT_ASSERT_WLOCKED(m->object); VM_OBJECT_ASSERT_WLOCKED(new_object); - m = vm_radix_iter_page(pages); - KASSERT(m->ref_count != 0, ("vm_page_rename: page %p has no refs", m)); - /* * Create a custom version of vm_page_insert() which does not depend * by m_prev and can cheat on the implementation aspects of the @@ -2103,7 +2103,7 @@ m->pindex = new_pindex; if (vm_radix_insert_lookup_lt(&new_object->rtree, m, &mpred) != 0) { m->pindex = opidx; - return (1); + return (false); } /* @@ -2111,7 +2111,7 @@ * the listq iterator is tainted. */ m->pindex = opidx; - vm_radix_iter_remove(pages); + vm_radix_iter_remove(old_pages); vm_page_remove_radixdone(m); /* Return back to the new pindex to complete vm_page_insert(). */ @@ -2121,7 +2121,7 @@ vm_page_insert_radixdone(m, new_object, mpred); vm_page_dirty(m); vm_pager_page_inserted(new_object, m); - return (0); + return (true); } /*