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