svn commit: r356440 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Tue Jan 7 15:44:20 UTC 2020


Author: mjg
Date: Tue Jan  7 15:44:19 2020
New Revision: 356440
URL: https://svnweb.freebsd.org/changeset/base/356440

Log:
  vfs: trylock in vfs_msync and refactor the func
  
  - use LK_NOWAIT instead of calling VOP_ISLOCKED before deciding to lock
  - evaluate flags before looping over vnodes
  
  Reviewed by:	kib
  Tested by:	pho (in a larger patch, previous version)
  Differential Revision:	https://reviews.freebsd.org/D23035

Modified:
  head/sys/kern/vfs_subr.c

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c	Tue Jan  7 15:42:01 2020	(r356439)
+++ head/sys/kern/vfs_subr.c	Tue Jan  7 15:44:19 2020	(r356440)
@@ -4390,36 +4390,39 @@ vfs_msync(struct mount *mp, int flags)
 {
 	struct vnode *vp, *mvp;
 	struct vm_object *obj;
+	struct thread *td;
+	int lkflags, objflags;
 
 	CTR2(KTR_VFS, "%s: mp %p", __func__, mp);
 
 	if ((mp->mnt_kern_flag & MNTK_NOMSYNC) != 0)
 		return;
 
+	td = curthread;
+
+	lkflags = LK_EXCLUSIVE | LK_INTERLOCK;
+	if (flags != MNT_WAIT) {
+		lkflags |= LK_NOWAIT;
+		objflags = OBJPC_NOSYNC;
+	} else {
+		objflags = OBJPC_SYNC;
+	}
+
 	MNT_VNODE_FOREACH_ACTIVE(vp, mp, mvp) {
 		obj = vp->v_object;
-		if (obj != NULL && vm_object_mightbedirty(obj) &&
-		    (flags == MNT_WAIT || VOP_ISLOCKED(vp) == 0)) {
-			if (!vget(vp,
-			    LK_EXCLUSIVE | LK_RETRY | LK_INTERLOCK,
-			    curthread)) {
-				if (vp->v_vflag & VV_NOSYNC) {	/* unlinked */
-					vput(vp);
-					continue;
-				}
-
-				obj = vp->v_object;
-				if (obj != NULL) {
-					VM_OBJECT_WLOCK(obj);
-					vm_object_page_clean(obj, 0, 0,
-					    flags == MNT_WAIT ?
-					    OBJPC_SYNC : OBJPC_NOSYNC);
-					VM_OBJECT_WUNLOCK(obj);
-				}
-				vput(vp);
-			}
-		} else
+		if (obj == NULL || !vm_object_mightbedirty(obj)) {
 			VI_UNLOCK(vp);
+			continue;
+		}
+		if (vget(vp, lkflags, td) == 0) {
+			obj = vp->v_object;
+			if (obj != NULL && (vp->v_vflag & VV_NOSYNC) == 0) {
+				VM_OBJECT_WLOCK(obj);
+				vm_object_page_clean(obj, 0, 0, objflags);
+				VM_OBJECT_WUNLOCK(obj);
+			}
+			vput(vp);
+		}
 	}
 }
 


More information about the svn-src-head mailing list