svn commit: r351193 - head/sys/kern

Cy Schubert Cy.Schubert at cschubert.com
Mon Aug 19 04:09:56 UTC 2019


In message <201908181840.x7IIeCAL055888 at 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.Schubert at cschubert.com>
FreeBSD UNIX:  <cy at FreeBSD.org>   Web:  http://www.FreeBSD.org

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




More information about the svn-src-head mailing list