Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Aug 2019 06:30:44 +0200
From:      Mateusz Guzik <mjguzik@gmail.com>
To:        Cy Schubert <Cy.Schubert@cschubert.com>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Subject:   Re: svn commit: r351193 - head/sys/kern
Message-ID:  <CAGudoHGWNOYS9RpDR7=mszqEkE90uxEuu0qfzkcCr8K6vwTUrw@mail.gmail.com>
In-Reply-To: <201908190409.x7J49o32014802@slippy.cwsent.com>
References:  <201908181840.x7IIeCAL055888@repo.freebsd.org> <201908190409.x7J49o32014802@slippy.cwsent.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Sorry, cannot test right now. Does this fix it for you?

diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 6a1547854c9d..0cde451e5890 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -466,18 +466,12 @@ kern_getfsstat(struct thread *td, struct statfs
**buf, size_t bufsize,
                }
                if (sfsp != NULL && count < maxcount) {
                        sp = &mp->mnt_stat;
-                       /*
-                        * If MNT_NOWAIT is specified, do not refresh
-                        * the fsstat cache.
-                        */
-                       if (mode != MNT_NOWAIT) {
-                               error = VFS_STATFS(mp, sp);
-                               if (error != 0) {
-                                       mtx_lock(&mountlist_mtx);
-                                       nmp = TAILQ_NEXT(mp, mnt_list);
-                                       vfs_unbusy(mp);
-                                       continue;
-                               }
+                       error = VFS_STATFS(mp, sp);
+                       if (error != 0) {
+                               mtx_lock(&mountlist_mtx);
+                               nmp = TAILQ_NEXT(mp, mnt_list);
+                               vfs_unbusy(mp);
+                               continue;
                        }
                        if (priv_check(td, PRIV_VFS_GENERATION)) {
                                sptmp = malloc(sizeof(struct statfs), M_STATFS,


On 8/19/19, Cy Schubert <Cy.Schubert@cschubert.com> wrote:
> In message <201908181840.x7IIeCAL055888@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@cschubert.com>
> FreeBSD UNIX:  <cy@FreeBSD.org>   Web:  http://www.FreeBSD.org
>
> 	The need of the many outweighs the greed of the few.
>
>
>


-- 
Mateusz Guzik <mjguzik gmail.com>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGudoHGWNOYS9RpDR7=mszqEkE90uxEuu0qfzkcCr8K6vwTUrw>