git: 1365b5f86f63 - main - cache: fold NCF_WHITE check into the rest
Mateusz Guzik
mjg at FreeBSD.org
Fri Jan 1 00:11:53 UTC 2021
The branch main has been updated by mjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=1365b5f86f631ab6b30fd5f71685e39aa8887474
commit 1365b5f86f631ab6b30fd5f71685e39aa8887474
Author: Mateusz Guzik <mjg at FreeBSD.org>
AuthorDate: 2020-12-28 11:24:48 +0000
Commit: Mateusz Guzik <mjg at FreeBSD.org>
CommitDate: 2021-01-01 00:10:43 +0000
cache: fold NCF_WHITE check into the rest
Tested by: pho
---
sys/kern/vfs_cache.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index 40cd174e1022..4b8940b7511c 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -263,6 +263,18 @@ cache_ncp_invalidate(struct namecache *ncp)
__predict_true((_nc_flag & (NCF_INVALID | NCF_WIP)) == 0); \
})
+/*
+ * Like the above but also checks NCF_WHITE.
+ */
+#define cache_fpl_neg_ncp_canuse(ncp) ({ \
+ struct namecache *_ncp = (ncp); \
+ u_char _nc_flag; \
+ \
+ atomic_thread_fence_acq(); \
+ _nc_flag = atomic_load_char(&_ncp->nc_flag); \
+ __predict_true((_nc_flag & (NCF_INVALID | NCF_WIP | NCF_WHITE)) == 0); \
+})
+
/*
* Name caching works as follows:
*
@@ -4505,11 +4517,7 @@ cache_fplookup_neg(struct cache_fpl *fpl, struct namecache *ncp, uint32_t hash)
return (cache_fplookup_modifying(fpl));
}
neg_promote = cache_neg_hit_prep(ncp);
- if (!cache_ncp_canuse(ncp)) {
- cache_neg_hit_abort(ncp);
- return (cache_fpl_partial(fpl));
- }
- if (__predict_false((nc_flag & NCF_WHITE) != 0)) {
+ if (!cache_fpl_neg_ncp_canuse(ncp)) {
cache_neg_hit_abort(ncp);
return (cache_fpl_partial(fpl));
}
More information about the dev-commits-src-all
mailing list