git: 0b694568b0b5 - main - vm_object: use iterators in madvise()

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Sun, 20 Apr 2025 19:36:20 UTC
The branch main has been updated by dougm:

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

commit 0b694568b0b5d3cf76f56b119b3a378a47b44a1f
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-04-20 19:35:12 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-04-20 19:35:12 +0000

    vm_object: use iterators in madvise()
    
    Change vm_object_madvise() to use iterators rather than tailq
    pointers.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D49932
---
 sys/vm/vm_object.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index a1cd01d9fec6..2f2f77ff075c 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -1332,6 +1332,7 @@ void
 vm_object_madvise(vm_object_t object, vm_pindex_t pindex, vm_pindex_t end,
     int advice)
 {
+	struct pctrie_iter pages;
 	vm_pindex_t tpindex;
 	vm_object_t backing_object, tobject;
 	vm_page_t m, tm;
@@ -1339,13 +1340,15 @@ vm_object_madvise(vm_object_t object, vm_pindex_t pindex, vm_pindex_t end,
 	if (object == NULL)
 		return;
 
+	vm_page_iter_init(&pages, object);
 relookup:
 	VM_OBJECT_WLOCK(object);
 	if (!vm_object_advice_applies(object, advice)) {
 		VM_OBJECT_WUNLOCK(object);
 		return;
 	}
-	for (m = vm_page_find_least(object, pindex); pindex < end; pindex++) {
+	for (m = vm_radix_iter_lookup_ge(&pages, pindex); pindex < end;
+	    pindex++) {
 		tobject = object;
 
 		/*
@@ -1394,7 +1397,7 @@ relookup:
 		} else {
 next_page:
 			tm = m;
-			m = TAILQ_NEXT(m, listq);
+			m = vm_radix_iter_step(&pages);
 		}
 
 		/*
@@ -1420,6 +1423,7 @@ next_page:
 			}
 			if (!vm_page_busy_sleep(tm, "madvpo", 0))
 				VM_OBJECT_WUNLOCK(tobject);
+			pctrie_iter_reset(&pages);
   			goto relookup;
 		}
 		vm_page_advise(tm, advice);