git: 68e3875b623b - main - vm_object: drop reverse walk from collect_flush
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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