svn commit: r305378 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Sun Sep 4 08:55:16 UTC 2016


Author: mjg
Date: Sun Sep  4 08:55:15 2016
New Revision: 305378
URL: https://svnweb.freebsd.org/changeset/base/305378

Log:
  cache: put all negative entry management code into dedicated functions
  
  Reviewed by:	kib
  MFC after:	1 week

Modified:
  head/sys/kern/vfs_cache.c

Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c	Sun Sep  4 08:53:58 2016	(r305377)
+++ head/sys/kern/vfs_cache.c	Sun Sep  4 08:55:15 2016	(r305378)
@@ -433,6 +433,50 @@ SYSCTL_PROC(_debug_hashstat, OID_AUTO, n
 #endif
 
 /*
+ * Negative entries management
+ */
+static void
+cache_negative_hit(struct namecache *ncp)
+{
+
+	rw_assert(&cache_lock, RA_WLOCKED);
+	TAILQ_REMOVE(&ncneg, ncp, nc_dst);
+	TAILQ_INSERT_TAIL(&ncneg, ncp, nc_dst);
+}
+
+static void
+cache_negative_insert(struct namecache *ncp)
+{
+
+	rw_assert(&cache_lock, RA_WLOCKED);
+	MPASS(ncp->nc_vp == NULL);
+	TAILQ_INSERT_TAIL(&ncneg, ncp, nc_dst);
+	numneg++;
+}
+
+static void
+cache_negative_remove(struct namecache *ncp)
+{
+
+	rw_assert(&cache_lock, RA_WLOCKED);
+	MPASS(ncp->nc_vp == NULL);
+	TAILQ_REMOVE(&ncneg, ncp, nc_dst);
+	numneg--;
+}
+
+static void
+cache_negative_zap_one(void)
+{
+	struct namecache *ncp;
+
+	rw_assert(&cache_lock, RA_WLOCKED);
+	ncp = TAILQ_FIRST(&ncneg);
+	KASSERT(ncp->nc_vp == NULL, ("ncp %p vp %p on ncneg",
+	    ncp, ncp->nc_vp));
+	cache_zap(ncp);
+}
+
+/*
  * cache_zap():
  *
  *   Removes a namecache entry from cache, whether it contains an actual
@@ -469,8 +513,7 @@ cache_zap(struct namecache *ncp)
 		if (ncp == ncp->nc_vp->v_cache_dd)
 			ncp->nc_vp->v_cache_dd = NULL;
 	} else {
-		TAILQ_REMOVE(&ncneg, ncp, nc_dst);
-		numneg--;
+		cache_negative_remove(ncp);
 	}
 	numcache--;
 	cache_free(ncp);
@@ -640,14 +683,7 @@ negative_success:
 	if (!wlocked && !CACHE_UPGRADE_LOCK())
 		goto wlock;
 	counter_u64_add(numneghits, 1);
-	/*
-	 * We found a "negative" match, so we shift it to the end of
-	 * the "negative" cache entries queue to satisfy LRU.  Also,
-	 * check to see if the entry is a whiteout; indicate this to
-	 * the componentname, if so.
-	 */
-	TAILQ_REMOVE(&ncneg, ncp, nc_dst);
-	TAILQ_INSERT_TAIL(&ncneg, ncp, nc_dst);
+	cache_negative_hit(ncp);
 	if (ncp->nc_flag & NCF_WHITE)
 		cnp->cn_flags |= ISWHITEOUT;
 	SDT_PROBE2(vfs, namecache, lookup, hit__negative, dvp,
@@ -759,15 +795,13 @@ cache_enter_time(struct vnode *dvp, stru
 					TAILQ_REMOVE(&ncp->nc_vp->v_cache_dst,
 					    ncp, nc_dst);
 				} else {
-					TAILQ_REMOVE(&ncneg, ncp, nc_dst);
-					numneg--;
+					cache_negative_remove(ncp);
 				}
 				if (vp != NULL) {
 					TAILQ_INSERT_HEAD(&vp->v_cache_dst,
 					    ncp, nc_dst);
 				} else {
-					TAILQ_INSERT_TAIL(&ncneg, ncp, nc_dst);
-					numneg++;
+					cache_negative_insert(ncp);
 				}
 				ncp->nc_vp = vp;
 				CACHE_WUNLOCK();
@@ -893,17 +927,12 @@ cache_enter_time(struct vnode *dvp, stru
 	} else {
 		if (cnp->cn_flags & ISWHITEOUT)
 			ncp->nc_flag |= NCF_WHITE;
-		TAILQ_INSERT_TAIL(&ncneg, ncp, nc_dst);
-		numneg++;
+		cache_negative_insert(ncp);
 		SDT_PROBE2(vfs, namecache, enter_negative, done, dvp,
 		    nc_get_name(ncp));
 	}
-	if (numneg * ncnegfactor > numcache) {
-		ncp = TAILQ_FIRST(&ncneg);
-		KASSERT(ncp->nc_vp == NULL, ("ncp %p vp %p on ncneg",
-		    ncp, ncp->nc_vp));
-		cache_zap(ncp);
-	}
+	if (numneg * ncnegfactor > numcache)
+		cache_negative_zap_one();
 	CACHE_WUNLOCK();
 }
 


More information about the svn-src-all mailing list