mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-30 18:56:23 +03:00
Illumos 5008 - lock contention (rrw_exit) while running a read only load
5008 lock contention (rrw_exit) while running a read only load Reviewed by: Matthew Ahrens <matthew.ahrens@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Alex Reece <alex.reece@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Reviewed by: Richard Yao <ryao@gentoo.org> Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com> Approved by: Garrett D'Amore <garrett@damore.org> Porting notes: This patch ported perfectly cleanly to ZoL. During testing 100% cached small-block reads, extreme contention was noticed on rrl->rr_lock from rrw_exit() due to the frequent entering and leaving ZPL. Illumos picked up this patch from FreeBSD and it also helps under Linux. On a 1-minute 4K cached read test with 10 fio processes pinned to a single socket on a 4-socket (10 thread per socket) NUMA system, contentions on rrl->rr_lock were reduced from 508799 to 43085. Ported-by: Tim Chase <tim@chase2k.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #3555
This commit is contained in:
committed by
Brian Behlendorf
parent
4bda3bd0e7
commit
e16b3fcc61
@@ -771,7 +771,7 @@ zfs_sb_create(const char *osname, zfs_sb_t **zsbp)
|
||||
mutex_init(&zsb->z_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
list_create(&zsb->z_all_znodes, sizeof (znode_t),
|
||||
offsetof(znode_t, z_link_node));
|
||||
rrw_init(&zsb->z_teardown_lock, B_FALSE);
|
||||
rrm_init(&zsb->z_teardown_lock, B_FALSE);
|
||||
rw_init(&zsb->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL);
|
||||
rw_init(&zsb->z_fuid_lock, NULL, RW_DEFAULT, NULL);
|
||||
|
||||
@@ -890,7 +890,7 @@ zfs_sb_free(zfs_sb_t *zsb)
|
||||
mutex_destroy(&zsb->z_znodes_lock);
|
||||
mutex_destroy(&zsb->z_lock);
|
||||
list_destroy(&zsb->z_all_znodes);
|
||||
rrw_destroy(&zsb->z_teardown_lock);
|
||||
rrm_destroy(&zsb->z_teardown_lock);
|
||||
rw_destroy(&zsb->z_teardown_inactive_lock);
|
||||
rw_destroy(&zsb->z_fuid_lock);
|
||||
for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
|
||||
@@ -1221,7 +1221,7 @@ zfs_sb_teardown(zfs_sb_t *zsb, boolean_t unmounting)
|
||||
}
|
||||
}
|
||||
|
||||
rrw_enter(&zsb->z_teardown_lock, RW_WRITER, FTAG);
|
||||
rrm_enter(&zsb->z_teardown_lock, RW_WRITER, FTAG);
|
||||
|
||||
if (!unmounting) {
|
||||
/*
|
||||
@@ -1252,7 +1252,7 @@ zfs_sb_teardown(zfs_sb_t *zsb, boolean_t unmounting)
|
||||
*/
|
||||
if (!unmounting && (zsb->z_unmounted || zsb->z_os == NULL)) {
|
||||
rw_exit(&zsb->z_teardown_inactive_lock);
|
||||
rrw_exit(&zsb->z_teardown_lock, FTAG);
|
||||
rrm_exit(&zsb->z_teardown_lock, FTAG);
|
||||
return (SET_ERROR(EIO));
|
||||
}
|
||||
|
||||
@@ -1280,7 +1280,7 @@ zfs_sb_teardown(zfs_sb_t *zsb, boolean_t unmounting)
|
||||
*/
|
||||
if (unmounting) {
|
||||
zsb->z_unmounted = B_TRUE;
|
||||
rrw_exit(&zsb->z_teardown_lock, FTAG);
|
||||
rrm_exit(&zsb->z_teardown_lock, FTAG);
|
||||
rw_exit(&zsb->z_teardown_inactive_lock);
|
||||
}
|
||||
|
||||
@@ -1599,7 +1599,7 @@ zfs_resume_fs(zfs_sb_t *zsb, const char *osname)
|
||||
znode_t *zp;
|
||||
uint64_t sa_obj = 0;
|
||||
|
||||
ASSERT(RRW_WRITE_HELD(&zsb->z_teardown_lock));
|
||||
ASSERT(RRM_WRITE_HELD(&zsb->z_teardown_lock));
|
||||
ASSERT(RW_WRITE_HELD(&zsb->z_teardown_inactive_lock));
|
||||
|
||||
/*
|
||||
@@ -1663,7 +1663,7 @@ zfs_resume_fs(zfs_sb_t *zsb, const char *osname)
|
||||
bail:
|
||||
/* release the VFS ops */
|
||||
rw_exit(&zsb->z_teardown_inactive_lock);
|
||||
rrw_exit(&zsb->z_teardown_lock, FTAG);
|
||||
rrm_exit(&zsb->z_teardown_lock, FTAG);
|
||||
|
||||
if (err) {
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user