]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/commit
MFC of 291244, 291380, 291459, 291460, 291671, and 291743:
authormckusick <mckusick@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Wed, 30 Dec 2015 00:04:33 +0000 (00:04 +0000)
committermckusick <mckusick@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Wed, 30 Dec 2015 00:04:33 +0000 (00:04 +0000)
commit403aa9fb903769940452ea6a14091d32a0654e04
tree8a6bcc7410c1cb5e20d17be97443444022a0b8c1
parentff40742a21c93ed515b227040676dc4838a606fd
MFC of 291244, 291380, 291459, 291460, 291671, and 291743:

  This MFC includes changes to better manage the vnode freelist
  and to streamline the allocation and freeing of vnodes.

  Note that to maintain the KPI the VI_AGE flag is left defined
  in sys/vnode.h though its use is dropped as described in 291380.
  To maintain KBI the vfs.vlru_alloc_cache_src sysctl variable
  remains though it no longer has any effect as described in 291244.

MFC of 291244:
  Move the comment about resident pages preventing vnode from leaving
  active list, into the header comment for vdrop(), which is the
  function that decides whether to leave the vnode on the list.  Note
  that dirty page write-out in vinactive() is asynchronous.

  Discussed with: alc
  Sponsored by:   The FreeBSD Foundation

  MFC of 291380:
  Remove VI_AGE vnode iflag, it is unused.

  Noted by:       bde
  Sponsored by:   The FreeBSD Foundation

MFC of 291459:
  For performance reasons, it is useful to have a single string used as
  the name of a filesystem when setting it as the first parameter to the
  getnewvnode() function. Most filesystems call getnewvnode from just one
  place so can use a literal string as the first parameter. However, NFS
  calls getnewvnode from two places, so we create a global constant string
  that can be used by the two instances. This change also collapses two
  instances of getnewvnode() in the UFS filesystem to a single call.

  Reviewed by: kib
  Tested by:   Peter Holm

MFC of 291460:
  As the kernel allocates and frees vnodes, it fully initializes them
  on every allocation and fully releases them on every free.  These
  are not trivial costs: it starts by zeroing a large structure then
  initializes a mutex, a lock manager lock, an rw lock, four lists,
  and six pointers. And looking at vfs.vnodes_created, these operations
  are being done millions of times an hour on a busy machine.

  As a performance optimization, this code update uses the uma_init
  and uma_fini routines to do these initializations and cleanups only
  as the vnodes enter and leave the vnode_zone. With this change the
  initializations are only done kern.maxvnodes times at system startup
  and then only rarely again. The frees are done only if the vnode_zone
  shrinks which never happens in practice. For those curious about the
  avoided work, look at the vnode_init() and vnode_fini() functions in
  kern/vfs_subr.c to see the code that has been removed from the main
  vnode allocation/free path.

  Reviewed by: kib
  Tested by:   Peter Holm

MFC of 291671:
  We need to zero out the union of pointers in a freed vnode structure.

  Fix from:  Mateusz Guzik
  Tested by: Jason Unovitch

MFC of 291743:
  We need to zero out the clustering variables in a freed vnode structure.
  For completeness add a VNASSERT that there are no threads waiting on a
  range lock (this was previously checked on every vnode free).

  Reported by; Rick Macklem
  Fix from:    Mateusz Guzik

git-svn-id: svn://svn.freebsd.org/base/stable/10@292895 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
sys/fs/nfs/nfsport.h
sys/fs/nfsclient/nfs_clnode.c
sys/fs/nfsclient/nfs_clport.c
sys/kern/vfs_subr.c
sys/ufs/ffs/ffs_vfsops.c