mount: add vnode usage per file system with mount -v

This avoids the need to drop into the ddb to figure out vnode
usage per file system.  It helps to see if they are or are not
being freed.  Suggestion to report active vnode count was from
kib@

Reviewed by:   	kib
Differential Revision: https://reviews.freebsd.org/D35436
This commit is contained in:
Doug Ambrisko 2022-06-13 07:56:38 -07:00
parent 9c951734c2
commit 6468cd8e0e
3 changed files with 22 additions and 1 deletions

View File

@ -692,6 +692,13 @@ prmount(struct statfs *sfp)
xo_emit("{D:, }{Lw:fsid}{:fsid}", fsidbuf);
free(fsidbuf);
}
if (sfp->f_nvnodelistsize != 0 || sfp->f_avnodecount != 0) {
xo_open_container("vnodes");
xo_emit("{D:, }{Lwc:vnodes}{Lw:count}{w:count/%ju}{Lw:active}{:active/%ju}",
(uintmax_t)sfp->f_nvnodelistsize,
(uintmax_t)sfp->f_avnodecount);
xo_close_container("vnodes");
}
}
xo_emit("{D:)}\n");
}

View File

@ -2610,6 +2610,8 @@ vfs_copyopt(struct vfsoptlist *opts, const char *name, void *dest, int len)
int
__vfs_statfs(struct mount *mp, struct statfs *sbp)
{
struct vnode *vp;
uint32_t count;
/*
* Filesystems only fill in part of the structure for updates, we
@ -2624,6 +2626,16 @@ __vfs_statfs(struct mount *mp, struct statfs *sbp)
sbp->f_version = STATFS_VERSION;
sbp->f_namemax = NAME_MAX;
sbp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
sbp->f_nvnodelistsize = mp->mnt_nvnodelistsize;
count = 0;
MNT_ILOCK(mp);
TAILQ_FOREACH(vp, &mp->mnt_nvnodelist, v_nmntvnodes) {
if (vrefcnt(vp) > 0) /* racy but does not matter */
count++;
}
MNT_IUNLOCK(mp);
sbp->f_avnodecount = count;
return (mp->mnt_op->vfs_statfs(mp, sbp));
}

View File

@ -91,7 +91,9 @@ struct statfs {
uint64_t f_asyncwrites; /* count of async writes since mount */
uint64_t f_syncreads; /* count of sync reads since mount */
uint64_t f_asyncreads; /* count of async reads since mount */
uint64_t f_spare[10]; /* unused spare */
uint32_t f_nvnodelistsize; /* # of vnodes */
uint32_t f_avnodecount; /* # of active vnodes */
uint64_t f_spare[9]; /* unused spare */
uint32_t f_namemax; /* maximum filename length */
uid_t f_owner; /* user that mounted the filesystem */
fsid_t f_fsid; /* filesystem id */