On 22.12.2019 20:47, Andrew Doran wrote:
> 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.
>
This change broke kUBSan syzbot.
The sanitizer is now very noisy as struct mount requires 64 byte alignment.
http://netbsd.org/~kamil/kubsan/mount-alignment.txt
> 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) */
>
Attachment:
signature.asc
Description: OpenPGP digital signature