git: 296c174835cf - main - vnlru: avoid trigger calculation when force < 2

From: Ryan Libby <rlibby_at_FreeBSD.org>
Date: Tue, 19 May 2026 18:42:14 UTC
The branch main has been updated by rlibby:

URL: https://cgit.FreeBSD.org/src/commit/?id=296c174835cf603b966e48b232715942df9b6934

commit 296c174835cf603b966e48b232715942df9b6934
Author:     Ryan Libby <rlibby@FreeBSD.org>
AuthorDate: 2026-05-19 18:07:57 +0000
Commit:     Ryan Libby <rlibby@FreeBSD.org>
CommitDate: 2026-05-19 18:07:57 +0000

    vnlru: avoid trigger calculation when force < 2
    
    Reviewed by:    kib (previous version), olce
    Sponsored by:   Dell Inc.
    Differential Revision:  https://reviews.freebsd.org/D56950
---
 sys/kern/vfs_subr.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 54e883038046..848d3ac767f3 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1775,7 +1775,7 @@ SYSCTL_ULONG(_vfs_vnode_vnlru, OID_AUTO, uma_reclaim_calls, CTLFLAG_RD | CTLFLAG
 static void
 vnlru_proc(void)
 {
-	u_long rnumvnodes, rfreevnodes, target;
+	u_long rnumvnodes, target;
 	unsigned long onumvnodes;
 	int done, force, trigger, usevnodes;
 	bool reclaim_nc_src, want_reread;
@@ -1824,7 +1824,6 @@ vnlru_proc(void)
 			vnlru_proc_sleep();
 			continue;
 		}
-		rfreevnodes = vnlru_read_freevnodes();
 
 		onumvnodes = rnumvnodes;
 		/*
@@ -1833,14 +1832,7 @@ vnlru_proc(void)
 		 * The trigger point is to avoid recycling vnodes with lots
 		 * of resident pages.  We aren't trying to free memory; we
 		 * are trying to recycle or at least free vnodes.
-		 */
-		if (rnumvnodes <= desiredvnodes)
-			usevnodes = rnumvnodes - rfreevnodes;
-		else
-			usevnodes = rnumvnodes;
-		if (usevnodes <= 0)
-			usevnodes = 1;
-		/*
+		 *
 		 * The trigger value is chosen to give a conservatively
 		 * large value to ensure that it alone doesn't prevent
 		 * making progress.  The value can easily be so large that
@@ -1848,9 +1840,18 @@ vnlru_proc(void)
 		 * misconfigured cases, and this is necessary.  Normally
 		 * it is about 8 to 100 (pages), which is quite large.
 		 */
-		trigger = vm_cnt.v_page_count * 2 / usevnodes;
-		if (force < 2)
+		if (force < 2) {
 			trigger = vsmalltrigger;
+		} else {
+			if (rnumvnodes <= desiredvnodes)
+				usevnodes = rnumvnodes -
+				    vnlru_read_freevnodes();
+			else
+				usevnodes = rnumvnodes;
+			if (usevnodes <= 0)
+				usevnodes = 1;
+			trigger = vm_cnt.v_page_count * 2 / usevnodes;
+		}
 		reclaim_nc_src = force >= 3;
 		target = rnumvnodes * (int64_t)gapvnodes / imax(desiredvnodes, 1);
 		target = target / 10 + 1;