vm_object: drop memq field

The memq field in vm_object is used to maintain a list of mapped
pages, sorted by pindex. Remove that field, and stop maintaining the
list.

Reviewed by:	alc, kib, markj
Differential Revision:	https://reviews.freebsd.org/D48007
This commit is contained in:
Doug Moore 2025-05-06 11:01:51 -05:00
parent 1ec2c8b2f3
commit c8d56817b8
3 changed files with 9 additions and 41 deletions

View file

@ -181,8 +181,6 @@ vm_object_zdtor(void *mem, int size, void *arg)
object = (vm_object_t)mem;
KASSERT(object->ref_count == 0,
("object %p ref_count = %d", object, object->ref_count));
KASSERT(TAILQ_EMPTY(&object->memq),
("object %p has resident pages in its memq", object));
KASSERT(vm_radix_is_empty(&object->rtree),
("object %p has resident pages in its trie", object));
#if VM_NRESERVLEVEL > 0
@ -236,7 +234,6 @@ _vm_object_allocate(objtype_t type, vm_pindex_t size, u_short flags,
vm_object_t object, void *handle)
{
TAILQ_INIT(&object->memq);
LIST_INIT(&object->shadow_head);
object->type = type;
@ -922,7 +919,6 @@ vm_object_terminate_pages(vm_object_t object)
vm_radix_reclaim_callback(&object->rtree,
vm_object_terminate_single_page, object);
TAILQ_INIT(&object->memq);
object->resident_page_count = 0;
if (object->type == OBJT_VNODE)
vdrop(object->handle);

View file

@ -98,7 +98,6 @@ struct vm_object {
TAILQ_ENTRY(vm_object) object_list; /* list of all objects */
LIST_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */
LIST_ENTRY(vm_object) shadow_list; /* chain of shadow objects */
struct pglist memq; /* list of resident pages */
struct vm_radix rtree; /* root of the resident page radix trie*/
vm_pindex_t size; /* Object size */
struct domainset_ref domain; /* NUMA policy. */

View file

@ -171,8 +171,7 @@ static void vm_page_enqueue(vm_page_t m, uint8_t queue);
static bool vm_page_free_prep(vm_page_t m);
static void vm_page_free_toq(vm_page_t m);
static void vm_page_init(void *dummy);
static void vm_page_insert_radixdone(vm_page_t m, vm_object_t object,
vm_page_t mpred);
static void vm_page_insert_radixdone(vm_page_t m, vm_object_t object);
static void vm_page_mvqueue(vm_page_t m, const uint8_t queue,
const uint16_t nflag);
static int vm_page_reclaim_run(int req_class, int domain, u_long npages,
@ -1470,11 +1469,11 @@ vm_page_dirty_KBI(vm_page_t m)
}
/*
* Insert the given page into the given object at the given pindex. mpred is
* used for memq linkage. From vm_page_insert, iter is false, mpred is
* initially NULL, and this procedure looks it up. From vm_page_iter_insert,
* iter is true and mpred is known to the caller to be valid, and may be NULL if
* this will be the page with the lowest pindex.
* Insert the given page into the given object at the given pindex. From
* vm_page_insert, iter is false, mpred is initially NULL, and this procedure
* looks it up. From vm_page_iter_insert, iter is true and mpred is known to
* the caller to be valid, and may be NULL if this will be the page with the
* lowest pindex.
*
* The procedure is marked __always_inline to suggest to the compiler to
* eliminate the lookup parameter and the associated alternate branch.
@ -1514,7 +1513,7 @@ vm_page_insert_lookup(vm_page_t m, vm_object_t object, vm_pindex_t pindex,
/*
* Now link into the object's ordered list of backed pages.
*/
vm_page_insert_radixdone(m, object, mpred);
vm_page_insert_radixdone(m, object);
vm_pager_page_inserted(object, m);
return (0);
}
@ -1563,7 +1562,7 @@ vm_page_iter_insert(struct pctrie_iter *pages, vm_page_t m, vm_object_t object,
* The object must be locked.
*/
static void
vm_page_insert_radixdone(vm_page_t m, vm_object_t object, vm_page_t mpred)
vm_page_insert_radixdone(vm_page_t m, vm_object_t object)
{
VM_OBJECT_ASSERT_WLOCKED(object);
@ -1571,24 +1570,6 @@ vm_page_insert_radixdone(vm_page_t m, vm_object_t object, vm_page_t mpred)
("vm_page_insert_radixdone: page %p has inconsistent object", m));
KASSERT((m->ref_count & VPRC_OBJREF) != 0,
("vm_page_insert_radixdone: page %p is missing object ref", m));
if (mpred != NULL) {
KASSERT(mpred->object == object,
("vm_page_insert_radixdone: object doesn't contain mpred"));
KASSERT(mpred->pindex < m->pindex,
("vm_page_insert_radixdone: mpred doesn't precede pindex"));
KASSERT(TAILQ_NEXT(mpred, listq) == NULL ||
m->pindex < TAILQ_NEXT(mpred, listq)->pindex,
("vm_page_insert_radixdone: pindex doesn't precede msucc"));
} else {
KASSERT(TAILQ_EMPTY(&object->memq) ||
m->pindex < TAILQ_FIRST(&object->memq)->pindex,
("vm_page_insert_radixdone: no mpred but not first page"));
}
if (mpred != NULL)
TAILQ_INSERT_AFTER(&object->memq, mpred, m, listq);
else
TAILQ_INSERT_HEAD(&object->memq, m, listq);
/*
* Show that the object has one more resident page.
@ -1636,11 +1617,6 @@ vm_page_remove_radixdone(vm_page_t m)
vm_pager_page_removed(object, m);
m->object = NULL;
/*
* Now remove from the object's list of backed pages.
*/
TAILQ_REMOVE(&object->memq, m, listq);
/*
* And show that the object has one fewer resident page.
*/
@ -1914,9 +1890,6 @@ vm_page_replace_hold(vm_page_t mnew, vm_object_t object, vm_pindex_t pindex,
(mnew->oflags & VPO_UNMANAGED),
("vm_page_replace: mismatched VPO_UNMANAGED"));
/* Keep the resident page list in sorted order. */
TAILQ_INSERT_AFTER(&object->memq, mold, mnew, listq);
TAILQ_REMOVE(&object->memq, mold, listq);
mold->object = NULL;
/*
@ -1996,7 +1969,7 @@ vm_page_iter_rename(struct pctrie_iter *old_pages, vm_page_t m,
m->pindex = new_pindex;
m->object = new_object;
vm_page_insert_radixdone(m, new_object, mpred);
vm_page_insert_radixdone(m, new_object);
if (vm_page_any_valid(m))
vm_page_dirty(m);
vm_pager_page_inserted(new_object, m);