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