git: 68e3875b623b - main - vm_object: drop reverse walk from collect_flush

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Mon, 26 May 2025 03:05:46 UTC
The branch main has been updated by dougm:

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

commit 68e3875b623b56f83e276afe6ed5334545684ba2
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-05-26 03:02:37 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-05-26 03:02:37 +0000

    vm_object: drop reverse walk from collect_flush
    
    In vm_object_page_collect_flush, following a forward walk from page p
    seeking more pages to which vm_object_page_remove_write might be
    applied, a backward walk from page p is attempted. It never finds a
    page, and so this change removes that walk, and renames the function
    to better indicate its use for one specific application only.
    
    It never finds a page because collect_flush() is only called from one
    place, in vm_object_page_clean(). If there was a page p-1 to be found,
    then either it is less than tstart, or it would have been found in the
    previous iteration. If it less than tstart, then page_clean()
    shouldn't be messing with it. If it was found in the previous
    iteration, then vm_object_page_collect_flush() would have been called
    in that iteration, and page p would have been the first page in the
    forward walk from p-1, and it would have been processed then, and so p
    would not be passed to vm_object_page_collect_flush now.
    
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D50517
---
 sys/vm/vm_object.c | 69 ++++++++++++++++++++----------------------------------
 1 file changed, 26 insertions(+), 43 deletions(-)

diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index b885b3eda5c1..9b00aea9cdc8 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -110,9 +110,6 @@ static int old_msync;
 SYSCTL_INT(_vm, OID_AUTO, old_msync, CTLFLAG_RW, &old_msync, 0,
     "Use old (insecure) msync behavior");
 
-static int	vm_object_page_collect_flush(struct pctrie_iter *pages,
-		    vm_page_t p, int pagerflags, int flags, boolean_t *allclean,
-		    boolean_t *eio);
 static boolean_t vm_object_page_remove_write(vm_page_t p, int flags,
 		    boolean_t *allclean);
 static void	vm_object_backing_remove(vm_object_t object);
@@ -1001,6 +998,31 @@ vm_object_page_remove_write(vm_page_t p, int flags, boolean_t *allclean)
 	}
 }
 
+static int
+vm_object_page_clean_flush(struct pctrie_iter *pages, vm_page_t p,
+    int pagerflags, int flags, boolean_t *allclean, boolean_t *eio)
+{
+	vm_page_t ma[vm_pageout_page_count];
+	int count, runlen;
+
+	vm_page_lock_assert(p, MA_NOTOWNED);
+	vm_page_assert_xbusied(p);
+	ma[0] = p;
+	for (count = 1; count < vm_pageout_page_count; count++) {
+		p = vm_radix_iter_next(pages);
+		if (p == NULL || vm_page_tryxbusy(p) == 0)
+			break;
+		if (!vm_object_page_remove_write(p, flags, allclean)) {
+			vm_page_xunbusy(p);
+			break;
+		}
+		ma[count] = p;
+	}
+
+	vm_pageout_flush(ma, count, pagerflags, 0, &runlen, eio);
+	return (runlen);
+}
+
 /*
  *	vm_object_page_clean
  *
@@ -1073,7 +1095,7 @@ rescan:
 			continue;
 		}
 		if (object->type == OBJT_VNODE) {
-			n = vm_object_page_collect_flush(&pages, p, pagerflags,
+			n = vm_object_page_clean_flush(&pages, p, pagerflags,
 			    flags, &allclean, &eio);
 			pctrie_iter_reset(&pages);
 			if (eio) {
@@ -1120,45 +1142,6 @@ rescan:
 	return (res);
 }
 
-static int
-vm_object_page_collect_flush(struct pctrie_iter *pages, vm_page_t p,
-    int pagerflags, int flags, boolean_t *allclean, boolean_t *eio)
-{
-	vm_page_t ma[2 * vm_pageout_page_count - 1];
-	int base, count, runlen;
-
-	vm_page_lock_assert(p, MA_NOTOWNED);
-	vm_page_assert_xbusied(p);
-	base = nitems(ma) / 2;
-	ma[base] = p;
-	for (count = 1; count < vm_pageout_page_count; count++) {
-		p = vm_radix_iter_next(pages);
-		if (p == NULL || vm_page_tryxbusy(p) == 0)
-			break;
-		if (!vm_object_page_remove_write(p, flags, allclean)) {
-			vm_page_xunbusy(p);
-			break;
-		}
-		ma[base + count] = p;
-	}
-
-	pages->index = ma[base]->pindex;
-	for (; count < vm_pageout_page_count; count++) {
-		p = vm_radix_iter_prev(pages);
-		if (p == NULL || vm_page_tryxbusy(p) == 0)
-			break;
-		if (!vm_object_page_remove_write(p, flags, allclean)) {
-			vm_page_xunbusy(p);
-			break;
-		}
-		ma[--base] = p;
-	}
-
-	vm_pageout_flush(&ma[base], count, pagerflags, nitems(ma) / 2 - base,
-	    &runlen, eio);
-	return (runlen);
-}
-
 /*
  * Note that there is absolutely no sense in writing out
  * anonymous objects, so we track down the vnode object