vm_map: use page iterators in pmap_enter

Change vm_map_pmap_enter to use pctrie iterators to iterate over
pages, rather than using TAILQ links.

Reviewed by:	kib
Differential Revision:	https://reviews.freebsd.org/D49896
This commit is contained in:
Doug Moore 2025-04-18 18:37:49 -05:00
parent 1b5e2d7076
commit b3d89a0cde

View file

@ -89,6 +89,7 @@
#include <vm/vm_pageout.h>
#include <vm/vm_object.h>
#include <vm/vm_pager.h>
#include <vm/vm_radix.h>
#include <vm/vm_kern.h>
#include <vm/vm_extern.h>
#include <vm/vnode_pager.h>
@ -2674,6 +2675,7 @@ static void
vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags)
{
struct pctrie_iter pages;
vm_offset_t start;
vm_page_t p, p_start;
vm_pindex_t mask, psize, threshold, tmpidx;
@ -2706,19 +2708,14 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
p_start = NULL;
threshold = MAX_INIT_PT;
p = vm_page_find_least(object, pindex);
/*
* Assert: the variable p is either (1) the page with the
* least pindex greater than or equal to the parameter pindex
* or (2) NULL.
*/
for (;
p != NULL && (tmpidx = p->pindex - pindex) < psize;
p = TAILQ_NEXT(p, listq)) {
vm_page_iter_limit_init(&pages, object, pindex + psize);
for (p = vm_radix_iter_lookup_ge(&pages, pindex); p != NULL;
p = vm_radix_iter_jump(&pages, mask + 1)) {
/*
* don't allow an madvise to blow away our really
* free pages allocating pv entries.
*/
tmpidx = p->pindex - pindex;
if (((flags & MAP_PREFAULT_MADVISE) != 0 &&
vm_page_count_severe()) ||
((flags & MAP_PREFAULT_PARTIAL) != 0 &&
@ -2726,6 +2723,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
psize = tmpidx;
break;
}
mask = 0;
if (vm_page_all_valid(p)) {
if (p_start == NULL) {
start = addr + ptoa(tmpidx);
@ -2739,7 +2737,6 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
if (tmpidx + mask < psize &&
vm_page_ps_test(p, psind,
PS_ALL_VALID, NULL)) {
p += mask;
threshold += mask;
break;
}