Module Name: src
Committed By: christos
Date: Fri Sep 13 14:01:33 UTC 2019
Modified Files:
src/sys/kern: vfs_cache.c
Log Message:
- expose the now hidden namecache
- compare with USHRT_MAX since the max length grew (we could make it NAME_MAX)
- use kmem_alloc for entries > NCHNAMLEN so the namecache contains all
possible entries.
To generate a diff of this commit:
cvs rdiff -u -r1.120 -r1.121 src/sys/kern/vfs_cache.c
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.120 src/sys/kern/vfs_cache.c:1.121
--- src/sys/kern/vfs_cache.c:1.120 Sat Mar 18 18:36:56 2017
+++ src/sys/kern/vfs_cache.c Fri Sep 13 10:01:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_cache.c,v 1.120 2017/03/18 22:36:56 riastradh Exp $ */
+/* $NetBSD: vfs_cache.c,v 1.121 2019/09/13 14:01:33 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,8 +58,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.120 2017/03/18 22:36:56 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.121 2019/09/13 14:01:33 christos Exp $");
+#define __NAMECACHE_PRIVATE
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
#include "opt_dtrace.h"
@@ -93,10 +94,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,
* obtained from (dvp, name) where dvp refers to the directory
* containing name.
*
- * For simplicity (and economy of storage), names longer than
- * a maximum length of NCHNAMLEN are not cached; they occur
- * infrequently in any case, and are almost never of interest.
- *
* Upon reaching the last segment of a path, if the reference
* is for DELETE, or NOCACHE is set (rewrite), and the
* name is located in the cache, it will be dropped.
@@ -589,7 +586,7 @@ cache_lookup(struct vnode *dvp, const ch
cpup = curcpu()->ci_data.cpu_nch;
mutex_enter(&cpup->cpu_lock);
- if (__predict_false(namelen > NCHNAMLEN)) {
+ if (__predict_false(namelen > USHRT_MAX)) {
SDT_PROBE(vfs, namecache, lookup, toolong, dvp,
name, namelen, 0, 0);
COUNT(cpup, ncs_long);
@@ -703,7 +700,7 @@ cache_lookup_raw(struct vnode *dvp, cons
cpup = curcpu()->ci_data.cpu_nch;
mutex_enter(&cpup->cpu_lock);
- if (__predict_false(namelen > NCHNAMLEN)) {
+ if (__predict_false(namelen > USHRT_MAX)) {
COUNT(cpup, ncs_long);
mutex_exit(&cpup->cpu_lock);
/* found nothing */
@@ -868,7 +865,7 @@ cache_enter(struct vnode *dvp, struct vn
/* First, check whether we can/should add a cache entry. */
if ((cnflags & MAKEENTRY) == 0 ||
- __predict_false(namelen > NCHNAMLEN || !doingcache)) {
+ __predict_false(namelen > USHRT_MAX || !doingcache)) {
SDT_PROBE(vfs, namecache, enter, toolong, vp, name, namelen,
0, 0);
return;
@@ -882,6 +879,10 @@ cache_enter(struct vnode *dvp, struct vn
mutex_exit(namecache_lock);
}
+ if (namelen > NCHNAMLEN) {
+ ncp = kmem_alloc(sizeof(*ncp) + namelen, KM_SLEEP);
+ cache_ctor(NULL, ncp, 0);
+ } else
ncp = pool_cache_get(namecache_cache, PR_WAITOK);
mutex_enter(namecache_lock);
numcache++;
@@ -919,7 +920,7 @@ cache_enter(struct vnode *dvp, struct vn
ncp->nc_vlist.le_prev = NULL;
ncp->nc_vlist.le_next = NULL;
}
- KASSERT(namelen <= NCHNAMLEN);
+ KASSERT(namelen <= USHRT_MAX);
ncp->nc_nlen = namelen;
memcpy(ncp->nc_name, name, (unsigned)ncp->nc_nlen);
TAILQ_INSERT_TAIL(&nclruhead, ncp, nc_lru);
@@ -970,7 +971,7 @@ nchinit(void)
int error;
TAILQ_INIT(&nclruhead);
- namecache_cache = pool_cache_init(sizeof(struct namecache),
+ namecache_cache = pool_cache_init(sizeof(struct namecache) + NCHNAMLEN,
coherency_unit, 0, 0, "ncache", NULL, IPL_NONE, cache_ctor,
cache_dtor, NULL);
KASSERT(namecache_cache != NULL);
@@ -1248,6 +1249,10 @@ cache_reclaim(void)
LIST_REMOVE(ncp, nc_hash);
ncp->nc_hash.le_prev = NULL;
}
+ if (ncp->nc_nlen > NCHNAMLEN) {
+ cache_dtor(NULL, ncp);
+ kmem_free(ncp, sizeof(*ncp) + ncp->nc_nlen);
+ } else
pool_cache_put(namecache_cache, ncp);
ncp = next;
}