svn commit: r356671 - in head/sys/ufs: ffs ufs

Mateusz Guzik mjg at FreeBSD.org
Mon Jan 13 02:35:16 UTC 2020


Author: mjg
Date: Mon Jan 13 02:35:15 2020
New Revision: 356671
URL: https://svnweb.freebsd.org/changeset/base/356671

Log:
  ufs: use lazy list instead of active list for syncer
  
  Quota code is temporarily regressed to do a full vnode scan.
  
  Reviewed by:	jeff
  Tested by:	pho (in a larger patch, previous version)
  Differential Revision:	https://reviews.freebsd.org/D22996

Modified:
  head/sys/ufs/ffs/ffs_vfsops.c
  head/sys/ufs/ffs/ffs_vnops.c
  head/sys/ufs/ufs/inode.h
  head/sys/ufs/ufs/ufs_vnops.c

Modified: head/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vfsops.c	Mon Jan 13 02:34:02 2020	(r356670)
+++ head/sys/ufs/ffs/ffs_vfsops.c	Mon Jan 13 02:35:15 2020	(r356671)
@@ -1446,6 +1446,23 @@ sync_doupdate(struct inode *ip)
 	    IN_UPDATE)) != 0);
 }
 
+static int
+ffs_sync_lazy_filter(struct vnode *vp, void *arg __unused)
+{
+	struct inode *ip;
+
+	/*
+	 * Flags are safe to access because ->v_data invalidation
+	 * is held off by listmtx.
+	 */
+	if (vp->v_type == VNON)
+		return (false);
+	ip = VTOI(vp);
+	if (!sync_doupdate(ip) && (vp->v_iflag & VI_OWEINACT) == 0)
+		return (false);
+	return (true);
+}
+
 /*
  * For a lazy sync, we only care about access times, quotas and the
  * superblock.  Other filesystem changes are already converted to
@@ -1465,7 +1482,7 @@ ffs_sync_lazy(mp)
 	td = curthread;
 	if ((mp->mnt_flag & MNT_NOATIME) != 0)
 		goto qupdate;
-	MNT_VNODE_FOREACH_ACTIVE(vp, mp, mvp) {
+	MNT_VNODE_FOREACH_LAZY(vp, mp, mvp, ffs_sync_lazy_filter, NULL) {
 		if (vp->v_type == VNON) {
 			VI_UNLOCK(vp);
 			continue;

Modified: head/sys/ufs/ffs/ffs_vnops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vnops.c	Mon Jan 13 02:34:02 2020	(r356670)
+++ head/sys/ufs/ffs/ffs_vnops.c	Mon Jan 13 02:35:15 2020	(r356671)
@@ -113,6 +113,9 @@ static vop_fsync_t	ffs_fsync;
 static vop_getpages_t	ffs_getpages;
 static vop_getpages_async_t	ffs_getpages_async;
 static vop_lock1_t	ffs_lock;
+#ifdef INVARIANTS
+static vop_unlock_t	ffs_unlock_debug;
+#endif
 static vop_read_t	ffs_read;
 static vop_write_t	ffs_write;
 static int	ffs_extread(struct vnode *vp, struct uio *uio, int ioflag);
@@ -135,6 +138,9 @@ struct vop_vector ffs_vnodeops1 = {
 	.vop_getpages =		ffs_getpages,
 	.vop_getpages_async =	ffs_getpages_async,
 	.vop_lock1 =		ffs_lock,
+#ifdef INVARIANTS
+	.vop_unlock =		ffs_unlock_debug,
+#endif
 	.vop_read =		ffs_read,
 	.vop_reallocblks =	ffs_reallocblks,
 	.vop_write =		ffs_write,
@@ -147,6 +153,9 @@ struct vop_vector ffs_fifoops1 = {
 	.vop_fsync =		ffs_fsync,
 	.vop_fdatasync =	ffs_fdatasync,
 	.vop_lock1 =		ffs_lock,
+#ifdef INVARIANTS
+	.vop_unlock =		ffs_unlock_debug,
+#endif
 	.vop_vptofh =		ffs_vptofh,
 };
 VFS_VOP_VECTOR_REGISTER(ffs_fifoops1);
@@ -159,6 +168,9 @@ struct vop_vector ffs_vnodeops2 = {
 	.vop_getpages =		ffs_getpages,
 	.vop_getpages_async =	ffs_getpages_async,
 	.vop_lock1 =		ffs_lock,
+#ifdef INVARIANTS
+	.vop_unlock =		ffs_unlock_debug,
+#endif
 	.vop_read =		ffs_read,
 	.vop_reallocblks =	ffs_reallocblks,
 	.vop_write =		ffs_write,
@@ -177,6 +189,9 @@ struct vop_vector ffs_fifoops2 = {
 	.vop_fsync =		ffs_fsync,
 	.vop_fdatasync =	ffs_fdatasync,
 	.vop_lock1 =		ffs_lock,
+#ifdef INVARIANTS
+	.vop_unlock =		ffs_unlock_debug,
+#endif
 	.vop_reallocblks =	ffs_reallocblks,
 	.vop_strategy =		ffsext_strategy,
 	.vop_closeextattr =	ffs_closeextattr,
@@ -463,7 +478,27 @@ ffs_lock(ap)
 #endif
 }
 
+#ifdef INVARIANTS
 static int
+ffs_unlock_debug(struct vop_unlock_args *ap)
+{
+	struct vnode *vp = ap->a_vp;
+	struct inode *ip = VTOI(vp);
+
+	if (ip->i_flag & UFS_INODE_FLAG_LAZY_MASK) {
+		if ((vp->v_mflag & VMP_LAZYLIST) == 0) {
+			VI_LOCK(vp);
+			VNASSERT((vp->v_mflag & VMP_LAZYLIST), vp,
+			    ("%s: modified vnode (%x) not on lazy list",
+			    __func__, ip->i_flag));
+			VI_UNLOCK(vp);
+		}
+	}
+	return (VOP_UNLOCK_APV(&ufs_vnodeops, ap));
+}
+#endif
+
+static int
 ffs_read_hole(struct uio *uio, long xfersize, long *size)
 {
 	ssize_t saved_resid, tlen;
@@ -665,12 +700,8 @@ ffs_read(ap)
 		vfs_bio_brelse(bp, ioflag);
 
 	if ((error == 0 || uio->uio_resid != orig_resid) &&
-	    (vp->v_mount->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0 &&
-	    (ip->i_flag & IN_ACCESS) == 0) {
-		VI_LOCK(vp);
-		UFS_INODE_SET_FLAG(ip, IN_ACCESS);
-		VI_UNLOCK(vp);
-	}
+	    (vp->v_mount->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0)
+		UFS_INODE_SET_FLAG_SHARED(ip, IN_ACCESS);
 	return (error);
 }
 

Modified: head/sys/ufs/ufs/inode.h
==============================================================================
--- head/sys/ufs/ufs/inode.h	Mon Jan 13 02:34:02 2020	(r356670)
+++ head/sys/ufs/ufs/inode.h	Mon Jan 13 02:35:15 2020	(r356671)
@@ -138,11 +138,32 @@ struct inode {
 	"\14b12\13is_ufs2\12truncated\11ea_lockwait\10ea_locked" \
 	"\7lazyaccess\6lazymod\5needsync\4modified\3update\2change\1access"
 
+#define UFS_INODE_FLAG_LAZY_MASK	\
+	(IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE | IN_LAZYMOD | IN_LAZYACCESS)
+
 #define UFS_INODE_SET_FLAG(ip, flags) do {			\
 	struct inode *_ip = (ip);				\
+	struct vnode *_vp = ITOV(_ip);				\
 	int _flags = (flags);					\
 								\
 	_ip->i_flag |= _flags;					\
+	if (_flags & UFS_INODE_FLAG_LAZY_MASK)			\
+		vlazy(_vp);					\
+} while (0)
+
+#define UFS_INODE_SET_FLAG_SHARED(ip, flags) do {		\
+	struct inode *_ip = (ip);				\
+	struct vnode *_vp = ITOV(_ip);				\
+	int _flags = (flags);					\
+								\
+	ASSERT_VI_UNLOCKED(_vp, __func__);			\
+	if ((_ip->i_flag & (_flags)) != _flags) {		\
+		VI_LOCK(_vp);					\
+		_ip->i_flag |= _flags;				\
+		if (_flags & UFS_INODE_FLAG_LAZY_MASK)		\
+			vlazy(_vp);				\
+		VI_UNLOCK(_vp);					\
+	}							\
 } while (0)
 
 #define	i_dirhash i_un.dirhash

Modified: head/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- head/sys/ufs/ufs/ufs_vnops.c	Mon Jan 13 02:34:02 2020	(r356670)
+++ head/sys/ufs/ufs/ufs_vnops.c	Mon Jan 13 02:35:15 2020	(r356671)
@@ -686,12 +686,9 @@ ufs_markatime(ap)
 		struct vnode *a_vp;
 	} */ *ap;
 {
-	struct vnode *vp = ap->a_vp;
-	struct inode *ip = VTOI(vp);
+	struct inode *ip = VTOI(ap->a_vp);
 
-	VI_LOCK(vp);
-	UFS_INODE_SET_FLAG(ip, IN_ACCESS);
-	VI_UNLOCK(vp);
+	UFS_INODE_SET_FLAG_SHARED(ip, IN_ACCESS);
 	/*
 	 * XXXKIB No UFS_UPDATE(ap->a_vp, 0) there.
 	 */


More information about the svn-src-all mailing list