git: deabdc686874 - main - cache: stop pre-checking seqc when starting the lookup

Mateusz Guzik mjg at FreeBSD.org
Wed Jan 6 07:36:12 UTC 2021


The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=deabdc686874411bd32775c3bdd04c04d9eff3e5

commit deabdc686874411bd32775c3bdd04c04d9eff3e5
Author:     Mateusz Guzik <mjg at FreeBSD.org>
AuthorDate: 2021-01-06 06:12:58 +0000
Commit:     Mateusz Guzik <mjg at FreeBSD.org>
CommitDate: 2021-01-06 07:28:07 +0000

    cache: stop pre-checking seqc when starting the lookup
    
    Tested by:      pho
---
 sys/kern/vfs_cache.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index 710c499d6bb5..138a55f94dbd 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -5032,7 +5032,7 @@ cache_fplookup_skip_slashes(struct cache_fpl *fpl)
 	ndp->ni_next = cnp->cn_nameptr;
 
 	/*
-	 * Retry the lookup, similar to dot lookups.
+	 * See cache_fplookup_dot.
 	 */
 	fpl->tvp = fpl->dvp;
 	fpl->tvp_seqc = fpl->dvp_seqc;
@@ -5139,11 +5139,14 @@ cache_fplookup_impl(struct vnode *dvp, struct cache_fpl *fpl)
 
 	cache_fpl_checkpoint(fpl, &fpl->snd);
 
+	/*
+	 * The vnode is hand is almost always stable, skip checking for it.
+	 * Worst case this postpones the check towards the end of the iteration
+	 * of the main loop.
+	 */
 	fpl->dvp = dvp;
-	fpl->dvp_seqc = vn_seqc_read_any(fpl->dvp);
-	if (seqc_in_modify(fpl->dvp_seqc)) {
-		return (cache_fpl_aborted(fpl));
-	}
+	fpl->dvp_seqc = vn_seqc_read_notmodify(fpl->dvp);
+
 	mp = atomic_load_ptr(&dvp->v_mount);
 	if (__predict_false(mp == NULL || !cache_fplookup_mp_supported(mp))) {
 		return (cache_fpl_aborted(fpl));


More information about the dev-commits-src-all mailing list