On Fri, Feb 21, 2020 at 02:14:31PM +0100, Kamil Rytarowski wrote:

> 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

I had a look this weekend.  This is down to KMEM_SIZE messing up the
alignment, so is a DIAGNOSTIC thing.  The align_offset parameter to
pool_cache() would be a nice easy way to solve this but it seems someone
killed that off, so I'll need to give this some more thought.

Andrew

> > 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) */
> > 
> 
> 
> 
> 



Reply via email to