svn commit: r364066 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Mon Aug 10 10:35:19 UTC 2020
Author: mjg
Date: Mon Aug 10 10:35:18 2020
New Revision: 364066
URL: https://svnweb.freebsd.org/changeset/base/364066
Log:
vfs: partially support file create/delete/rename in lockless lookup
Perform the lookup until the last 2 elements and fallback to slowpath.
Tested by: pho
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/kern/vfs_cache.c
Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c Mon Aug 10 10:34:22 2020 (r364065)
+++ head/sys/kern/vfs_cache.c Mon Aug 10 10:35:18 2020 (r364066)
@@ -3143,8 +3143,8 @@ cache_fpl_handled_impl(struct cache_fpl *fpl, int erro
#define cache_fpl_handled(x, e) cache_fpl_handled_impl((x), (e), __LINE__)
#define CACHE_FPL_SUPPORTED_CN_FLAGS \
- (LOCKLEAF | LOCKPARENT | WANTPARENT | FOLLOW | LOCKSHARED | SAVENAME | \
- ISOPEN | NOMACCHECK | AUDITVNODE1 | AUDITVNODE2)
+ (LOCKLEAF | LOCKPARENT | WANTPARENT | NOCACHE | FOLLOW | LOCKSHARED | SAVENAME | \
+ WILLBEDIR | ISOPEN | NOMACCHECK | AUDITVNODE1 | AUDITVNODE2)
#define CACHE_FPL_INTERNAL_CN_FLAGS \
(ISDOTDOT | MAKEENTRY | ISLASTCN)
@@ -3194,10 +3194,6 @@ cache_can_fplookup(struct cache_fpl *fpl)
cache_fpl_aborted(fpl);
return (false);
}
- if (cnp->cn_nameiop != LOOKUP) {
- cache_fpl_aborted(fpl);
- return (false);
- }
if (ndp->ni_dirfd != AT_FDCWD) {
cache_fpl_aborted(fpl);
return (false);
@@ -3407,6 +3403,22 @@ cache_fplookup_final_child(struct cache_fpl *fpl, enum
return (cache_fpl_handled(fpl, 0));
}
+/*
+ * They want to possibly modify the state of the namecache.
+ *
+ * Don't try to match the API contract, just leave.
+ * TODO: this leaves scalability on the table
+ */
+static int
+cache_fplookup_final_modifying(struct cache_fpl *fpl)
+{
+ struct componentname *cnp;
+
+ cnp = fpl->cnp;
+ MPASS(cnp->cn_nameiop != LOOKUP);
+ return (cache_fpl_partial(fpl));
+}
+
static int __noinline
cache_fplookup_final_withparent(struct cache_fpl *fpl)
{
@@ -3489,6 +3501,10 @@ cache_fplookup_final(struct cache_fpl *fpl)
VNPASS(cache_fplookup_vnode_supported(dvp), dvp);
+ if (cnp->cn_nameiop != LOOKUP) {
+ return (cache_fplookup_final_modifying(fpl));
+ }
+
if ((cnp->cn_flags & (LOCKPARENT|WANTPARENT)) != 0)
return (cache_fplookup_final_withparent(fpl));
@@ -3633,6 +3649,12 @@ 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 == CREATE)) {
+ return (cache_fpl_partial(fpl));
+ }
negstate = NCP2NEGSTATE(ncp);
neg_hot = ((negstate->neg_flag & NEG_HOT) != 0);
if (__predict_false(!cache_ncp_canuse(ncp))) {
More information about the svn-src-all
mailing list