svn commit: r325456 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Sun Nov 5 22:28:41 UTC 2017
Author: mjg
Date: Sun Nov 5 22:28:39 2017
New Revision: 325456
URL: https://svnweb.freebsd.org/changeset/base/325456
Log:
namecache: wlock buckets in cache_lookup_nomakeentry
Since the case of an empty chain was already covered, it si very likely
that the existing entry is matching. Skipping readlocking saves on lock
upgrade.
Modified:
head/sys/kern/vfs_cache.c
Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c Sun Nov 5 22:22:22 2017 (r325455)
+++ head/sys/kern/vfs_cache.c Sun Nov 5 22:28:39 2017 (r325456)
@@ -984,6 +984,28 @@ out:
}
static int
+cache_zap_wlocked_bucket(struct namecache *ncp, struct rwlock *blp)
+{
+ struct mtx *dvlp, *vlp;
+
+ cache_assert_bucket_locked(ncp, RA_WLOCKED);
+
+ dvlp = VP2VNODELOCK(ncp->nc_dvp);
+ vlp = NULL;
+ if (!(ncp->nc_flag & NCF_NEGATIVE))
+ vlp = VP2VNODELOCK(ncp->nc_vp);
+ if (cache_trylock_vnodes(dvlp, vlp) == 0) {
+ cache_zap_locked(ncp, false);
+ rw_wunlock(blp);
+ cache_unlock_vnodes(dvlp, vlp);
+ return (0);
+ }
+
+ rw_wunlock(blp);
+ return (EAGAIN);
+}
+
+static int
cache_zap_rlocked_bucket(struct namecache *ncp, struct rwlock *blp)
{
struct mtx *dvlp, *vlp;
@@ -1166,7 +1188,7 @@ retry:
if (LIST_EMPTY(NCHHASH(hash)))
goto out_no_entry;
- rw_rlock(blp);
+ rw_wlock(blp);
LIST_FOREACH(ncp, (NCHHASH(hash)), nc_hash) {
counter_u64_add(numchecks, 1);
@@ -1177,13 +1199,13 @@ retry:
/* We failed to find an entry */
if (ncp == NULL) {
- rw_runlock(blp);
+ rw_wunlock(blp);
goto out_no_entry;
}
counter_u64_add(numposzaps, 1);
- error = cache_zap_rlocked_bucket(ncp, blp);
+ error = cache_zap_wlocked_bucket(ncp, blp);
if (error != 0) {
zap_and_exit_bucket_fail++;
cache_maybe_yield();
More information about the svn-src-all
mailing list