svn commit: r322721 - in head/sys: kern sys

Konstantin Belousov kib at FreeBSD.org
Sun Aug 20 10:07:47 UTC 2017


Author: kib
Date: Sun Aug 20 10:07:45 2017
New Revision: 322721
URL: https://svnweb.freebsd.org/changeset/base/322721

Log:
  Allow vinvalbuf() to operate with the shared vnode lock.
  
  This mode allows other clean buffers to arrive while we flush the buf
  lists for the vnode, which is fine for the targeted use.  We only need
  that all buffers existed at the time of the function start were
  flushed.  In fact, only one assert has to be relaxed.
  
  In collaboration with:	pho
  Reviewed by:	rmacklem
  Sponsored by:	The FreeBSD Foundation
  MFC after:	2 weeks
  X-Differential revision:	https://reviews.freebsd.org/D12083

Modified:
  head/sys/kern/vfs_subr.c
  head/sys/sys/vnode.h

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c	Sun Aug 20 09:52:25 2017	(r322720)
+++ head/sys/kern/vfs_subr.c	Sun Aug 20 10:07:45 2017	(r322721)
@@ -1698,9 +1698,13 @@ bufobj_invalbuf(struct bufobj *bo, int flags, int slpf
 
 #ifdef INVARIANTS
 	BO_LOCK(bo);
-	if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO)) == 0 &&
-	    (bo->bo_dirty.bv_cnt > 0 || bo->bo_clean.bv_cnt > 0))
+	if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO |
+	    V_ALLOWCLEAN)) == 0 && (bo->bo_dirty.bv_cnt > 0 ||
+	    bo->bo_clean.bv_cnt > 0))
 		panic("vinvalbuf: flush failed");
+	if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO)) == 0 &&
+	    bo->bo_dirty.bv_cnt > 0)
+		panic("vinvalbuf: flush dirty failed");
 	BO_UNLOCK(bo);
 #endif
 	return (0);

Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h	Sun Aug 20 09:52:25 2017	(r322720)
+++ head/sys/sys/vnode.h	Sun Aug 20 10:07:45 2017	(r322721)
@@ -399,6 +399,7 @@ extern int		vttoif_tab[];
 #define	V_NORMAL	0x0004	/* vinvalbuf: invalidate only regular bufs */
 #define	V_CLEANONLY	0x0008	/* vinvalbuf: invalidate only clean bufs */
 #define	V_VMIO		0x0010	/* vinvalbuf: called during pageout */
+#define	V_ALLOWCLEAN	0x0020	/* vinvalbuf: allow clean buffers after flush */
 #define	REVOKEALL	0x0001	/* vop_revoke: revoke all aliases */
 #define	V_WAIT		0x0001	/* vn_start_write: sleep for suspend */
 #define	V_NOWAIT	0x0002	/* vn_start_write: don't sleep for suspend */


More information about the svn-src-all mailing list