In message <201908181840.x7iiecal055...@repo.freebsd.org>, Mateusz Guzik 
writes
:
> Author: mjg
> Date: Sun Aug 18 18:40:12 2019
> New Revision: 351193
> URL: https://svnweb.freebsd.org/changeset/base/351193
>
> Log:
>   vfs: stop always overwriting ->mnt_stat in VFS_STATFS
>   
>   The struct is already populated on each mount (and remount). Fields are eit
> her
>   constant or not used by filesystem in the first place.
>   
>   Some infrequently used functions use it to avoid having to allocate a new b
> uffer
>   and are left alone.
>   
>   The current code results in an avoidable copying single-threaded and signif
> icant
>   cache line bouncing multithreaded
>   
>   While here deduplicate initial filling of the struct.
>   
>   Reviewed by:        kib
>   Sponsored by:       The FreeBSD Foundation
>   Differential Revision:      https://reviews.freebsd.org/D21317
>
> Modified:
>   head/sys/kern/vfs_mount.c
>   head/sys/kern/vfs_syscalls.c
>
> Modified: head/sys/kern/vfs_mount.c
> =============================================================================
> =
> --- head/sys/kern/vfs_mount.c Sun Aug 18 17:12:06 2019        (r351192)
> +++ head/sys/kern/vfs_mount.c Sun Aug 18 18:40:12 2019        (r351193)
> @@ -1831,12 +1831,15 @@ vfs_copyopt(struct vfsoptlist *opts, const char *name
> ,
>  int
>  __vfs_statfs(struct mount *mp, struct statfs *sbp)
>  {
> -     int error;
>  
> -     error = mp->mnt_op->vfs_statfs(mp, &mp->mnt_stat);
> -     if (sbp != &mp->mnt_stat)
> -             *sbp = mp->mnt_stat;
> -     return (error);
> +     /*
> +      * Set these in case the underlying filesystem fails to do so.
> +      */
> +     sbp->f_version = STATFS_VERSION;
> +     sbp->f_namemax = NAME_MAX;
> +     sbp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
> +
> +     return (mp->mnt_op->vfs_statfs(mp, sbp));
>  }
>  
>  void
>
> Modified: head/sys/kern/vfs_syscalls.c
> =============================================================================
> =
> --- head/sys/kern/vfs_syscalls.c      Sun Aug 18 17:12:06 2019        (r35119
> 2)
> +++ head/sys/kern/vfs_syscalls.c      Sun Aug 18 18:40:12 2019        (r35119
> 3)
> @@ -248,7 +248,6 @@ statfs_scale_blocks(struct statfs *sf, long max_size)
>  static int
>  kern_do_statfs(struct thread *td, struct mount *mp, struct statfs *buf)
>  {
> -     struct statfs *sp;
>       int error;
>  
>       if (mp == NULL)
> @@ -262,17 +261,9 @@ kern_do_statfs(struct thread *td, struct mount *mp, st
>       if (error != 0)
>               goto out;
>  #endif
> -     /*
> -      * Set these in case the underlying filesystem fails to do so.
> -      */
> -     sp = &mp->mnt_stat;
> -     sp->f_version = STATFS_VERSION;
> -     sp->f_namemax = NAME_MAX;
> -     sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
> -     error = VFS_STATFS(mp, sp);
> +     error = VFS_STATFS(mp, buf);
>       if (error != 0)
>               goto out;
> -     *buf = *sp;
>       if (priv_check(td, PRIV_VFS_GENERATION)) {
>               buf->f_fsid.val[0] = buf->f_fsid.val[1] = 0;
>               prison_enforce_statfs(td->td_ucred, mp, buf);
> @@ -476,13 +467,6 @@ restart:
>               if (sfsp != NULL && count < maxcount) {
>                       sp = &mp->mnt_stat;
>                       /*
> -                      * Set these in case the underlying filesystem
> -                      * fails to do so.
> -                      */
> -                     sp->f_version = STATFS_VERSION;
> -                     sp->f_namemax = NAME_MAX;
> -                     sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
> -                     /*
>                        * If MNT_NOWAIT is specified, do not refresh
>                        * the fsstat cache.
>                        */
> @@ -4545,7 +4529,6 @@ sys_fhstatfs(struct thread *td, struct fhstatfs_args *
>  int
>  kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf)
>  {
> -     struct statfs *sp;
>       struct mount *mp;
>       struct vnode *vp;
>       int error;
> @@ -4569,16 +4552,7 @@ kern_fhstatfs(struct thread *td, fhandle_t fh, struct 
>       if (error != 0)
>               goto out;
>  #endif
> -     /*
> -      * Set these in case the underlying filesystem fails to do so.
> -      */
> -     sp = &mp->mnt_stat;
> -     sp->f_version = STATFS_VERSION;
> -     sp->f_namemax = NAME_MAX;
> -     sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
> -     error = VFS_STATFS(mp, sp);
> -     if (error == 0)
> -             *buf = *sp;
> +     error = VFS_STATFS(mp, buf);
>  out:
>       vfs_unbusy(mp);
>       return (error);
>

Hi mjg@,

This revsion has caused a df(1) and statfs(2) a bit of gas. 

cwsys# df -h /
Filesystem    Size    Used   Avail Capacity  Mounted on
dsk02/src     1.9G    551M    1.2G    30%    /opt/src
cwsys# 
cwsys# df -h /usr
Filesystem          Size    Used   Avail Capacity  Mounted on
dsk02/var/mqueue    2.9G    1.3G    1.4G    47%    /var/spool/mqueue
cwsys# df -h /var
Filesystem               Size    Used   Avail Capacity  Mounted on
dsk02/src/svn-current    1.9G    1.4G    380M    79%    /opt/src/svn-current
cwsys# df -h /var/tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
dsk02/src     992M    198M    714M    22%    /opt/src
cwsys# 

cwfw# df -h /
Filesystem    Size    Used   Avail Capacity  Mounted on
              4.0G    1.6G    2.0G    45%    
cwfw# df -h /usr
Filesystem    Size    Used   Avail Capacity  Mounted on
              4.0G    1.6G    2.0G    45%    
cwfw# df -h /var
Filesystem    Size    Used   Avail Capacity  Mounted on
              2.9G    647M    2.0G    24%    
cwfw# df -h /tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
              300M    4.0K    300M     0%    
cwfw# df -h /var/tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
              2.9G    648M    2.0G    24%    
cwfw# 

Reverting this revision corrected this regression.


-- 
Cheers,
Cy Schubert <cy.schub...@cschubert.com>
FreeBSD UNIX:  <c...@freebsd.org>   Web:  http://www.FreeBSD.org

        The need of the many outweighs the greed of the few.


_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to