svn commit: r351193 - head/sys/kern
Mateusz Guzik
mjguzik at gmail.com
Mon Aug 19 04:30:47 UTC 2019
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 at cschubert.com> wrote:
> 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.
>
>
>
--
Mateusz Guzik <mjguzik gmail.com>
More information about the svn-src-head
mailing list