Module Name: src Committed By: ad Date: Sun Dec 22 19:47:35 UTC 2019
Modified Files: src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_ctldir.c src/sys/kern: vfs_mount.c vfs_subr.c vfs_syscalls.c src/sys/miscfs/genfs: genfs_vfsops.c src/sys/nfs: nfs_export.c src/sys/sys: mount.h vnode.h vnode_impl.h src/sys/ufs/lfs: ulfs_vfsops.c src/sys/ufs/ufs: ufs_vfsops.c ufs_wapbl.c Log Message: Make mntvnode_lock per-mount, and address false sharing of struct mount. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 \ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c cvs rdiff -u -r1.72 -r1.73 src/sys/kern/vfs_mount.c cvs rdiff -u -r1.477 -r1.478 src/sys/kern/vfs_subr.c cvs rdiff -u -r1.537 -r1.538 src/sys/kern/vfs_syscalls.c cvs rdiff -u -r1.9 -r1.10 src/sys/miscfs/genfs/genfs_vfsops.c cvs rdiff -u -r1.60 -r1.61 src/sys/nfs/nfs_export.c cvs rdiff -u -r1.234 -r1.235 src/sys/sys/mount.h cvs rdiff -u -r1.285 -r1.286 src/sys/sys/vnode.h cvs rdiff -u -r1.18 -r1.19 src/sys/sys/vnode_impl.h cvs rdiff -u -r1.14 -r1.15 src/sys/ufs/lfs/ulfs_vfsops.c cvs rdiff -u -r1.57 -r1.58 src/sys/ufs/ufs/ufs_vfsops.c cvs rdiff -u -r1.24 -r1.25 src/sys/ufs/ufs/ufs_wapbl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.9 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.10 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.9 Mon Mar 18 09:22:14 2019 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c Sun Dec 22 19:47:34 2019 @@ -1329,7 +1329,7 @@ sfs_snapshot_mount(vnode_t *vp, const ch vfsp->mnt_stat.f_owner = 0; vfsp->mnt_flag = MNT_RDONLY | MNT_NOSUID | MNT_IGNORE; - mutex_enter(&vfsp->mnt_updating); + mutex_enter(vfsp->mnt_updating); error = zfs_domount(vfsp, osname); if (error) @@ -1349,12 +1349,12 @@ sfs_snapshot_mount(vnode_t *vp, const ch vref(vp); vp->v_mountedhere = vfsp; - mutex_exit(&vfsp->mnt_updating); + mutex_exit(vfsp->mnt_updating); (void) VFS_STATVFS(vfsp, &vfsp->mnt_stat); out:; if (error && vfsp) { - mutex_exit(&vfsp->mnt_updating); + mutex_exit(vfsp->mnt_updating); vfs_rele(vfsp); } PNBUF_PUT(osname); Index: src/sys/kern/vfs_mount.c diff -u src/sys/kern/vfs_mount.c:1.72 src/sys/kern/vfs_mount.c:1.73 --- src/sys/kern/vfs_mount.c:1.72 Sat Nov 16 10:07:53 2019 +++ src/sys/kern/vfs_mount.c Sun Dec 22 19:47:34 2019 @@ -1,7 +1,7 @@ -/* $NetBSD: vfs_mount.c,v 1.72 2019/11/16 10:07:53 maxv Exp $ */ +/* $NetBSD: vfs_mount.c,v 1.73 2019/12/22 19:47:34 ad Exp $ */ /*- - * Copyright (c) 1997-2011 The NetBSD Foundation, Inc. + * Copyright (c) 1997-2019 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.72 2019/11/16 10:07:53 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.73 2019/12/22 19:47:34 ad Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -116,17 +116,16 @@ vnode_t * rootvnode; /* Mounted filesystem list. */ static TAILQ_HEAD(mountlist, mountlist_entry) mountlist; -static kmutex_t mountlist_lock; +static kmutex_t mountlist_lock __cacheline_aligned; int vnode_offset_next_by_lru /* XXX: ugly hack for pstat.c */ = offsetof(vnode_impl_t, vi_lrulist.tqe_next); -kmutex_t mntvnode_lock; -kmutex_t vfs_list_lock; +kmutex_t vfs_list_lock __cacheline_aligned; static specificdata_domain_t mount_specificdata_domain; static kmutex_t mntid_lock; -static kmutex_t mountgen_lock; +static kmutex_t mountgen_lock __cacheline_aligned; static uint64_t mountgen; void @@ -135,7 +134,6 @@ vfs_mount_sysinit(void) TAILQ_INIT(&mountlist); mutex_init(&mountlist_lock, MUTEX_DEFAULT, IPL_NONE); - mutex_init(&mntvnode_lock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&vfs_list_lock, MUTEX_DEFAULT, IPL_NONE); mount_specificdata_domain = specificdata_domain_create(); @@ -154,8 +152,9 @@ vfs_mountalloc(struct vfsops *vfsops, vn mp->mnt_op = vfsops; mp->mnt_refcnt = 1; TAILQ_INIT(&mp->mnt_vnodelist); - mutex_init(&mp->mnt_renamelock, MUTEX_DEFAULT, IPL_NONE); - mutex_init(&mp->mnt_updating, MUTEX_DEFAULT, IPL_NONE); + mp->mnt_renamelock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE); + mp->mnt_vnodelock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE); + mp->mnt_updating = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE); mp->mnt_vnodecovered = vp; mount_initspecific(mp); @@ -292,8 +291,9 @@ vfs_rele(struct mount *mp) */ KASSERT(mp->mnt_refcnt == 0); specificdata_fini(mount_specificdata_domain, &mp->mnt_specdataref); - mutex_destroy(&mp->mnt_updating); - mutex_destroy(&mp->mnt_renamelock); + mutex_obj_free(mp->mnt_updating); + mutex_obj_free(mp->mnt_renamelock); + mutex_obj_free(mp->mnt_vnodelock); if (mp->mnt_op != NULL) { vfs_delref(mp->mnt_op); } @@ -378,10 +378,10 @@ vfs_vnode_iterator_init(struct mount *mp vp = vnalloc_marker(mp); vip = VNODE_TO_VIMPL(vp); - mutex_enter(&mntvnode_lock); + mutex_enter(mp->mnt_vnodelock); TAILQ_INSERT_HEAD(&mp->mnt_vnodelist, vip, vi_mntvnodes); vp->v_usecount = 1; - mutex_exit(&mntvnode_lock); + mutex_exit(mp->mnt_vnodelock); *vnip = (struct vnode_iterator *)vip; } @@ -391,14 +391,16 @@ vfs_vnode_iterator_destroy(struct vnode_ { vnode_impl_t *mvip = &vni->vi_vnode; vnode_t *mvp = VIMPL_TO_VNODE(mvip); + kmutex_t *lock; - mutex_enter(&mntvnode_lock); KASSERT(vnis_marker(mvp)); if (mvp->v_usecount != 0) { + lock = mvp->v_mount->mnt_vnodelock; + mutex_enter(lock); TAILQ_REMOVE(&mvp->v_mount->mnt_vnodelist, mvip, vi_mntvnodes); mvp->v_usecount = 0; + mutex_exit(lock); } - mutex_exit(&mntvnode_lock); vnfree_marker(mvp); } @@ -410,18 +412,20 @@ vfs_vnode_iterator_next1(struct vnode_it struct mount *mp = VIMPL_TO_VNODE(mvip)->v_mount; vnode_t *vp; vnode_impl_t *vip; + kmutex_t *lock; int error; KASSERT(vnis_marker(VIMPL_TO_VNODE(mvip))); + lock = mp->mnt_vnodelock; do { - mutex_enter(&mntvnode_lock); + mutex_enter(lock); vip = TAILQ_NEXT(mvip, vi_mntvnodes); TAILQ_REMOVE(&mp->mnt_vnodelist, mvip, vi_mntvnodes); VIMPL_TO_VNODE(mvip)->v_usecount = 0; again: if (vip == NULL) { - mutex_exit(&mntvnode_lock); + mutex_exit(lock); return NULL; } vp = VIMPL_TO_VNODE(vip); @@ -437,7 +441,7 @@ again: TAILQ_INSERT_AFTER(&mp->mnt_vnodelist, vip, mvip, vi_mntvnodes); VIMPL_TO_VNODE(mvip)->v_usecount = 1; - mutex_exit(&mntvnode_lock); + mutex_exit(lock); error = vcache_vget(vp); KASSERT(error == 0 || error == ENOENT); } while (error != 0); @@ -461,24 +465,32 @@ vfs_insmntque(vnode_t *vp, struct mount { vnode_impl_t *vip = VNODE_TO_VIMPL(vp); struct mount *omp; + kmutex_t *lock; KASSERT(mp == NULL || (mp->mnt_iflag & IMNT_UNMOUNT) == 0 || vp->v_tag == VT_VFS); - mutex_enter(&mntvnode_lock); /* * Delete from old mount point vnode list, if on one. */ - if ((omp = vp->v_mount) != NULL) + if ((omp = vp->v_mount) != NULL) { + lock = omp->mnt_vnodelock; + mutex_enter(lock); TAILQ_REMOVE(&vp->v_mount->mnt_vnodelist, vip, vi_mntvnodes); + mutex_exit(lock); + } + /* * Insert into list of vnodes for the new mount point, if * available. The caller must take a reference on the mount * structure and donate to the vnode. */ - if ((vp->v_mount = mp) != NULL) + if ((vp->v_mount = mp) != NULL) { + lock = mp->mnt_vnodelock; + mutex_enter(lock); TAILQ_INSERT_TAIL(&mp->mnt_vnodelist, vip, vi_mntvnodes); - mutex_exit(&mntvnode_lock); + mutex_exit(lock); + } if (omp != NULL) { /* Release reference to old mount. */ @@ -753,7 +765,7 @@ mount_domount(struct lwp *l, vnode_t **v */ mp->mnt_flag = flags & (MNT_BASIC_FLAGS | MNT_FORCE | MNT_IGNORE); - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); error = VFS_MOUNT(mp, path, data, data_len); mp->mnt_flag &= ~MNT_OP_FLAGS; @@ -802,7 +814,7 @@ mount_domount(struct lwp *l, vnode_t **v vput(nd.ni_vp); mount_checkdirs(vp); - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); /* Hold an additional reference to the mount across VFS_START(). */ vfs_ref(mp); @@ -825,7 +837,7 @@ err_mounted: err_unmounted: vp->v_mountedhere = NULL; - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); vfs_rele(mp); return error; @@ -863,7 +875,7 @@ dounmount(struct mount *mp, int flags, s used_extattr = mp->mnt_flag & MNT_EXTATTR; mp->mnt_iflag |= IMNT_UNMOUNT; - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); async = mp->mnt_flag & MNT_ASYNC; mp->mnt_flag &= ~MNT_ASYNC; cache_purgevfs(mp); /* remove cache entries for this file sys */ @@ -881,7 +893,7 @@ dounmount(struct mount *mp, int flags, s if ((mp->mnt_flag & (MNT_RDONLY | MNT_ASYNC)) == 0) vfs_syncer_add_to_worklist(mp); mp->mnt_flag |= async; - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); if (!was_suspended) vfs_resume(mp); if (used_extattr) { @@ -892,7 +904,7 @@ dounmount(struct mount *mp, int flags, s } return (error); } - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); /* * mark filesystem as gone to prevent further umounts Index: src/sys/kern/vfs_subr.c diff -u src/sys/kern/vfs_subr.c:1.477 src/sys/kern/vfs_subr.c:1.478 --- src/sys/kern/vfs_subr.c:1.477 Sun Dec 15 20:30:03 2019 +++ src/sys/kern/vfs_subr.c Sun Dec 22 19:47:34 2019 @@ -1,7 +1,8 @@ -/* $NetBSD: vfs_subr.c,v 1.477 2019/12/15 20:30:03 joerg Exp $ */ +/* $NetBSD: vfs_subr.c,v 1.478 2019/12/22 19:47:34 ad Exp $ */ /*- - * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc. + * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008, 2019 + * The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -68,7 +69,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.477 2019/12/15 20:30:03 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.478 2019/12/22 19:47:34 ad Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -667,13 +668,13 @@ vn_syncer_remove_from_worklist(struct vn KASSERT(mutex_owned(vp->v_interlock)); - mutex_enter(&syncer_data_lock); if (vp->v_iflag & VI_ONWORKLST) { + mutex_enter(&syncer_data_lock); vp->v_iflag &= ~VI_ONWORKLST; slp = &syncer_workitem_pending[vip->vi_synclist_slot]; TAILQ_REMOVE(slp, vip, vi_synclist); + mutex_exit(&syncer_data_lock); } - mutex_exit(&syncer_data_lock); } /* @@ -685,7 +686,7 @@ vfs_syncer_add_to_worklist(struct mount static int start, incr, next; int vdelay; - KASSERT(mutex_owned(&mp->mnt_updating)); + KASSERT(mutex_owned(mp->mnt_updating)); KASSERT((mp->mnt_iflag & IMNT_ONWORKLIST) == 0); /* @@ -716,7 +717,7 @@ void vfs_syncer_remove_from_worklist(struct mount *mp) { - KASSERT(mutex_owned(&mp->mnt_updating)); + KASSERT(mutex_owned(mp->mnt_updating)); KASSERT((mp->mnt_iflag & IMNT_ONWORKLIST) != 0); mp->mnt_iflag &= ~IMNT_ONWORKLIST; @@ -1575,7 +1576,7 @@ vfs_mount_print(struct mount *mp, int fu snprintb(sbuf, sizeof(sbuf), __IMNT_FLAG_BITS, mp->mnt_iflag); (*pr)("iflag = %s\n", sbuf); - (*pr)("refcnt = %d updating @ %p\n", mp->mnt_refcnt, &mp->mnt_updating); + (*pr)("refcnt = %d updating @ %p\n", mp->mnt_refcnt, mp->mnt_updating); (*pr)("statvfs cache:\n"); (*pr)("\tbsize = %lu\n",mp->mnt_stat.f_bsize); Index: src/sys/kern/vfs_syscalls.c diff -u src/sys/kern/vfs_syscalls.c:1.537 src/sys/kern/vfs_syscalls.c:1.538 --- src/sys/kern/vfs_syscalls.c:1.537 Thu Sep 26 01:34:16 2019 +++ src/sys/kern/vfs_syscalls.c Sun Dec 22 19:47:34 2019 @@ -1,7 +1,7 @@ -/* $NetBSD: vfs_syscalls.c,v 1.537 2019/09/26 01:34:16 christos Exp $ */ +/* $NetBSD: vfs_syscalls.c,v 1.538 2019/12/22 19:47:34 ad Exp $ */ /*- - * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. + * Copyright (c) 2008, 2009, 2019 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.537 2019/09/26 01:34:16 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.538 2019/12/22 19:47:34 ad Exp $"); #ifdef _KERNEL_OPT #include "opt_fileassoc.h" @@ -296,7 +296,7 @@ mount_update(struct lwp *l, struct vnode if (error) goto out; - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); mp->mnt_flag &= ~MNT_OP_FLAGS; mp->mnt_flag |= flags & MNT_OP_FLAGS; @@ -348,7 +348,7 @@ mount_update(struct lwp *l, struct vnode if ((mp->mnt_iflag & IMNT_ONWORKLIST) != 0) vfs_syncer_remove_from_worklist(mp); } - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); vfs_resume(mp); if ((error == 0) && !(saved_flags & MNT_EXTATTR) && @@ -445,12 +445,12 @@ mount_getargs(struct lwp *l, struct vnod if (vfs_busy(mp)) return EPERM; - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); mp->mnt_flag &= ~MNT_OP_FLAGS; mp->mnt_flag |= MNT_GETARGS; error = VFS_MOUNT(mp, path, data, data_len); mp->mnt_flag &= ~MNT_OP_FLAGS; - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); vfs_unbusy(mp); return (error); @@ -655,7 +655,7 @@ do_sys_sync(struct lwp *l) mountlist_iterator_init(&iter); while ((mp = mountlist_iterator_next(iter)) != NULL) { - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); if ((mp->mnt_flag & MNT_RDONLY) == 0) { asyncflag = mp->mnt_flag & MNT_ASYNC; mp->mnt_flag &= ~MNT_ASYNC; @@ -663,7 +663,7 @@ do_sys_sync(struct lwp *l) if (asyncflag) mp->mnt_flag |= MNT_ASYNC; } - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); } mountlist_iterator_destroy(iter); #ifdef DEBUG Index: src/sys/miscfs/genfs/genfs_vfsops.c diff -u src/sys/miscfs/genfs/genfs_vfsops.c:1.9 src/sys/miscfs/genfs/genfs_vfsops.c:1.10 --- src/sys/miscfs/genfs/genfs_vfsops.c:1.9 Wed Feb 20 10:07:27 2019 +++ src/sys/miscfs/genfs/genfs_vfsops.c Sun Dec 22 19:47:34 2019 @@ -1,7 +1,7 @@ -/* $NetBSD: genfs_vfsops.c,v 1.9 2019/02/20 10:07:27 hannken Exp $ */ +/* $NetBSD: genfs_vfsops.c,v 1.10 2019/12/22 19:47:34 ad Exp $ */ /*- - * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. + * Copyright (c) 2008, 2009, 2019 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfs_vfsops.c,v 1.9 2019/02/20 10:07:27 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfs_vfsops.c,v 1.10 2019/12/22 19:47:34 ad Exp $"); #include <sys/types.h> #include <sys/mount.h> @@ -61,7 +61,7 @@ genfs_statvfs(struct mount *mp, struct s int genfs_renamelock_enter(struct mount *mp) { - mutex_enter(&mp->mnt_renamelock); + mutex_enter(mp->mnt_renamelock); /* Preserve possible error return in case we become interruptible. */ return 0; } @@ -69,7 +69,7 @@ genfs_renamelock_enter(struct mount *mp) void genfs_renamelock_exit(struct mount *mp) { - mutex_exit(&mp->mnt_renamelock); + mutex_exit(mp->mnt_renamelock); } int Index: src/sys/nfs/nfs_export.c diff -u src/sys/nfs/nfs_export.c:1.60 src/sys/nfs/nfs_export.c:1.61 --- src/sys/nfs/nfs_export.c:1.60 Mon Apr 17 08:32:01 2017 +++ src/sys/nfs/nfs_export.c Sun Dec 22 19:47:34 2019 @@ -1,7 +1,7 @@ -/* $NetBSD: nfs_export.c,v 1.60 2017/04/17 08:32:01 hannken Exp $ */ +/* $NetBSD: nfs_export.c,v 1.61 2019/12/22 19:47:34 ad Exp $ */ /*- - * Copyright (c) 1997, 1998, 2004, 2005, 2008 The NetBSD Foundation, Inc. + * Copyright (c) 1997, 1998, 2004, 2005, 2008, 2019 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_export.c,v 1.60 2017/04/17 08:32:01 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_export.c,v 1.61 2019/12/22 19:47:34 ad Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -217,9 +217,9 @@ netexport_fini(void) kpause("nfsfini", false, hz, NULL); continue; } - mutex_enter(&mp->mnt_updating); /* mnt_flag */ + mutex_enter(mp->mnt_updating); /* mnt_flag */ netexport_unmount(mp); - mutex_exit(&mp->mnt_updating); /* mnt_flag */ + mutex_exit(mp->mnt_updating); /* mnt_flag */ vfs_unbusy(mp); } rw_destroy(&netexport_lock); @@ -289,7 +289,7 @@ mountd_set_exports_list(const struct mou if (error != 0) return error; if (nmp == NULL) - mutex_enter(&mp->mnt_updating); /* mnt_flag */ + mutex_enter(mp->mnt_updating); /* mnt_flag */ netexport_wrlock(); ne = netexport_lookup(mp); if (ne == NULL) { @@ -331,7 +331,7 @@ mountd_set_exports_list(const struct mou out: netexport_wrunlock(); if (nmp == NULL) - mutex_exit(&mp->mnt_updating); /* mnt_flag */ + mutex_exit(mp->mnt_updating); /* mnt_flag */ vfs_unbusy(mp); return error; } Index: src/sys/sys/mount.h diff -u src/sys/sys/mount.h:1.234 src/sys/sys/mount.h:1.235 --- src/sys/sys/mount.h:1.234 Tue Jan 1 10:06:54 2019 +++ src/sys/sys/mount.h Sun Dec 22 19:47:34 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: mount.h,v 1.234 2019/01/01 10:06:54 hannken Exp $ */ +/* $NetBSD: mount.h,v 1.235 2019/12/22 19:47:34 ad Exp $ */ /* * Copyright (c) 1989, 1991, 1993 @@ -133,29 +133,38 @@ struct vattr; * array of operations and an instance record. */ struct mount { - TAILQ_HEAD(, vnode_impl) mnt_vnodelist; /* list of vnodes this mount */ + /* + * Mostly stable data. + */ + kmutex_t *mnt_vnodelock; /* lock on mnt_vnodelist */ struct vfsops *mnt_op; /* operations on fs */ struct vnode *mnt_vnodecovered; /* vnode we mounted on */ struct mount *mnt_lower; /* fs mounted on */ - int mnt_synclist_slot; /* synclist slot index */ void *mnt_transinfo; /* for FS-internal use */ void *mnt_data; /* private data */ - kmutex_t mnt_renamelock; /* per-fs rename lock */ - int mnt_refcnt; /* ref count on this structure */ + kmutex_t *mnt_renamelock; /* per-fs rename lock */ int mnt_flag; /* flags */ int mnt_iflag; /* internal flags */ int mnt_fs_bshift; /* offset shift for lblkno */ int mnt_dev_bshift; /* shift for device sectors */ - struct statvfs mnt_stat; /* cache of filesystem stats */ specificdata_reference mnt_specdataref; /* subsystem specific data */ - kmutex_t mnt_updating; /* to serialize updates */ + kmutex_t *mnt_updating; /* to serialize updates */ const struct wapbl_ops *mnt_wapbl_op; /* logging ops */ struct wapbl *mnt_wapbl; /* log info */ struct wapbl_replay *mnt_wapbl_replay; /* replay support XXX: what? */ uint64_t mnt_gen; + + /* + * Volatile data: pad to keep away from the stable items. + */ + int mnt_refcnt /* ref count on this structure */ + __aligned(COHERENCY_UNIT); + int mnt_synclist_slot; /* synclist slot index */ + TAILQ_HEAD(, vnode_impl) mnt_vnodelist; /* list of vnodes this mount */ + struct statvfs mnt_stat; /* cache of filesystem stats */ }; #endif /* defined(_KERNEL) || defined(__EXPOSE_MOUNT) */ Index: src/sys/sys/vnode.h diff -u src/sys/sys/vnode.h:1.285 src/sys/sys/vnode.h:1.286 --- src/sys/sys/vnode.h:1.285 Sun Dec 15 21:56:13 2019 +++ src/sys/sys/vnode.h Sun Dec 22 19:47:34 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vnode.h,v 1.285 2019/12/15 21:56:13 ad Exp $ */ +/* $NetBSD: vnode.h,v 1.286 2019/12/22 19:47:34 ad Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -418,11 +418,6 @@ struct vnodeop_desc { #ifdef _KERNEL /* - * Interlock for scanning list of vnodes attached to a mountpoint - */ -extern kmutex_t mntvnode_lock; - -/* * Union filesystem hook for vn_readdir(). */ extern int (*vn_union_readdir_hook) (struct vnode **, struct file *, struct lwp *); Index: src/sys/sys/vnode_impl.h diff -u src/sys/sys/vnode_impl.h:1.18 src/sys/sys/vnode_impl.h:1.19 --- src/sys/sys/vnode_impl.h:1.18 Sun Dec 1 13:56:29 2019 +++ src/sys/sys/vnode_impl.h Sun Dec 22 19:47:34 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vnode_impl.h,v 1.18 2019/12/01 13:56:29 ad Exp $ */ +/* $NetBSD: vnode_impl.h,v 1.19 2019/12/22 19:47:34 ad Exp $ */ /*- * Copyright (c) 2016, 2019 The NetBSD Foundation, Inc. @@ -59,7 +59,7 @@ struct vcache_key { * c vcache_lock * d vdrain_lock * i v_interlock - * m mntvnode_lock + * m mnt_vnodelock * n namecache_lock * s syncer_data_lock */ Index: src/sys/ufs/lfs/ulfs_vfsops.c diff -u src/sys/ufs/lfs/ulfs_vfsops.c:1.14 src/sys/ufs/lfs/ulfs_vfsops.c:1.15 --- src/sys/ufs/lfs/ulfs_vfsops.c:1.14 Mon Dec 10 14:46:25 2018 +++ src/sys/ufs/lfs/ulfs_vfsops.c Sun Dec 22 19:47:35 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_vfsops.c,v 1.14 2018/12/10 14:46:25 maxv Exp $ */ +/* $NetBSD: ulfs_vfsops.c,v 1.15 2019/12/22 19:47:35 ad Exp $ */ /* from NetBSD: ufs_vfsops.c,v 1.54 2015/03/17 09:39:29 hannken Exp */ /* @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ulfs_vfsops.c,v 1.14 2018/12/10 14:46:25 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ulfs_vfsops.c,v 1.15 2019/12/22 19:47:35 ad Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -116,11 +116,11 @@ ulfs_quotactl(struct mount *mp, struct q if (error) { return (error); } - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); error = lfsquota_handle_cmd(mp, l, args); - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); vfs_unbusy(mp); return (error); #endif @@ -172,7 +172,7 @@ ulfs_quotactl(struct mount *mp, struct q return (error); } - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); switch (cmd) { case Q_QUOTAON: @@ -202,7 +202,7 @@ ulfs_quotactl(struct mount *mp, struct q default: error = EINVAL; } - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); vfs_unbusy(mp); return (error); #endif Index: src/sys/ufs/ufs/ufs_vfsops.c diff -u src/sys/ufs/ufs/ufs_vfsops.c:1.57 src/sys/ufs/ufs/ufs_vfsops.c:1.58 --- src/sys/ufs/ufs/ufs_vfsops.c:1.57 Thu Jun 20 03:31:30 2019 +++ src/sys/ufs/ufs/ufs_vfsops.c Sun Dec 22 19:47:35 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_vfsops.c,v 1.57 2019/06/20 03:31:30 pgoyette Exp $ */ +/* $NetBSD: ufs_vfsops.c,v 1.58 2019/12/22 19:47:35 ad Exp $ */ /* * Copyright (c) 1991, 1993, 1994 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_vfsops.c,v 1.57 2019/06/20 03:31:30 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_vfsops.c,v 1.58 2019/12/22 19:47:35 ad Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -137,11 +137,11 @@ ufs_quotactl(struct mount *mp, struct qu if (error) { return (error); } - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); error = quota_handle_cmd(mp, l, args); - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); vfs_unbusy(mp); return (error); #endif @@ -193,7 +193,7 @@ ufs_quotactl(struct mount *mp, struct qu return (error); } - mutex_enter(&mp->mnt_updating); + mutex_enter(mp->mnt_updating); switch (cmd) { case Q_QUOTAON: @@ -223,7 +223,7 @@ ufs_quotactl(struct mount *mp, struct qu default: error = EINVAL; } - mutex_exit(&mp->mnt_updating); + mutex_exit(mp->mnt_updating); vfs_unbusy(mp); return (error); #endif Index: src/sys/ufs/ufs/ufs_wapbl.c diff -u src/sys/ufs/ufs/ufs_wapbl.c:1.24 src/sys/ufs/ufs/ufs_wapbl.c:1.25 --- src/sys/ufs/ufs/ufs_wapbl.c:1.24 Wed Mar 1 10:42:45 2017 +++ src/sys/ufs/ufs/ufs_wapbl.c Sun Dec 22 19:47:35 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_wapbl.c,v 1.24 2017/03/01 10:42:45 hannken Exp $ */ +/* $NetBSD: ufs_wapbl.c,v 1.25 2019/12/22 19:47:35 ad Exp $ */ /*- * Copyright (c) 2003,2006,2008 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_wapbl.c,v 1.24 2017/03/01 10:42:45 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_wapbl.c,v 1.25 2019/12/22 19:47:35 ad Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -108,7 +108,7 @@ ufs_wapbl_verify_inodes(struct mount *mp struct inode *ip; struct buf *bp, *nbp; - mutex_enter(&mntvnode_lock); + mutex_enter(mp->mnt_vnodelock); loop: TAILQ_FOREACH_REVERSE(vp, &mp->mnt_vnodelist, vnodelst, v_mntvnodes) { /* @@ -117,11 +117,11 @@ ufs_wapbl_verify_inodes(struct mount *mp */ if (vp->v_mount != mp) goto loop; - mutex_enter(&vp->v_interlock); + mutex_enter(vp->v_interlock); nvp = TAILQ_NEXT(vp, v_mntvnodes); ip = VTOI(vp); if (vp->v_type == VNON) { - mutex_exit(&vp->v_interlock); + mutex_exit(vp->v_interlock); continue; } /* verify that update has been called on all inodes */ @@ -129,7 +129,7 @@ ufs_wapbl_verify_inodes(struct mount *mp panic("wapbl_verify: mp %p: dirty vnode %p (inode %p): 0x%x\n", mp, vp, ip, ip->i_flag); } - mutex_exit(&mntvnode_lock); + mutex_exit(mp->mnt_vnodelock); mutex_enter(&bufcache_lock); for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { @@ -141,14 +141,14 @@ ufs_wapbl_verify_inodes(struct mount *mp KASSERT((bp->b_flags & B_LOCKED) != 0); } mutex_exit(&bufcache_lock); - mutex_exit(&vp->v_interlock); + mutex_exit(vp->v_interlock); - mutex_enter(&mntvnode_lock); + mutex_enter(mp->mnt_vnodelock); } - mutex_exit(&mntvnode_lock); + mutex_exit(mp->mnt_vnodelock); vp = VFSTOUFS(mp)->um_devvp; - mutex_enter(&vp->v_interlock); + mutex_enter(vp->v_interlock); mutex_enter(&bufcache_lock); for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { nbp = LIST_NEXT(bp, b_vnbufs); @@ -159,6 +159,6 @@ ufs_wapbl_verify_inodes(struct mount *mp KASSERT((bp->b_flags & B_LOCKED) != 0); } mutex_exit(&bufcache_lock); - mutex_exit(&vp->v_interlock); + mutex_exit(vp->v_interlock); } #endif /* WAPBL_DEBUG_INODES */