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

Reply via email to