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/d7911b3f5536
branches:  trunk
changeset: 823254:d7911b3f5536
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 0843b29e5464 -r d7911b3f5536 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 0843b29e5464 -r d7911b3f5536 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 0843b29e5464 -r d7911b3f5536 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