git: kernel - Refactor vfs_cache 4/N
Matthew Dillon
dillon at crater.dragonflybsd.org
Mon Mar 2 17:29:12 PST 2020
commit 377c06c29cd595c7b8112502da809b981775f531
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Mon Mar 2 17:11:35 2020 -0800
kernel - Refactor vfs_cache 4/N
* Refactor cache_findmount() to operate conflict-free and cache line
bounce free for the most part. The counter trick is used to probe
cache entries and combined with a local pcpu spinlock to interlock
against unmounts.
The umount code is now a bit more expensive (it has to acquire all
pcpu umount spinlocks before cleaning the cache out).
This code is not ideal but it performs up to 6x better on multple cpus.
* Refactor _cache_mntref() to use a 4-way set association.
* Rewrite cache_copy() and cache_drop_and_cache()'s caching algorithm.
* Use cache_dvpref() from nlookup() instead of rolling the code twice.
* Rewrite the nlookup*() and cache_nlookup*() code to generally leave
namecache records unlocked throughout, removing one layer of shared
locks from cpu contention. Only the last element is locked.
* Refactor nlookup*()'s handling of absolute paths a bit more.
* Refactor nlookup*()'s handling of NLC_REFDVP to better-validate
that the parent directory is actually the parent directory.
This also necessitates a nlookupdata.nl_dvp check in various system
calls using NLC_REFDVP to detect the mount-point case and return
the proper error code (usually EINVAL, but e.g. mkdir would return
EEXIST).
* Clean up _cache_lock() and friends to restore the diagnostic messages
when a namecache lock stalls for too long.
* FIX: Fix bugs in nlookup*() retry code. The retry code was not properly
unwinding symlink path construction during the loop and also not properly
resetting the base directory when looping up. This primarily effects NFS.
* NOTE: Using iscsi_crc32() at the moment to get a good hash distribution.
This is obviously expensive, but at least it is per-cpu.
* NOTE: The cache_nlookup() nchpp cache still has a shared spin-lock
that will cache-line-bounce concurrent aquisitions.
Summary of changes:
sys/kern/vfs_cache.c | 809 +++++++++++++++++++++++++++++++-----------------
sys/kern/vfs_nlookup.c | 484 +++++++++++++++++++----------
sys/kern/vfs_syscalls.c | 26 +-
sys/sys/namecache.h | 15 +-
sys/sys/nlookup.h | 8 +-
sys/sys/spinlock2.h | 9 +
6 files changed, 886 insertions(+), 465 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/377c06c29cd595c7b8112502da809b981775f531
--
DragonFly BSD source repository
More information about the Commits
mailing list