diff options
author | Mateusz Guzik <[email protected]> | 2020-11-04 17:28:56 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2021-03-12 15:51:48 -0800 |
commit | e3e82dcc515586d460bb739ceb549443df26a863 (patch) | |
tree | 5f086b467ecfa7bcd76e3abb894b31a1d4ceb9af /include/os | |
parent | 5ebe425a5bf332ab1d77d78eb3bfd9594b5d7250 (diff) |
FreeBSD: switch teardown lock to rms
This deserializes otherwise non-contending operations.
The previous scheme of using 17 locks hashed by curthread runs into
conflicts very quickly. Check the pull request for sample results.
Reviewed-by: Ryan Moeller <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Matt Macy <[email protected]>
Signed-off-by: Mateusz Guzik <[email protected]>
Closes #11153
Diffstat (limited to 'include/os')
-rw-r--r-- | include/os/freebsd/zfs/sys/zfs_vfsops_os.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/os/freebsd/zfs/sys/zfs_vfsops_os.h b/include/os/freebsd/zfs/sys/zfs_vfsops_os.h index f56facdef..a263b48f7 100644 --- a/include/os/freebsd/zfs/sys/zfs_vfsops_os.h +++ b/include/os/freebsd/zfs/sys/zfs_vfsops_os.h @@ -27,6 +27,10 @@ #ifndef _SYS_FS_ZFS_VFSOPS_H #define _SYS_FS_ZFS_VFSOPS_H +#if __FreeBSD_version >= 1300125 +#define TEARDOWN_RMS +#endif + #if __FreeBSD_version >= 1300109 #define TEARDOWN_INACTIVE_RMS #endif @@ -46,7 +50,11 @@ extern "C" { #endif +#ifdef TEARDOWN_RMS +typedef struct rmslock zfs_teardown_lock_t; +#else #define zfs_teardown_lock_t rrmlock_t +#endif #ifdef TEARDOWN_INACTIVE_RMS typedef struct rmslock zfs_teardown_inactive_lock_t; @@ -114,6 +122,40 @@ struct zfsvfs { struct task z_unlinked_drain_task; }; +#ifdef TEARDOWN_RMS +#define ZFS_TEARDOWN_INIT(zfsvfs) \ + rms_init(&(zfsvfs)->z_teardown_lock, "zfs teardown") + +#define ZFS_TEARDOWN_DESTROY(zfsvfs) \ + rms_destroy(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_TRY_ENTER_READ(zfsvfs) \ + rms_try_rlock(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_ENTER_READ(zfsvfs, tag) \ + rms_rlock(&(zfsvfs)->z_teardown_lock); + +#define ZFS_TEARDOWN_EXIT_READ(zfsvfs, tag) \ + rms_runlock(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, tag) \ + rms_wlock(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_EXIT_WRITE(zfsvfs) \ + rms_wunlock(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_EXIT(zfsvfs, tag) \ + rms_unlock(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_READ_HELD(zfsvfs) \ + rms_rowned(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_WRITE_HELD(zfsvfs) \ + rms_wowned(&(zfsvfs)->z_teardown_lock) + +#define ZFS_TEARDOWN_HELD(zfsvfs) \ + rms_owned_any(&(zfsvfs)->z_teardown_lock) +#else #define ZFS_TEARDOWN_INIT(zfsvfs) \ rrm_init(&(zfsvfs)->z_teardown_lock, B_FALSE) @@ -146,6 +188,7 @@ struct zfsvfs { #define ZFS_TEARDOWN_HELD(zfsvfs) \ RRM_LOCK_HELD(&(zfsvfs)->z_teardown_lock) +#endif #ifdef TEARDOWN_INACTIVE_RMS #define ZFS_TEARDOWN_INACTIVE_INIT(zfsvfs) \ |