Module Name: src Committed By: ad Date: Mon Jan 6 11:22:33 UTC 2020
Modified Files: src/sys/kern: vfs_cache.c src/sys/sys: namei.src Log Message: Kill ncvhashtbl. It uses 64MB on my computer to map: vp -> vp (lol!). To generate a diff of this commit: cvs rdiff -u -r1.125 -r1.126 src/sys/kern/vfs_cache.c cvs rdiff -u -r1.46 -r1.47 src/sys/sys/namei.src Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/vfs_cache.c diff -u src/sys/kern/vfs_cache.c:1.125 src/sys/kern/vfs_cache.c:1.126 --- src/sys/kern/vfs_cache.c:1.125 Sun Dec 1 18:31:19 2019 +++ src/sys/kern/vfs_cache.c Mon Jan 6 11:22:33 2020 @@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_cache.c, #include <sys/time.h> #include <sys/vnode_impl.h> -#define NAMECACHE_ENTER_REVERSE /* * Name caching works as follows: * @@ -159,7 +158,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_cache.c, * 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 @@ static u_long nchash __read_mostly; #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 @@ cache_disassociate(struct namecache *ncp 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 @@ cache_revlookup(struct vnode *vp, struct { 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 @@ cache_revlookup(struct vnode *vp, struct */ 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 @@ cache_enter(struct vnode *dvp, struct vn 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 @@ cache_enter(struct vnode *dvp, struct vn 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 @@ nchinit(void) 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 @@ void nchreinit(void) { struct namecache *ncp; - struct nchashhead *oldhash1, *hash1; - struct ncvhashhead *oldhash2, *hash2; - u_long i, oldmask1, oldmask2, mask1, mask2; - - 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 + struct nchashhead *oldhash, *hash; + u_long i, oldmask, mask; + + 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); } /* Index: src/sys/sys/namei.src diff -u src/sys/sys/namei.src:1.46 src/sys/sys/namei.src:1.47 --- src/sys/sys/namei.src:1.46 Sun Dec 1 18:31:19 2019 +++ src/sys/sys/namei.src Mon Jan 6 11:22:33 2020 @@ -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 @@ NAMEIFL PARAMASK 0x02ee300 /* mask of pa */ 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 */