Author: mjg
Date: Tue Oct 27 18:13:09 2020
New Revision: 367090
URL: https://svnweb.freebsd.org/changeset/base/367090

Log:
  vfs: tidy up vnlru_free
  
  Apart from cosmeatic changes make sure to only decrease the recycled counter
  if vtryrecycle succeeded.
  
  Tested by:    pho

Modified:
  head/sys/kern/vfs_subr.c

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c    Tue Oct 27 18:12:07 2020        (r367089)
+++ head/sys/kern/vfs_subr.c    Tue Oct 27 18:13:09 2020        (r367090)
@@ -1226,9 +1226,11 @@ vnlru_free_locked(int count, struct vfsops *mnt_op)
                count = max_vnlru_free;
        ocount = count;
        mvp = vnode_list_free_marker;
-restart:
        vp = mvp;
-       while (count > 0) {
+       for (;;) {
+               if (count == 0) {
+                       break;
+               }
                vp = TAILQ_NEXT(vp, v_vnodelist);
                if (__predict_false(vp == NULL)) {
                        TAILQ_REMOVE(&vnode_list, mvp, v_vnodelist);
@@ -1237,17 +1239,16 @@ restart:
                }
                if (__predict_false(vp->v_type == VMARKER))
                        continue;
-
+               if (vp->v_holdcnt > 0)
+                       continue;
                /*
                 * Don't recycle if our vnode is from different type
                 * of mount point.  Note that mp is type-safe, the
                 * check does not reach unmapped address even if
                 * vnode is reclaimed.
-                * Don't recycle if we can't get the interlock without
-                * blocking.
                 */
-               if (vp->v_holdcnt > 0 || (mnt_op != NULL && (mp = vp->v_mount) 
!= NULL &&
-                   mp->mnt_op != mnt_op)) {
+               if (mnt_op != NULL && (mp = vp->v_mount) != NULL &&
+                   mp->mnt_op != mnt_op) {
                        continue;
                }
                if (__predict_false(vp->v_type == VBAD || vp->v_type == VNON)) {
@@ -1257,11 +1258,11 @@ restart:
                        continue;
                TAILQ_REMOVE(&vnode_list, mvp, v_vnodelist);
                TAILQ_INSERT_AFTER(&vnode_list, vp, mvp, v_vnodelist);
-               count--;
                mtx_unlock(&vnode_list_mtx);
-               vtryrecycle(vp);
+               if (vtryrecycle(vp) == 0)
+                       count--;
                mtx_lock(&vnode_list_mtx);
-               goto restart;
+               vp = mvp;
        }
        return (ocount - count);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to