svn commit: r366792 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Sat Oct 17 13:04:51 UTC 2020


Author: mjg
Date: Sat Oct 17 13:04:46 2020
New Revision: 366792
URL: https://svnweb.freebsd.org/changeset/base/366792

Log:
  cache: factor negative lookup out of cache_fplookup_next

Modified:
  head/sys/kern/vfs_cache.c

Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c	Sat Oct 17 13:04:25 2020	(r366791)
+++ head/sys/kern/vfs_cache.c	Sat Oct 17 13:04:46 2020	(r366792)
@@ -3815,16 +3815,53 @@ cache_fplookup_dotdot(struct cache_fpl *fpl)
 	return (0);
 }
 
+static int __noinline
+cache_fplookup_neg(struct cache_fpl *fpl, struct namecache *ncp, uint32_t hash)
+{
+	struct negstate *ns;
+	struct vnode *dvp;
+	u_char nc_flag;
+	bool neg_hot;
+
+	dvp = fpl->dvp;
+	nc_flag = atomic_load_char(&ncp->nc_flag);
+	MPASS((nc_flag & NCF_NEGATIVE) != 0);
+	/*
+	 * If they want to create an entry we need to replace this one.
+	 */
+	if (__predict_false(fpl->cnp->cn_nameiop != LOOKUP)) {
+		/*
+		 * TODO
+		 * This should call something similar to
+		 * cache_fplookup_final_modifying.
+		 */
+		return (cache_fpl_partial(fpl));
+	}
+	ns = NCP2NEGSTATE(ncp);
+	neg_hot = ((ns->neg_flag & NEG_HOT) != 0);
+	if (__predict_false(!cache_ncp_canuse(ncp))) {
+		return (cache_fpl_partial(fpl));
+	}
+	if (__predict_false((nc_flag & NCF_WHITE) != 0)) {
+		return (cache_fpl_partial(fpl));
+	}
+	if (!neg_hot) {
+		return (cache_fplookup_negative_promote(fpl, ncp, hash));
+	}
+	SDT_PROBE2(vfs, namecache, lookup, hit__negative, dvp, ncp->nc_name);
+	counter_u64_add(numneghits, 1);
+	cache_fpl_smr_exit(fpl);
+	return (cache_fpl_handled(fpl, ENOENT));
+}
+
 static int
 cache_fplookup_next(struct cache_fpl *fpl)
 {
 	struct componentname *cnp;
 	struct namecache *ncp;
-	struct negstate *ns;
 	struct vnode *dvp, *tvp;
 	u_char nc_flag;
 	uint32_t hash;
-	bool neg_hot;
 
 	cnp = fpl->cnp;
 	dvp = fpl->dvp;
@@ -3853,28 +3890,7 @@ cache_fplookup_next(struct cache_fpl *fpl)
 	tvp = atomic_load_ptr(&ncp->nc_vp);
 	nc_flag = atomic_load_char(&ncp->nc_flag);
 	if ((nc_flag & NCF_NEGATIVE) != 0) {
-		/*
-		 * If they want to create an entry we need to replace this one.
-		 */
-		if (__predict_false(fpl->cnp->cn_nameiop != LOOKUP)) {
-			return (cache_fpl_partial(fpl));
-		}
-		ns = NCP2NEGSTATE(ncp);
-		neg_hot = ((ns->neg_flag & NEG_HOT) != 0);
-		if (__predict_false(!cache_ncp_canuse(ncp))) {
-			return (cache_fpl_partial(fpl));
-		}
-		if (__predict_false((nc_flag & NCF_WHITE) != 0)) {
-			return (cache_fpl_partial(fpl));
-		}
-		if (!neg_hot) {
-			return (cache_fplookup_negative_promote(fpl, ncp, hash));
-		}
-		SDT_PROBE2(vfs, namecache, lookup, hit__negative, dvp,
-		    ncp->nc_name);
-		counter_u64_add(numneghits, 1);
-		cache_fpl_smr_exit(fpl);
-		return (cache_fpl_handled(fpl, ENOENT));
+		return (cache_fplookup_neg(fpl, ncp, hash));
 	}
 
 	if (__predict_false(!cache_ncp_canuse(ncp))) {


More information about the svn-src-all mailing list