Date: Sun, 18 Aug 2019 21:09:49 -0700 From: Cy Schubert <Cy.Schubert@cschubert.com> To: Mateusz Guzik <mjg@FreeBSD.org> 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: <201908190409.x7J49o32014802@slippy.cwsent.com> In-Reply-To: <201908181840.x7IIeCAL055888@repo.freebsd.org> References: <201908181840.x7IIeCAL055888@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201908190409.x7J49o32014802>