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.schub...@cschubert.com> wrote:
> 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.
>
>
>


-- 
Mateusz Guzik <mjguzik gmail.com>
_______________________________________________
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