The branch main has been updated by dougm:

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

commit 68e3875b623b56f83e276afe6ed5334545684ba2
Author:     Doug Moore <do...@freebsd.org>
AuthorDate: 2025-05-26 03:02:37 +0000
Commit:     Doug Moore <do...@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

Reply via email to