Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Jan 2020 08:38:38 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r357322 - in head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys
Message-ID:  <202001310838.00V8ccxJ057858@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Fri Jan 31 08:38:38 2020
New Revision: 357322
URL: https://svnweb.freebsd.org/changeset/base/357322

Log:
  zfs: convert z_teardown_inactive_lock to sleepable read-mostly lock
  
  This eliminates a global serialisation point. It only gets write locked
  on unmount.
  
  Sample result doing an incremental -j 40 build:
  before: 173.30s user 458.97s system 2595% cpu 24.358 total
  after:  168.58s user 254.92s system 2211% cpu 19.147 total

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h	Fri Jan 31 08:37:35 2020	(r357321)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h	Fri Jan 31 08:38:38 2020	(r357322)
@@ -33,6 +33,7 @@
 #include <sys/sa.h>
 #include <sys/rrwlock.h>
 #include <sys/zfs_ioctl.h>
+#include <sys/rmlock.h>
 
 #ifdef	__cplusplus
 extern "C" {
@@ -65,7 +66,7 @@ struct zfsvfs {
 	boolean_t	z_atime;	/* enable atimes mount option */
 	boolean_t	z_unmounted;	/* unmounted */
 	rrmlock_t	z_teardown_lock;
-	krwlock_t	z_teardown_inactive_lock;
+	struct rmslock	z_teardown_inactive_lock;
 	list_t		z_all_znodes;	/* all vnodes in the fs */
 	kmutex_t	z_znodes_lock;	/* lock for z_all_znodes */
 	struct zfsctl_root	*z_ctldir;	/* .zfs directory pointer */
@@ -91,22 +92,22 @@ struct zfsvfs {
 };
 
 #define	ZFS_TRYRLOCK_TEARDOWN_INACTIVE(zfsvfs) \
-		rw_tryenter(&(zfsvfs)->z_teardown_inactive_lock, RW_READER)
+		rms_try_rlock(&(zfsvfs)->z_teardown_inactive_lock)
 
 #define	ZFS_RLOCK_TEARDOWN_INACTIVE(zfsvfs) \
-		rw_enter(&(zfsvfs)->z_teardown_inactive_lock, RW_READER)
+		rms_rlock(&(zfsvfs)->z_teardown_inactive_lock)
 
 #define	ZFS_RUNLOCK_TEARDOWN_INACTIVE(zfsvfs) \
-		rw_exit(&(zfsvfs)->z_teardown_inactive_lock)
+		rms_runlock(&(zfsvfs)->z_teardown_inactive_lock)
 
 #define	ZFS_WLOCK_TEARDOWN_INACTIVE(zfsvfs) \
-		rw_enter(&(zfsvfs)->z_teardown_inactive_lock, RW_WRITER)
+		rms_wlock(&(zfsvfs)->z_teardown_inactive_lock)
 
 #define	ZFS_WUNLOCK_TEARDOWN_INACTIVE(zfsvfs) \
-		rw_exit(&(zfsvfs)->z_teardown_inactive_lock)
+		rms_wunlock(&(zfsvfs)->z_teardown_inactive_lock)
 
 #define	ZFS_WLOCK_TEARDOWN_INACTIVE_WLOCKED(zfsvfs) \
-		RW_WRITE_HELD(&(zfsvfs)->z_teardown_inactive_lock)
+		rms_wowned(&(zfsvfs)->z_teardown_inactive_lock)
 
 /*
  * Normal filesystems (those not under .zfs/snapshot) have a total

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c	Fri Jan 31 08:37:35 2020	(r357321)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c	Fri Jan 31 08:38:38 2020	(r357322)
@@ -1205,7 +1205,7 @@ zfsvfs_create_impl(zfsvfs_t **zfvp, zfsvfs_t *zfsvfs, 
 #else
 	rrm_init(&zfsvfs->z_teardown_lock, B_FALSE);
 #endif
-	rw_init(&zfsvfs->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL);
+	rms_init(&zfsvfs->z_teardown_inactive_lock, "zfs teardown inactive");
 	rw_init(&zfsvfs->z_fuid_lock, NULL, RW_DEFAULT, NULL);
 	for (int i = 0; i != ZFS_OBJ_MTX_SZ; i++)
 		mutex_init(&zfsvfs->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
@@ -1322,7 +1322,7 @@ zfsvfs_free(zfsvfs_t *zfsvfs)
 	mutex_destroy(&zfsvfs->z_lock);
 	list_destroy(&zfsvfs->z_all_znodes);
 	rrm_destroy(&zfsvfs->z_teardown_lock);
-	rw_destroy(&zfsvfs->z_teardown_inactive_lock);
+	rms_destroy(&zfsvfs->z_teardown_inactive_lock);
 	rw_destroy(&zfsvfs->z_fuid_lock);
 	for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
 		mutex_destroy(&zfsvfs->z_hold_mtx[i]);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202001310838.00V8ccxJ057858>