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>