Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Kill ncvhashtbl. It uses 64MB on my computer to map: vp...



details:   https://anonhg.NetBSD.org/src/rev/37e57e0b8608
branches:  trunk
changeset: 968201:37e57e0b8608
user:      ad <ad%NetBSD.org@localhost>
date:      Mon Jan 06 11:22:33 2020 +0000

description:
Kill ncvhashtbl.  It uses 64MB on my computer to map: vp -> vp (lol!).

diffstat:

 sys/kern/vfs_cache.c |  103 +++++++++++---------------------------------------
 sys/sys/namei.src    |    3 +-
 2 files changed, 24 insertions(+), 82 deletions(-)

diffs (228 lines):

diff -r 1fbb0e322e53 -r 37e57e0b8608 sys/kern/vfs_cache.c
--- a/sys/kern/vfs_cache.c      Mon Jan 06 11:18:51 2020 +0000
+++ b/sys/kern/vfs_cache.c      Mon Jan 06 11:22:33 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_cache.c,v 1.125 2019/12/01 18:31:19 ad Exp $       */
+/*     $NetBSD: vfs_cache.c,v 1.126 2020/01/06 11:22:33 ad Exp $       */
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.125 2019/12/01 18:31:19 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.126 2020/01/06 11:22:33 ad Exp $");
 
 #define __NAMECACHE_PRIVATE
 #ifdef _KERNEL_OPT
@@ -84,7 +84,6 @@
 #include <sys/time.h>
 #include <sys/vnode_impl.h>
 
-#define NAMECACHE_ENTER_REVERSE
 /*
  * Name caching works as follows:
  *
@@ -159,7 +158,6 @@
  * All use serialized by namecache_lock:
  *
  *     nclruhead / struct namecache::nc_lru
- *     ncvhashtbl / struct namecache::nc_vhash
  *     struct vnode_impl::vi_dnclist / struct namecache::nc_dvlist
  *     struct vnode_impl::vi_nclist / struct namecache::nc_vlist
  *     nchstats
@@ -267,11 +265,6 @@
 #define        NCHASH2(hash, dvp)      \
        (((hash) ^ ((uintptr_t)(dvp) >> 3)) & nchash)
 
-static LIST_HEAD(ncvhashhead, namecache) *ncvhashtbl __read_mostly;
-static u_long  ncvhash __read_mostly;
-
-#define        NCVHASH(vp)             (((uintptr_t)(vp) >> 3) & ncvhash)
-
 /* Number of cache entries allocated. */
 static long    numcache __cacheline_aligned;
 
@@ -408,10 +401,6 @@
                TAILQ_REMOVE(&nclruhead, ncp, nc_lru);
                ncp->nc_lru.tqe_prev = NULL;
        }
