git: kernel - vnode recycling, intermediate fix

Matthew Dillon dillon at crater.dragonflybsd.org
Sat Apr 30 11:34:05 PDT 2022


commit 8938f217e037b576c2591c78bcb2096b11c9c6bf
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date:   Fri Apr 29 16:46:09 2022 -0700

    kernel - vnode recycling, intermediate fix
    
    * Fix a condition where vnlru (the vnode recycler) can live-
      lock on unsuitable vnodes in the inactive list and stop
      making progress, causing the system to block.
    
      First, don't deactivate vnodes which the inactive scan won't
      recycle.  Vnodes which are in the namecache topology but not
      at a leaf won't be recycled by the vnlru thread.  Leave these
      vnodes on the active queue.  This prevents the inactive queue
      from filling up with vnodes that it can't recycle.
    
      Second, the active scan in vnlru() will now call
      cache_inval_vp_quick() to attempt to make a vnode presentable
      so it can be deactivated.  The inactive scan also does the same
      thing, because some leakage can happen anyway.
    
    * The active scan should be able to make continuous progress
      as successful cache_inval_vp_quick() calls make more and more
      vnodes presentable that might have previously been internal nodes
      in the namecache topology.  So the active scan should be able to
      achieve the desired balance between the active and inactive queue.
    
    * This should also improve performance when constant recycling
      is happening by moving more of the work to the active->inactive
      transition and doing less work in the inactive->free
      transition
    
    * Add cache_inval_vp_quick(), a function which attempts to trivially
      disassociate a vnode from the namecache topology and will handle
      any direct children if the vnode is not at a leaf (but not recursively
      on its own).  The definition of 'trivially' for the children are
      namecache records that can be locked non-blocking, have no additional
      refs, and do not record a vnode.
    
    * Cleanup cache_unlink_parent().  Have cache_zap() use this
      function instead of rerolling the same code.  The cache_rename()
      code winds up being slightly more complex.  And now
      cache_inval_vp_quick() can use the function too.

Summary of changes:
 sys/kern/vfs_cache.c | 258 ++++++++++++++++++++++++++++++++-------------------
 sys/kern/vfs_lock.c  |  81 ++++++++++++++--
 sys/kern/vfs_mount.c |   2 +-
 sys/sys/namecache.h  |   1 +
 4 files changed, 240 insertions(+), 102 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/8938f217e037b576c2591c78bcb2096b11c9c6bf


-- 
DragonFly BSD source repository


More information about the Commits mailing list