Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/ad-namecache]: src/sys/kern - Adjust comments & assertions.
details: https://anonhg.NetBSD.org/src/rev/b1ff95ea84c9
branches: ad-namecache
changeset: 982989:b1ff95ea84c9
user: ad <ad%NetBSD.org@localhost>
date: Sat Jan 18 15:42:02 2020 +0000
description:
- Adjust comments & assertions.
- Ditch memcmp().
diffstat:
sys/kern/vfs_cache.c | 46 +++++++++++++++++++++++++++++++---------------
1 files changed, 31 insertions(+), 15 deletions(-)
diffs (111 lines):
diff -r 5639653ebf86 -r b1ff95ea84c9 sys/kern/vfs_cache.c
--- a/sys/kern/vfs_cache.c Fri Jan 17 22:26:25 2020 +0000
+++ b/sys/kern/vfs_cache.c Sat Jan 18 15:42:02 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_cache.c,v 1.126.2.6 2020/01/17 22:26:25 ad Exp $ */
+/* $NetBSD: vfs_cache.c,v 1.126.2.7 2020/01/18 15:42:02 ad Exp $ */
/*-
* Copyright (c) 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -148,7 +148,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.126.2.6 2020/01/17 22:26:25 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.126.2.7 2020/01/18 15:42:02 ad Exp $");
#define __NAMECACHE_PRIVATE
#ifdef _KERNEL_OPT
@@ -330,6 +330,22 @@
}
/*
+ * Like memcmp() but tuned for small strings of equal length.
+ */
+static inline int
+cache_namecmp(struct namecache *nc, const char *name, size_t namelen)
+{
+ size_t i;
+ int d;
+
+ KASSERT(nc->nc_nlen == namelen);
+ for (d = 0, i = 0; i < namelen; i++) {
+ d |= (nc->nc_name[i] ^ name[i]);
+ }
+ return d;
+}
+
+/*
* Remove an entry from the cache. The directory lock must be held, and if
* "dir2node" is true, then we're locking in the conventional direction and
* the list lock will be acquired when removing the entry from the vnode
@@ -378,11 +394,10 @@
}
/*
- * Find a single cache entry and return it locked. The directory lock must
- * be held.
+ * Find a single cache entry and return it. The nchnode lock must be held.
*
* Marked __noinline, and with everything unnecessary excluded, the compiler
- * (gcc 8.3.0 x86_64) does a great job on this.
+ * (gcc 8.3.0 x86_64) does a good job on this.
*/
static struct namecache * __noinline
cache_lookup_entry(struct nchnode *dnn, const char *name, size_t namelen,
@@ -394,12 +409,12 @@
KASSERT(rw_lock_held(&dnn->nn_lock));
/*
- * Search the RB tree for the key. This is one of the most
- * performance sensitive code paths in the system, so here is an
- * inlined version of rb_tree_find_node() tailored for exactly
- * what's needed here (64-bit key and so on). Elsewhere during
- * entry/removal the generic functions are used as it doesn't
- * matter so much there.
+ * Search the RB tree for the key. File lookup is very performance
+ * sensitive, so here is an inlined lookup tailored for exactly
+ * what's needed here (64-bit key and so on) that is much faster
+ * than using rb_tree_find_node(). Elsewhere during entry/removal
+ * the generic functions are used as it doesn't matter so much
+ * there.
*/
for (;;) {
if (__predict_false(RB_SENTINEL_P(node))) {
@@ -415,8 +430,7 @@
}
/* Exclude collisions. */
- KASSERT(nc->nc_nlen == namelen);
- if (__predict_false(memcmp(nc->nc_name, name, namelen) != 0)) {
+ if (__predict_false(cache_namecmp(nc, name, namelen))) {
return NULL;
}
@@ -666,7 +680,7 @@
rw_exit(*plock);
}
*plock = &dnn->nn_lock;
- } else {
+ } else if (*plock == NULL) {
KASSERT(dvp->v_usecount > 0);
}
@@ -674,6 +688,8 @@
* First up check if the user is allowed to look up files in this
* directory.
*/
+ KASSERT(dnn->nn_mode != VNOVAL && dnn->nn_uid != VNOVAL &&
+ dnn->nn_gid != VNOVAL);
error = kauth_authorize_vnode(cred, KAUTH_ACCESS_ACTION(VEXEC,
dvp->v_type, dnn->nn_mode & ALLPERMS), dvp, NULL,
genfs_can_access(dvp->v_type, dnn->nn_mode & ALLPERMS,
@@ -857,7 +873,7 @@
onc = rb_tree_find_node(&dnn->nn_tree, &nc->nc_key);
if (onc) {
KASSERT(onc->nc_nlen == nc->nc_nlen);
- if (memcmp(onc->nc_name, nc->nc_name, nc->nc_nlen) != 0) {
+ if (cache_namecmp(onc, name, namelen)) {
COUNT(ncs_collisions);
}
cache_remove(onc, true);
Home |
Main Index |
Thread Index |
Old Index