Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Cleanup after mountlist iterator:
details: https://anonhg.NetBSD.org/src/rev/8f15fd6b3277
branches: trunk
changeset: 353003:8f15fd6b3277
user: hannken <hannken%NetBSD.org@localhost>
date: Mon Apr 17 08:29:58 2017 +0000
description:
Cleanup after mountlist iterator:
- remove now unused field mnt_list.
- rename mount_list to mountlist and make it local to vfs_mount.c.
- make mountlist_lock local to vfs_mount.c.
Change pstat.c to retrieve vnodes by lru lists.
diffstat:
sys/kern/vfs_mount.c | 53 ++++++++++++++++------------------------------
sys/sys/mount.h | 8 +-----
usr.sbin/pstat/pstat.c | 56 ++++++++++++++++++++++++++++++++-----------------
3 files changed, 57 insertions(+), 60 deletions(-)
diffs (truncated from 303 to 300 lines):
diff -r 1f558b1a0be5 -r 8f15fd6b3277 sys/kern/vfs_mount.c
--- a/sys/kern/vfs_mount.c Mon Apr 17 07:19:28 2017 +0000
+++ b/sys/kern/vfs_mount.c Mon Apr 17 08:29:58 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_mount.c,v 1.53 2017/04/12 10:35:10 hannken Exp $ */
+/* $NetBSD: vfs_mount.c,v 1.54 2017/04/17 08:29:58 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.53 2017/04/12 10:35:10 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.54 2017/04/17 08:29:58 hannken Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -108,8 +108,6 @@
struct mountlist_entry mi_entry;
};
-static TAILQ_HEAD(mountlist, mountlist_entry) mount_list;
-
static struct vnode *vfs_vnode_iterator_next1(struct vnode_iterator *,
bool (*)(void *, struct vnode *), void *, bool);
@@ -117,10 +115,10 @@
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);
+static TAILQ_HEAD(mountlist, mountlist_entry) mountlist;
+static kmutex_t mountlist_lock;
+int vnode_offset_next_by_lru /* XXX: ugly hack for pstat.c */
+ = offsetof(vnode_impl_t, vi_lrulist.tqe_next);
kmutex_t mntvnode_lock;
kmutex_t vfs_list_lock;
@@ -135,7 +133,6 @@
vfs_mount_sysinit(void)
{
- TAILQ_INIT(&mount_list);
TAILQ_INIT(&mountlist);
mutex_init(&mountlist_lock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&mntvnode_lock, MUTEX_DEFAULT, IPL_NONE);
@@ -308,21 +305,16 @@
KASSERT(mp->mnt_refcnt > 0);
+ KASSERT(nextp == NULL);
+
mutex_enter(&mp->mnt_unmounting);
if (__predict_false((mp->mnt_iflag & IMNT_GONE) != 0)) {
mutex_exit(&mp->mnt_unmounting);
- if (nextp != NULL) {
- KASSERT(mutex_owned(&mountlist_lock));
- *nextp = TAILQ_NEXT(mp, mnt_list);
- }
return ENOENT;
}
++mp->mnt_busynest;
KASSERT(mp->mnt_busynest != 0);
mutex_exit(&mp->mnt_unmounting);
- if (nextp != NULL) {
- mutex_exit(&mountlist_lock);
- }
atomic_inc_uint(&mp->mnt_refcnt);
return 0;
}
@@ -341,9 +333,8 @@
KASSERT(mp->mnt_refcnt > 0);
- if (nextp != NULL) {
- mutex_enter(&mountlist_lock);
- }
+ KASSERT(nextp == NULL);
+
mutex_enter(&mp->mnt_unmounting);
KASSERT(mp->mnt_busynest != 0);
mp->mnt_busynest--;
@@ -351,10 +342,6 @@
if (!keepref) {
vfs_destroy(mp);
}
- if (nextp != NULL) {
- KASSERT(mutex_owned(&mountlist_lock));
- *nextp = TAILQ_NEXT(mp, mnt_list);
- }
}
struct vnode_iterator {
@@ -1508,7 +1495,7 @@
me = mountlist_alloc(ME_MARKER, NULL);
mutex_enter(&mountlist_lock);
- TAILQ_INSERT_HEAD(&mount_list, me, me_list);
+ TAILQ_INSERT_HEAD(&mountlist, me, me_list);
mutex_exit(&mountlist_lock);
*mip = (mount_iterator_t *)me;
}
@@ -1522,7 +1509,7 @@
vfs_unbusy(marker->me_mount, false, NULL);
mutex_enter(&mountlist_lock);
- TAILQ_REMOVE(&mount_list, marker, me_list);
+ TAILQ_REMOVE(&mountlist, marker, me_list);
mutex_exit(&mountlist_lock);
mountlist_free(marker);
@@ -1554,8 +1541,8 @@
mutex_exit(&mountlist_lock);
return NULL;
}
- TAILQ_REMOVE(&mount_list, marker, me_list);
- TAILQ_INSERT_AFTER(&mount_list, me, marker, me_list);
+ TAILQ_REMOVE(&mountlist, marker, me_list);
+ TAILQ_INSERT_AFTER(&mountlist, me, marker, me_list);
/* Skip other markers. */
if (me->me_type != ME_MOUNT)
@@ -1588,8 +1575,7 @@
me = mountlist_alloc(ME_MOUNT, mp);
mutex_enter(&mountlist_lock);
- TAILQ_INSERT_TAIL(&mount_list, me, me_list);
- TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
+ TAILQ_INSERT_TAIL(&mountlist, me, me_list);
mutex_exit(&mountlist_lock);
}
@@ -1601,12 +1587,11 @@
struct mountlist_entry *me;
mutex_enter(&mountlist_lock);
- TAILQ_FOREACH(me, &mount_list, me_list)
+ TAILQ_FOREACH(me, &mountlist, me_list)
if (me->me_type == ME_MOUNT && me->me_mount == mp)
break;
KASSERT(me != NULL);
- TAILQ_REMOVE(&mount_list, me, me_list);
- TAILQ_REMOVE(&mountlist, mp, mnt_list);
+ TAILQ_REMOVE(&mountlist, me, me_list);
mutex_exit(&mountlist_lock);
mountlist_free(me);
}
@@ -1621,9 +1606,9 @@
struct mountlist_entry *me;
if (mp == NULL) {
- me = TAILQ_FIRST(&mount_list);
+ me = TAILQ_FIRST(&mountlist);
} else {
- TAILQ_FOREACH(me, &mount_list, me_list)
+ TAILQ_FOREACH(me, &mountlist, me_list)
if (me->me_type == ME_MOUNT && me->me_mount == mp)
break;
if (me != NULL)
diff -r 1f558b1a0be5 -r 8f15fd6b3277 sys/sys/mount.h
--- a/sys/sys/mount.h Mon Apr 17 07:19:28 2017 +0000
+++ b/sys/sys/mount.h Mon Apr 17 08:29:58 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mount.h,v 1.222 2017/04/11 07:46:37 hannken Exp $ */
+/* $NetBSD: mount.h,v 1.223 2017/04/17 08:29:58 hannken Exp $ */
/*
* Copyright (c) 1989, 1991, 1993
@@ -105,11 +105,9 @@
/*
* Structure per mounted file system. Each mounted file system has an
- * array of operations and an instance record. The file systems are
- * put on a doubly linked list.
+ * array of operations and an instance record.
*/
struct mount {
- TAILQ_ENTRY(mount) mnt_list; /* mount list */
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 */
@@ -466,10 +464,8 @@
void vfs_syncer_add_to_worklist(struct mount *);
void vfs_syncer_remove_from_worklist(struct mount *);
-extern TAILQ_HEAD(mntlist, mount) mountlist; /* mounted filesystem list */
extern struct vfsops *vfssw[]; /* filesystem type table */
extern int nvfssw;
-extern kmutex_t mountlist_lock;
extern kmutex_t vfs_list_lock;
void vfs_mount_sysinit(void);
diff -r 1f558b1a0be5 -r 8f15fd6b3277 usr.sbin/pstat/pstat.c
--- a/usr.sbin/pstat/pstat.c Mon Apr 17 07:19:28 2017 +0000
+++ b/usr.sbin/pstat/pstat.c Mon Apr 17 08:29:58 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pstat.c,v 1.126 2017/01/11 09:07:58 hannken Exp $ */
+/* $NetBSD: pstat.c,v 1.127 2017/04/17 08:29:58 hannken Exp $ */
/*-
* Copyright (c) 1980, 1991, 1993, 1994
@@ -39,7 +39,7 @@
#if 0
static char sccsid[] = "@(#)pstat.c 8.16 (Berkeley) 5/9/95";
#else
-__RCSID("$NetBSD: pstat.c,v 1.126 2017/01/11 09:07:58 hannken Exp $");
+__RCSID("$NetBSD: pstat.c,v 1.127 2017/04/17 08:29:58 hannken Exp $");
#endif
#endif /* not lint */
@@ -85,19 +85,23 @@
#include "swapctl.h"
struct nlist nl[] = {
-#define V_MOUNTLIST 0
- { "_mountlist", 0, 0, 0, 0 }, /* address of head of mount list. */
-#define V_NUMV 1
+#define V_LRU_FREE_LIST 0
+ { "_lru_free_list", 0, 0, 0, 0 }, /* address of lru free list. */
+#define V_LRU_HOLD_LIST 1
+ { "_lru_hold_list", 0, 0, 0, 0 }, /* address of lru hold list. */
+#define V_LRU_VRELE_LIST 2
+ { "_lru_vrele_list", 0, 0, 0, 0 }, /* address of lru vrele list. */
+#define V_NUMV 3
{ "_numvnodes", 0, 0, 0, 0 },
-#define V_NEXT_OFFSET 2
- { "_vnode_offset_next_by_mount", 0, 0, 0, 0 },
-#define FNL_NFILE 3
+#define V_NEXT_OFFSET 4
+ { "_vnode_offset_next_by_lru", 0, 0, 0, 0 },
+#define FNL_NFILE 5
{ "_nfiles", 0, 0, 0, 0 },
-#define FNL_MAXFILE 4
+#define FNL_MAXFILE 6
{ "_maxfiles", 0, 0, 0, 0 },
-#define TTY_NTTY 5
+#define TTY_NTTY 7
{ "_tty_count", 0, 0, 0, 0 },
-#define TTY_TTYLIST 6
+#define TTY_TTYLIST 8
{ "_ttylist", 0, 0, 0, 0 },
#define NLMANDATORY TTY_TTYLIST /* names up to here are mandatory */
{ "", 0, 0, 0, 0 }
@@ -742,12 +746,21 @@
/*
* simulate what a running kernel does in in kinfo_vnode
*/
+static int
+vnode_cmp(const void *p1, const void *p2)
+{
+ const char *s1 = (const char *)p1;
+ const char *s2 = (const char *)p2;
+ const struct vnode *v1 = (const struct vnode *)(s1 + VPTRSZ);
+ const struct vnode *v2 = (const struct vnode *)(s2 + VPTRSZ);
+
+ return (v2->v_mount - v1->v_mount);
+}
+
char *
kinfo_vnodes(int *avnodes)
{
- struct mntlist mlist;
- struct mount *mp, mount;
- struct vnode *vp, vnode;
+ int i;
char *beg, *bp, *ep;
int numvnodes, next_offset;
@@ -757,11 +770,13 @@
beg = bp;
ep = bp + (numvnodes + 20) * (VPTRSZ + VNODESZ);
KGET(V_NEXT_OFFSET, next_offset);
- KGET(V_MOUNTLIST, mlist);
- mp = TAILQ_FIRST(&mlist);
- while (mp != NULL) {
- KGET2(mp, &mount, sizeof(mount), "mount entry");
- vp = (struct vnode *)TAILQ_FIRST(&mount.mnt_vnodelist);
+
+ for (i = V_LRU_FREE_LIST; i <= V_LRU_VRELE_LIST; i++) {
+ TAILQ_HEAD(vnodelst, vnode) lru_head;
+ struct vnode *vp, vnode;
+
+ KGET(i, lru_head);
+ vp = TAILQ_FIRST(&lru_head);
while (vp != NULL) {
KGET2(vp, &vnode, sizeof(vnode), "vnode");
if (bp + VPTRSZ + VNODESZ > ep)
@@ -773,9 +788,10 @@
bp += VNODESZ;
KGET2((char *)vp + next_offset, &vp, sizeof(vp), "nvp");
}
- mp = TAILQ_NEXT(&mount, mnt_list);
}
*avnodes = (bp - beg) / (VPTRSZ + VNODESZ);
+ /* Sort by mount like we get it from sysctl. */
+ qsort(beg, *avnodes, VPTRSZ + VNODESZ, vnode_cmp);
Home |
Main Index |
Thread Index |
Old Index