The branch main has been updated by mjg:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=8733bc277a383cf59f38a83956f4f523869cfc90

commit 8733bc277a383cf59f38a83956f4f523869cfc90
Author:     Mateusz Guzik <m...@freebsd.org>
AuthorDate: 2023-09-14 16:13:01 +0000
Commit:     Mateusz Guzik <m...@freebsd.org>
CommitDate: 2023-10-10 12:49:04 +0000

    vfs: don't provoke recycling non-free vnodes without a good reason
    
    If the total number of free vnodes is at or above target, there is no
    point creating more of them.
    
    Tested by:      pho (in a bigger patch)
---
 sys/kern/vfs_subr.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 0251525a50c7..e37f8697efa2 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1802,11 +1802,19 @@ vn_alloc_hard(struct mount *mp)
                mtx_unlock(&vnode_list_mtx);
                goto alloc;
        }
-       rfreevnodes = vnlru_read_freevnodes();
-       if (vn_alloc_cyclecount++ >= rfreevnodes) {
-               vn_alloc_cyclecount = 0;
-               vstir = true;
+
+       if (vn_alloc_cyclecount != 0) {
+               rfreevnodes = vnlru_read_freevnodes();
+               if (rfreevnodes < wantfreevnodes) {
+                       if (vn_alloc_cyclecount++ >= rfreevnodes) {
+                               vn_alloc_cyclecount = 0;
+                               vstir = true;
+                       }
+               } else {
+                       vn_alloc_cyclecount = 0;
+               }
        }
+
        /*
         * Grow the vnode cache if it will not be above its target max
         * after growing.  Otherwise, if the free list is nonempty, try

Reply via email to