Move vnode member v_mntvnodes as vi_mntvnodes to vnode_impl.h.

Add an ugly hack so pstat.c may still traverse the list.
This commit is contained in:
hannken 2017-01-11 09:07:57 +00:00
parent 6e1af6b1d7
commit dcc198a3f8
7 changed files with 76 additions and 52 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: vnode.9,v 1.76 2017/01/11 09:06:57 hannken Exp $
.\" $NetBSD: vnode.9,v 1.77 2017/01/11 09:07:57 hannken Exp $
.\"
.\" Copyright (c) 2001, 2005, 2006 The NetBSD Foundation, Inc.
.\" All rights reserved.
@ -169,7 +169,6 @@ struct vnode {
int v_holdcnt; /* page & buffer refs */
struct mount *v_mount; /* ptr to vfs we are in */
int (**v_op)(void *); /* vnode operations vector */
TAILQ_ENTRY(vnode) v_mntvnodes; /* vnodes for mount point */
struct buflists v_cleanblkhd; /* clean blocklist head */
struct buflists v_dirtyblkhd; /* dirty blocklist head */
union {

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_mount.c,v 1.43 2017/01/02 10:33:28 hannken Exp $ */
/* $NetBSD: vfs_mount.c,v 1.44 2017/01/11 09:07:57 hannken Exp $ */
/*-
* Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.43 2017/01/02 10:33:28 hannken Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.44 2017/01/11 09:07:57 hannken Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@ -99,6 +99,8 @@ vnode_t * rootvnode;
/* Mounted filesystem list. */
struct mntlist mountlist;
kmutex_t mountlist_lock;
int vnode_offset_next_by_mount /* XXX: ugly hack for pstat.c */
= offsetof(vnode_impl_t, vi_mntvnodes.tqe_next);
kmutex_t mntvnode_lock;
kmutex_t vfs_list_lock;
@ -336,33 +338,36 @@ vfs_unbusy(struct mount *mp, bool keepref, struct mount **nextp)
}
struct vnode_iterator {
struct vnode vi_vnode;
vnode_impl_t vi_vnode;
};
void
vfs_vnode_iterator_init(struct mount *mp, struct vnode_iterator **vip)
vfs_vnode_iterator_init(struct mount *mp, struct vnode_iterator **vnip)
{
struct vnode *vp;
vnode_t *vp;
vnode_impl_t *vip;
vp = vnalloc_marker(mp);
vip = VNODE_TO_VIMPL(vp);
mutex_enter(&mntvnode_lock);
TAILQ_INSERT_HEAD(&mp->mnt_vnodelist, vp, v_mntvnodes);
TAILQ_INSERT_HEAD(&mp->mnt_vnodelist, vip, vi_mntvnodes);
vp->v_usecount = 1;
mutex_exit(&mntvnode_lock);
*vip = (struct vnode_iterator *)vp;
*vnip = (struct vnode_iterator *)vip;
}
void
vfs_vnode_iterator_destroy(struct vnode_iterator *vi)
vfs_vnode_iterator_destroy(struct vnode_iterator *vni)
{
struct vnode *mvp = &vi->vi_vnode;
vnode_impl_t *mvip = &vni->vi_vnode;
vnode_t *mvp = VIMPL_TO_VNODE(mvip);
mutex_enter(&mntvnode_lock);
KASSERT(vnis_marker(mvp));
if (mvp->v_usecount != 0) {
TAILQ_REMOVE(&mvp->v_mount->mnt_vnodelist, mvp, v_mntvnodes);
TAILQ_REMOVE(&mvp->v_mount->mnt_vnodelist, mvip, vi_mntvnodes);
mvp->v_usecount = 0;
}
mutex_exit(&mntvnode_lock);
@ -370,22 +375,24 @@ vfs_vnode_iterator_destroy(struct vnode_iterator *vi)
}
struct vnode *
vfs_vnode_iterator_next(struct vnode_iterator *vi,
vfs_vnode_iterator_next(struct vnode_iterator *vni,
bool (*f)(void *, struct vnode *), void *cl)
{
struct vnode *mvp = &vi->vi_vnode;
struct mount *mp = mvp->v_mount;
struct vnode *vp;
vnode_impl_t *mvip = &vni->vi_vnode;
struct mount *mp = VIMPL_TO_VNODE(mvip)->v_mount;
vnode_t *vp;
vnode_impl_t *vip;
int error;
KASSERT(vnis_marker(mvp));
KASSERT(vnis_marker(VIMPL_TO_VNODE(mvip)));
do {
mutex_enter(&mntvnode_lock);
vp = TAILQ_NEXT(mvp, v_mntvnodes);
TAILQ_REMOVE(&mp->mnt_vnodelist, mvp, v_mntvnodes);
mvp->v_usecount = 0;
vip = TAILQ_NEXT(mvip, vi_mntvnodes);
TAILQ_REMOVE(&mp->mnt_vnodelist, mvip, vi_mntvnodes);
VIMPL_TO_VNODE(mvip)->v_usecount = 0;
again:
vp = VIMPL_TO_VNODE(vip);
if (vp == NULL) {
mutex_exit(&mntvnode_lock);
return NULL;
@ -395,12 +402,12 @@ again:
vdead_check(vp, VDEAD_NOWAIT) ||
(f && !(*f)(cl, vp))) {
mutex_exit(vp->v_interlock);
vp = TAILQ_NEXT(vp, v_mntvnodes);
vip = TAILQ_NEXT(vip, vi_mntvnodes);
goto again;
}
TAILQ_INSERT_AFTER(&mp->mnt_vnodelist, vp, mvp, v_mntvnodes);
mvp->v_usecount = 1;
TAILQ_INSERT_AFTER(&mp->mnt_vnodelist, vip, mvip, vi_mntvnodes);
VIMPL_TO_VNODE(mvip)->v_usecount = 1;
mutex_exit(&mntvnode_lock);
error = vcache_vget(vp);
KASSERT(error == 0 || error == ENOENT);
@ -415,6 +422,7 @@ again:
void
vfs_insmntque(vnode_t *vp, struct mount *mp)
{
vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
struct mount *omp;
KASSERT(mp == NULL || (mp->mnt_iflag & IMNT_UNMOUNT) == 0 ||
@ -425,14 +433,14 @@ vfs_insmntque(vnode_t *vp, struct mount *mp)
* Delete from old mount point vnode list, if on one.
*/
if ((omp = vp->v_mount) != NULL)
TAILQ_REMOVE(&vp->v_mount->mnt_vnodelist, vp, v_mntvnodes);
TAILQ_REMOVE(&vp->v_mount->mnt_vnodelist, vip, vi_mntvnodes);
/*
* Insert into list of vnodes for the new mount point, if
* available. The caller must take a reference on the mount
* structure and donate to the vnode.
*/
if ((vp->v_mount = mp) != NULL)
TAILQ_INSERT_TAIL(&mp->mnt_vnodelist, vp, v_mntvnodes);
TAILQ_INSERT_TAIL(&mp->mnt_vnodelist, vip, vi_mntvnodes);
mutex_exit(&mntvnode_lock);
if (omp != NULL) {
@ -505,6 +513,7 @@ int
vflush(struct mount *mp, vnode_t *skipvp, int flags)
{
vnode_t *vp;
vnode_impl_t *vip;
struct vnode_iterator *marker;
int error, busy = 0, when = 0;
struct vflush_ctx ctx;
@ -543,14 +552,16 @@ vflush(struct mount *mp, vnode_t *skipvp, int flags)
/* Wait for all vnodes to be reclaimed. */
for (;;) {
mutex_enter(&mntvnode_lock);
TAILQ_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) {
TAILQ_FOREACH(vip, &mp->mnt_vnodelist, vi_mntvnodes) {
vp = VIMPL_TO_VNODE(vip);
if (vp == skipvp)
continue;
if ((flags & SKIPSYSTEM) && (vp->v_vflag & VV_SYSTEM))
continue;
break;
}
if (vp != NULL) {
if (vip != NULL) {
KASSERT(vp == VIMPL_TO_VNODE(vip));
mutex_enter(vp->v_interlock);
mutex_exit(&mntvnode_lock);
error = vcache_vget(vp);

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_subr.c,v 1.455 2017/01/11 09:06:57 hannken Exp $ */
/* $NetBSD: vfs_subr.c,v 1.456 2017/01/11 09:07:57 hannken Exp $ */
/*-
* Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc.
@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.455 2017/01/11 09:06:57 hannken Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.456 2017/01/11 09:07:57 hannken Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@ -1594,9 +1594,11 @@ vfs_mount_print(struct mount *mp, int full, void (*pr)(const char *, ...))
{
int cnt = 0;
struct vnode *vp;
vnode_t *vp;
vnode_impl_t *vip;
(*pr)("locked vnodes =");
TAILQ_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) {
TAILQ_FOREACH(vip, &mp->mnt_vnodelist, vi_mntvnodes) {
vp = VIMPL_TO_VNODE(vip);
if (VOP_ISLOCKED(vp)) {
if ((++cnt % 6) == 0) {
(*pr)(" %p,\n\t", vp);
@ -1610,10 +1612,12 @@ vfs_mount_print(struct mount *mp, int full, void (*pr)(const char *, ...))
if (full) {
int cnt = 0;
struct vnode *vp;
vnode_t *vp;
vnode_impl_t *vip;
(*pr)("all vnodes =");
TAILQ_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) {
if (!TAILQ_NEXT(vp, v_mntvnodes)) {
TAILQ_FOREACH(vip, &mp->mnt_vnodelist, vi_mntvnodes) {
vp = VIMPL_TO_VNODE(vip);
if (!TAILQ_NEXT(vip, vi_mntvnodes)) {
(*pr)(" %p", vp);
} else if ((++cnt % 6) == 0) {
(*pr)(" %p,\n\t", vp);
@ -1621,7 +1625,7 @@ vfs_mount_print(struct mount *mp, int full, void (*pr)(const char *, ...))
(*pr)(" %p,", vp);
}
}
(*pr)("\n", vp);
(*pr)("\n");
}
}
@ -1634,7 +1638,8 @@ void
printlockedvnodes(void)
{
struct mount *mp, *nmp;
struct vnode *vp;
vnode_t *vp;
vnode_impl_t *vip;
printf("Locked vnodes\n");
mutex_enter(&mountlist_lock);
@ -1642,7 +1647,8 @@ printlockedvnodes(void)
if (vfs_busy(mp, &nmp)) {
continue;
}
TAILQ_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) {
TAILQ_FOREACH(vip, &mp->mnt_vnodelist, vi_mntvnodes) {
vp = VIMPL_TO_VNODE(vip);
if (VOP_ISLOCKED(vp))
vprint(NULL, vp);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: mount.h,v 1.219 2016/07/07 06:55:44 msaitoh Exp $ */
/* $NetBSD: mount.h,v 1.220 2017/01/11 09:07:57 hannken Exp $ */
/*
* Copyright (c) 1989, 1991, 1993
@ -100,6 +100,7 @@
#ifndef _STANDALONE
struct vnode;
struct vnode_impl;
struct vattr;
/*
@ -109,7 +110,7 @@ struct vattr;
*/
struct mount {
TAILQ_ENTRY(mount) mnt_list; /* mount list */
TAILQ_HEAD(, vnode) mnt_vnodelist; /* list of vnodes this mount */
TAILQ_HEAD(, vnode_impl) mnt_vnodelist; /* list of vnodes this mount */
struct vfsops *mnt_op; /* operations on fs */
struct vnode *mnt_vnodecovered; /* vnode we mounted on */
int mnt_synclist_slot; /* synclist slot index */

View File

@ -1,4 +1,4 @@
/* $NetBSD: vnode.h,v 1.270 2017/01/11 09:06:57 hannken Exp $ */
/* $NetBSD: vnode.h,v 1.271 2017/01/11 09:07:57 hannken Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@ -126,7 +126,6 @@ LIST_HEAD(buflists, buf);
* : stable, reference to the vnode is required
* f vnode_free_list_lock, or vrele_lock for vrele_list
* i v_interlock
* m mntvnode_lock
* u locked by underlying filesystem
* v vnode lock
* x v_interlock + bufcache_lock to modify, either to inspect
@ -147,7 +146,6 @@ struct vnode {
int v_holdcnt; /* i: page & buffer refs */
struct mount *v_mount; /* v: ptr to vfs we are in */
int (**v_op)(void *); /* :: vnode operations vector */
TAILQ_ENTRY(vnode) v_mntvnodes; /* m: vnodes for mount point */
struct buflists v_cleanblkhd; /* x: clean blocklist head */
struct buflists v_dirtyblkhd; /* x: dirty blocklist head */
union {

View File

@ -1,4 +1,4 @@
/* $NetBSD: vnode_impl.h,v 1.9 2017/01/11 09:06:57 hannken Exp $ */
/* $NetBSD: vnode_impl.h,v 1.10 2017/01/11 09:07:58 hannken Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@ -61,6 +61,7 @@ struct vcache_key {
* c vcache_lock
* d vdrain_lock
* i v_interlock
* m mntvnode_lock
* n namecache_lock
* s syncer_data_lock
*/
@ -73,6 +74,7 @@ struct vnode_impl {
LIST_HEAD(, namecache) vi_nclist; /* n: namecaches (parent) */
int vi_synclist_slot; /* s: synclist slot index */
TAILQ_ENTRY(vnode_impl) vi_synclist; /* s: vnodes with dirty bufs */
TAILQ_ENTRY(vnode_impl) vi_mntvnodes; /* m: vnodes for mount point */
SLIST_ENTRY(vnode_impl) vi_hash; /* c: vnode cache list */
struct vcache_key vi_key; /* c: vnode cache key */
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: pstat.c,v 1.125 2015/04/20 19:36:56 riastradh Exp $ */
/* $NetBSD: pstat.c,v 1.126 2017/01/11 09:07:58 hannken Exp $ */
/*-
* Copyright (c) 1980, 1991, 1993, 1994
@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1991, 1993, 1994\
#if 0
static char sccsid[] = "@(#)pstat.c 8.16 (Berkeley) 5/9/95";
#else
__RCSID("$NetBSD: pstat.c,v 1.125 2015/04/20 19:36:56 riastradh Exp $");
__RCSID("$NetBSD: pstat.c,v 1.126 2017/01/11 09:07:58 hannken Exp $");
#endif
#endif /* not lint */
@ -89,13 +89,15 @@ struct nlist nl[] = {
{ "_mountlist", 0, 0, 0, 0 }, /* address of head of mount list. */
#define V_NUMV 1
{ "_numvnodes", 0, 0, 0, 0 },
#define FNL_NFILE 2
#define V_NEXT_OFFSET 2
{ "_vnode_offset_next_by_mount", 0, 0, 0, 0 },
#define FNL_NFILE 3
{ "_nfiles", 0, 0, 0, 0 },
#define FNL_MAXFILE 3
#define FNL_MAXFILE 4
{ "_maxfiles", 0, 0, 0, 0 },
#define TTY_NTTY 4
#define TTY_NTTY 5
{ "_tty_count", 0, 0, 0, 0 },
#define TTY_TTYLIST 5
#define TTY_TTYLIST 6
{ "_ttylist", 0, 0, 0, 0 },
#define NLMANDATORY TTY_TTYLIST /* names up to here are mandatory */
{ "", 0, 0, 0, 0 }
@ -747,17 +749,20 @@ kinfo_vnodes(int *avnodes)
struct mount *mp, mount;
struct vnode *vp, vnode;
char *beg, *bp, *ep;
int numvnodes;
int numvnodes, next_offset;
KGET(V_NUMV, numvnodes);
if ((bp = malloc((numvnodes + 20) * (VPTRSZ + VNODESZ))) == NULL)
err(1, "malloc");
beg = bp;
ep = bp + (numvnodes + 20) * (VPTRSZ + VNODESZ);
KGET(V_NEXT_OFFSET, next_offset);
KGET(V_MOUNTLIST, mlist);
TAILQ_FOREACH(mp, &mlist, mnt_list) {
mp = TAILQ_FIRST(&mlist);
while (mp != NULL) {
KGET2(mp, &mount, sizeof(mount), "mount entry");
TAILQ_FOREACH(vp, &mount.mnt_vnodelist, v_mntvnodes) {
vp = (struct vnode *)TAILQ_FIRST(&mount.mnt_vnodelist);
while (vp != NULL) {
KGET2(vp, &vnode, sizeof(vnode), "vnode");
if (bp + VPTRSZ + VNODESZ > ep)
/* XXX - should realloc */
@ -766,7 +771,9 @@ kinfo_vnodes(int *avnodes)
bp += VPTRSZ;
memmove(bp, &vnode, VNODESZ);
bp += VNODESZ;
KGET2((char *)vp + next_offset, &vp, sizeof(vp), "nvp");
}
mp = TAILQ_NEXT(&mount, mnt_list);
}
*avnodes = (bp - beg) / (VPTRSZ + VNODESZ);
return (beg);