From owner-svn-src-all@freebsd.org Mon Jan 13 02:35:16 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 4D4351F324F; Mon, 13 Jan 2020 02:35:16 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 47wyP01Ndtz3MV7; Mon, 13 Jan 2020 02:35:16 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 2AA7525858; Mon, 13 Jan 2020 02:35:16 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 00D2ZGqZ027398; Mon, 13 Jan 2020 02:35:16 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 00D2ZFq0027393; Mon, 13 Jan 2020 02:35:15 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202001130235.00D2ZFq0027393@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Mon, 13 Jan 2020 02:35:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r356671 - in head/sys/ufs: ffs ufs X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: in head/sys/ufs: ffs ufs X-SVN-Commit-Revision: 356671 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jan 2020 02:35:16 -0000 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. */