-       if (ncp->nc_vhash.le_prev != NULL) {
-               LIST_REMOVE(ncp, nc_vhash);
-               ncp->nc_vhash.le_prev = NULL;
-       }
        if (ncp->nc_vlist.le_prev != NULL) {
                LIST_REMOVE(ncp, nc_vlist);
                ncp->nc_vlist.le_prev = NULL;
@@ -771,16 +760,15 @@
 {
        struct namecache *ncp;
        struct vnode *dvp;
-       struct ncvhashhead *nvcpp;
        struct nchcpu *cpup;
        char *bp;
        int error, nlen;
 
+       KASSERT(vp != NULL);
+
        if (!doingcache)
                goto out;
 
-       nvcpp = &ncvhashtbl[NCVHASH(vp)];
-
        /*
         * We increment counters in the local CPU's per-cpu stats.
         * We don't take the per-cpu lock, however, since this function
@@ -789,22 +777,22 @@
         */
        cpup = curcpu()->ci_data.cpu_nch;
        mutex_enter(namecache_lock);
-       LIST_FOREACH(ncp, nvcpp, nc_vhash) {
+       LIST_FOREACH(ncp, &VNODE_TO_VIMPL(vp)->vi_nclist, nc_vlist) {
                mutex_enter(&ncp->nc_lock);
                if (ncp->nc_vp == vp &&
                    (dvp = ncp->nc_dvp) != NULL &&
                    dvp != vp) {                /* avoid pesky . entries.. */
-
-#ifdef DIAGNOSTIC
                        if (ncp->nc_nlen == 1 &&
-                           ncp->nc_name[0] == '.')
-                               panic("cache_revlookup: found entry for .");
-
+                           ncp->nc_name[0] == '.') {
+                               mutex_exit(&ncp->nc_lock);
+                               continue;
+                       }
                        if (ncp->nc_nlen == 2 &&
                            ncp->nc_name[0] == '.' &&
-                           ncp->nc_name[1] == '.')
-                               panic("cache_revlookup: found entry for ..");
-#endif
+                           ncp->nc_name[1] == '.') {
+                               mutex_exit(&ncp->nc_lock);
+                               continue;
+                       }
                        COUNT(cpup, ncs_revhits);
                        nlen = ncp->nc_nlen;
 
@@ -860,7 +848,6 @@
        struct namecache *ncp;
        struct namecache *oncp;
        struct nchashhead *ncpp;
-       struct ncvhashhead *nvcpp;
        nchash_t hash;
 
        /* First, check whether we can/should add a cache entry. */
@@ -940,25 +927,6 @@
        ncp->nc_hash.le_prev = &ncpp->lh_first;
        membar_producer();
        ncpp->lh_first = ncp;
-
-       ncp->nc_vhash.le_prev = NULL;
-       ncp->nc_vhash.le_next = NULL;
-
-       /*
-        * Create reverse-cache entries (used in getcwd) for directories.
-        * (and in linux procfs exe node)
-        */
-       if (vp != NULL &&
-           vp != dvp &&
-#ifndef NAMECACHE_ENTER_REVERSE
-           vp->v_type == VDIR &&
-#endif
-           (ncp->nc_nlen > 2 ||
-           (ncp->nc_nlen > 1 && ncp->nc_name[1] != '.') ||
-           (/* ncp->nc_nlen > 0 && */ ncp->nc_name[0] != '.'))) {
-               nvcpp = &ncvhashtbl[NCVHASH(vp)];
-               LIST_INSERT_HEAD(nvcpp, ncp, nc_vhash);
-       }
        mutex_exit(&ncp->nc_lock);
        mutex_exit(namecache_lock);
 }
@@ -978,14 +946,7 @@
        KASSERT(namecache_cache != NULL);
 
        namecache_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
-
        nchashtbl = hashinit(desiredvnodes, HASH_LIST, true, &nchash);
-       ncvhashtbl =
-#ifdef NAMECACHE_ENTER_REVERSE
-           hashinit(desiredvnodes, HASH_LIST, true, &ncvhash);
-#else
-           hashinit(desiredvnodes/8, HASH_LIST, true, &ncvhash);
-#endif
 
        error = kthread_create(PRI_VM, KTHREAD_MPSAFE, NULL, cache_thread,
            NULL, NULL, "cachegc");
@@ -1049,43 +1010,25 @@
 nchreinit(void)
 {
        struct namecache *ncp;
-       struct nchashhead *oldhash1, *hash1;
-       struct ncvhashhead *oldhash2, *hash2;
-       u_long i, oldmask1, oldmask2, mask1, mask2;
+       struct nchashhead *oldhash, *hash;
+       u_long i, oldmask, mask;
 
-       hash1 = hashinit(desiredvnodes, HASH_LIST, true, &mask1);
-       hash2 =
-#ifdef NAMECACHE_ENTER_REVERSE
-           hashinit(desiredvnodes, HASH_LIST, true, &mask2);
-#else
-           hashinit(desiredvnodes/8, HASH_LIST, true, &mask2);
-#endif
+       hash = hashinit(desiredvnodes, HASH_LIST, true, &mask);
        mutex_enter(namecache_lock);
        cache_lock_cpus();
-       oldhash1 = nchashtbl;
-       oldmask1 = nchash;
-       nchashtbl = hash1;
-       nchash = mask1;
-       oldhash2 = ncvhashtbl;
-       oldmask2 = ncvhash;
-       ncvhashtbl = hash2;
-       ncvhash = mask2;
-       for (i = 0; i <= oldmask1; i++) {
-               while ((ncp = LIST_FIRST(&oldhash1[i])) != NULL) {
+       oldhash = nchashtbl;
+       oldmask = nchash;
+       nchashtbl = hash;
+       nchash = mask;
+       for (i = 0; i <= oldmask; i++) {
+               while ((ncp = LIST_FIRST(&oldhash[i])) != NULL) {
                        LIST_REMOVE(ncp, nc_hash);
                        ncp->nc_hash.le_prev = NULL;
                }
        }
-       for (i = 0; i <= oldmask2; i++) {
-               while ((ncp = LIST_FIRST(&oldhash2[i])) != NULL) {
-                       LIST_REMOVE(ncp, nc_vhash);
-                       ncp->nc_vhash.le_prev = NULL;
-               }
-       }
        cache_unlock_cpus();
        mutex_exit(namecache_lock);
-       hashdone(oldhash1, HASH_LIST, oldmask1);
-       hashdone(oldhash2, HASH_LIST, oldmask2);
+       hashdone(oldhash, HASH_LIST, oldmask);
 }
 
 /*
diff -r 1fbb0e322e53 -r 37e57e0b8608 sys/sys/namei.src
--- a/sys/sys/namei.src Mon Jan 06 11:18:51 2020 +0000
+++ b/sys/sys/namei.src Mon Jan 06 11:22:33 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: namei.src,v 1.46 2019/12/01 18:31:19 ad Exp $  */
+/*     $NetBSD: namei.src,v 1.47 2020/01/06 11:22:33 ad Exp $  */
 
 /*
  * Copyright (c) 1985, 1989, 1991, 1993
@@ -210,7 +210,6 @@
  */
 struct namecache {
        LIST_ENTRY(namecache) nc_hash;  /* L/C hash chain */
-       LIST_ENTRY(namecache) nc_vhash; /* L directory hash chain */
        TAILQ_ENTRY(namecache) nc_lru;  /* L pseudo-lru chain */
        LIST_ENTRY(namecache) nc_dvlist;/* L dvp's list of cache entries */
        LIST_ENTRY(namecache) nc_vlist; /* L vp's list of cache entries */



Home | Main Index | Thread Index | Old Index