git: b3d89a0cde94 - main - vm_map: use page iterators in pmap_enter

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Fri, 18 Apr 2025 23:38:56 UTC
The branch main has been updated by dougm:

URL: https://cgit.FreeBSD.org/src/commit/?id=b3d89a0cde94b22ce1b4ca620b77986291137132

commit b3d89a0cde94b22ce1b4ca620b77986291137132
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-04-18 23:37:49 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-04-18 23:37:49 +0000

    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
---
 sys/vm/vm_map.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 564ef59950e4..0371680f6df5 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -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;
 					}