Author: delphij
Date: Mon Oct 20 22:13:50 2014
New Revision: 273348
URL: https://svnweb.freebsd.org/changeset/base/273348

Log:
  MFC r272598: MFV r272585:
  
  Split the godfather zio into CPU number's to reduce lock
  contention.
  
  Illumos issue:
      5176 lock contention on godfather zio

Modified:
  stable/10/cddl/contrib/opensolaris/cmd/zdb/zdb.c
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/cddl/contrib/opensolaris/cmd/zdb/zdb.c
==============================================================================
--- stable/10/cddl/contrib/opensolaris/cmd/zdb/zdb.c    Mon Oct 20 22:09:30 
2014        (r273347)
+++ stable/10/cddl/contrib/opensolaris/cmd/zdb/zdb.c    Mon Oct 20 22:13:50 
2014        (r273348)
@@ -2594,10 +2594,12 @@ dump_block_stats(spa_t *spa)
         * all async I/Os to complete.
         */
        if (dump_opt['c']) {
-               (void) zio_wait(spa->spa_async_zio_root);
-               spa->spa_async_zio_root = zio_root(spa, NULL, NULL,
-                   ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE |
-                   ZIO_FLAG_GODFATHER);
+               for (int i = 0; i < max_ncpus; i++) {
+                       (void) zio_wait(spa->spa_async_zio_root[i]);
+                       spa->spa_async_zio_root[i] = zio_root(spa, NULL, NULL,
+                           ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE |
+                           ZIO_FLAG_GODFATHER);
+               }
        }
 
        if (zcb.zcb_haderrors) {

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c      Mon Oct 
20 22:09:30 2014        (r273347)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c      Mon Oct 
20 22:13:50 2014        (r273348)
@@ -1274,7 +1274,9 @@ spa_unload(spa_t *spa)
         * Wait for any outstanding async I/O to complete.
         */
        if (spa->spa_async_zio_root != NULL) {
-               (void) zio_wait(spa->spa_async_zio_root);
+               for (int i = 0; i < max_ncpus; i++)
+                       (void) zio_wait(spa->spa_async_zio_root[i]);
+               kmem_free(spa->spa_async_zio_root, max_ncpus * sizeof (void *));
                spa->spa_async_zio_root = NULL;
        }
 
@@ -2210,8 +2212,13 @@ spa_load_impl(spa_t *spa, uint64_t pool_
        /*
         * Create "The Godfather" zio to hold all async IOs
         */
-       spa->spa_async_zio_root = zio_root(spa, NULL, NULL,
-           ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE | ZIO_FLAG_GODFATHER);
+       spa->spa_async_zio_root = kmem_alloc(max_ncpus * sizeof (void *),
+           KM_SLEEP);
+       for (int i = 0; i < max_ncpus; i++) {
+               spa->spa_async_zio_root[i] = zio_root(spa, NULL, NULL,
+                   ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE |
+                   ZIO_FLAG_GODFATHER);
+       }
 
        /*
         * Parse the configuration into a vdev tree.  We explicitly set the
@@ -3564,8 +3571,13 @@ spa_create(const char *pool, nvlist_t *n
        /*
         * Create "The Godfather" zio to hold all async IOs
         */
-       spa->spa_async_zio_root = zio_root(spa, NULL, NULL,
-           ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE | ZIO_FLAG_GODFATHER);
+       spa->spa_async_zio_root = kmem_alloc(max_ncpus * sizeof (void *),
+           KM_SLEEP);
+       for (int i = 0; i < max_ncpus; i++) {
+               spa->spa_async_zio_root[i] = zio_root(spa, NULL, NULL,
+                   ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE |
+                   ZIO_FLAG_GODFATHER);
+       }
 
        /*
         * Create the root vdev.

Modified: 
stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h     
Mon Oct 20 22:09:30 2014        (r273347)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h     
Mon Oct 20 22:13:50 2014        (r273348)
@@ -206,7 +206,8 @@ struct spa {
        uint64_t        spa_failmode;           /* failure mode for the pool */
        uint64_t        spa_delegation;         /* delegation on/off */
        list_t          spa_config_list;        /* previous cache file(s) */
-       zio_t           *spa_async_zio_root;    /* root of all async I/O */
+       /* per-CPU array of root of async I/O: */
+       zio_t           **spa_async_zio_root;
        zio_t           *spa_suspend_zio_root;  /* root of all suspended I/O */
        kmutex_t        spa_suspend_lock;       /* protects suspend_zio_root */
        kcondvar_t      spa_suspend_cv;         /* notification of resume */

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c      Mon Oct 
20 22:09:30 2014        (r273347)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c      Mon Oct 
20 22:13:50 2014        (r273348)
@@ -1462,7 +1462,7 @@ zio_nowait(zio_t *zio)
                 */
                spa_t *spa = zio->io_spa;
 
-               zio_add_child(spa->spa_async_zio_root, zio);
+               zio_add_child(spa->spa_async_zio_root[CPU_SEQID], zio);
        }
 
        zio_execute(zio);
_______________________________________________
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