Author: kmacy
Date: Sat Mar 13 21:41:52 2010
New Revision: 205132
URL: http://svn.freebsd.org/changeset/base/205132

Log:
  Don't bottleneck on acquiring the stream locks - this avoids a massive
  drop off in throughput with large numbers of simultaneous reads
  
  MFC after:    7 days

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

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_zfetch.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_zfetch.c    Sat Mar 
13 21:28:14 2010        (r205131)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_zfetch.c    Sat Mar 
13 21:41:52 2010        (r205132)
@@ -49,11 +49,11 @@ uint32_t    zfetch_block_cap = 256;
 uint64_t       zfetch_array_rd_sz = 1024 * 1024;
 
 SYSCTL_DECL(_vfs_zfs);
-SYSCTL_INT(_vfs_zfs, OID_AUTO, prefetch_disable, CTLFLAG_RDTUN,
+SYSCTL_INT(_vfs_zfs, OID_AUTO, prefetch_disable, CTLFLAG_RW,
     &zfs_prefetch_disable, 0, "Disable prefetch");
 SYSCTL_NODE(_vfs_zfs, OID_AUTO, zfetch, CTLFLAG_RW, 0, "ZFS ZFETCH");
 TUNABLE_INT("vfs.zfs.zfetch.max_streams", &zfetch_max_streams);
-SYSCTL_UINT(_vfs_zfs_zfetch, OID_AUTO, max_streams, CTLFLAG_RDTUN,
+SYSCTL_UINT(_vfs_zfs_zfetch, OID_AUTO, max_streams, CTLFLAG_RW,
     &zfetch_max_streams, 0, "Max # of streams per zfetch");
 TUNABLE_INT("vfs.zfs.zfetch.min_sec_reap", &zfetch_min_sec_reap);
 SYSCTL_UINT(_vfs_zfs_zfetch, OID_AUTO, min_sec_reap, CTLFLAG_RDTUN,
@@ -338,8 +338,10 @@ top:
 
                        reset = !prefetched && zs->zst_len > 1;
 
-                       mutex_enter(&zs->zst_lock);
-
+                       if (mutex_tryenter(&zs->zst_lock) == 0) {
+                               rc = 1;
+                               goto out;
+                       }
                        if (zh->zst_offset != zs->zst_offset + zs->zst_len) {
                                mutex_exit(&zs->zst_lock);
                                goto top;
@@ -363,8 +365,10 @@ top:
 
                        reset = !prefetched && zs->zst_len > 1;
 
-                       mutex_enter(&zs->zst_lock);
-
+                       if (mutex_tryenter(&zs->zst_lock) == 0) {
+                               rc = 1;
+                               goto out;
+                       }
                        if (zh->zst_offset != zs->zst_offset - zh->zst_len) {
                                mutex_exit(&zs->zst_lock);
                                goto top;
@@ -391,8 +395,10 @@ top:
                    zs->zst_len) && (zs->zst_len != zs->zst_stride)) {
                        /* strided forward access */
 
-                       mutex_enter(&zs->zst_lock);
-
+                       if (mutex_tryenter(&zs->zst_lock) == 0) {
+                               rc = 1;
+                               goto out;
+                       }
                        if ((zh->zst_offset - zs->zst_offset - zs->zst_stride >=
                            zs->zst_len) || (zs->zst_len == zs->zst_stride)) {
                                mutex_exit(&zs->zst_lock);
@@ -408,8 +414,10 @@ top:
                    zs->zst_len) && (zs->zst_len != zs->zst_stride)) {
                        /* strided reverse access */
 
-                       mutex_enter(&zs->zst_lock);
-
+                       if (mutex_tryenter(&zs->zst_lock) == 0) {
+                               rc = 1;
+                               goto out;
+                       }
                        if ((zh->zst_offset - zs->zst_offset + zs->zst_stride >=
                            zs->zst_len) || (zs->zst_len == zs->zst_stride)) {
                                mutex_exit(&zs->zst_lock);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to