aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_cache.c
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-01-01 07:06:12 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-01-06 07:28:06 +0000
commit33f3e81df531d62a53390de20812d4e94720e1d3 (patch)
tree72b585160b94d53b9b42206d76210c30e5907af5 /sys/kern/vfs_cache.c
parentdbbbc07cc3e5e6843ca95550ca2f50e329e93a9e (diff)
downloadsrc-33f3e81df531d62a53390de20812d4e94720e1d3.tar.gz
src-33f3e81df531d62a53390de20812d4e94720e1d3.zip
cache: combine fast path enabled status into one flag
Tested by: pho
Diffstat (limited to 'sys/kern/vfs_cache.c')
-rw-r--r--sys/kern/vfs_cache.c51
1 files changed, 39 insertions, 12 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index ad661339b492..40298cd9fbdc 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -3571,12 +3571,45 @@ DB_SHOW_COMMAND(vpath, db_show_vpath)
#endif
-static bool __read_frequently cache_fast_lookup = true;
-SYSCTL_BOOL(_vfs, OID_AUTO, cache_fast_lookup, CTLFLAG_RW,
- &cache_fast_lookup, 0, "");
+static int cache_fast_lookup = 1;
+static char __read_frequently cache_fast_lookup_enabled = true;
#define CACHE_FPL_FAILED -2020
+void
+cache_fast_lookup_enabled_recalc(void)
+{
+ int lookup_flag;
+ int mac_on;
+
+#ifdef MAC
+ mac_on = mac_vnode_check_lookup_enabled();
+#else
+ mac_on = 0;
+#endif
+
+ lookup_flag = atomic_load_int(&cache_fast_lookup);
+ if (lookup_flag && !mac_on) {
+ atomic_store_char(&cache_fast_lookup_enabled, true);
+ } else {
+ atomic_store_char(&cache_fast_lookup_enabled, false);
+ }
+}
+
+static int
+syscal_vfs_cache_fast_lookup(SYSCTL_HANDLER_ARGS)
+{
+ int error, old;
+
+ old = atomic_load_int(&cache_fast_lookup);
+ error = sysctl_handle_int(oidp, arg1, arg2, req);
+ if (error == 0 && req->newptr && old != atomic_load_int(&cache_fast_lookup))
+ cache_fast_lookup_enabled_recalc();
+ return (error);
+}
+SYSCTL_PROC(_vfs, OID_AUTO, cache_fast_lookup, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_MPSAFE,
+ &cache_fast_lookup, 0, syscal_vfs_cache_fast_lookup, "IU", "");
+
/*
* Components of nameidata (or objects it can point to) which may
* need restoring in case fast path lookup fails.
@@ -3854,16 +3887,10 @@ cache_can_fplookup(struct cache_fpl *fpl)
cnp = fpl->cnp;
td = cnp->cn_thread;
- if (!cache_fast_lookup) {
- cache_fpl_aborted_early(fpl);
- return (false);
- }
-#ifdef MAC
- if (mac_vnode_check_lookup_enabled()) {
+ if (!atomic_load_char(&cache_fast_lookup_enabled)) {
cache_fpl_aborted_early(fpl);
return (false);
}
-#endif
if ((cnp->cn_flags & ~CACHE_FPL_SUPPORTED_CN_FLAGS) != 0) {
cache_fpl_aborted_early(fpl);
return (false);
@@ -5205,9 +5232,9 @@ cache_fplookup(struct nameidata *ndp, enum cache_fpl_status *status,
}
MPASS(cnp->cn_nameptr == cnp->cn_pnbuf);
- if (!cache_can_fplookup(&fpl)) {
- SDT_PROBE3(vfs, fplookup, lookup, done, ndp, fpl.line, fpl.status);
+ if (__predict_false(!cache_can_fplookup(&fpl))) {
*status = fpl.status;
+ SDT_PROBE3(vfs, fplookup, lookup, done, ndp, fpl.line, fpl.status);
return (EOPNOTSUPP);
}