5176 lock contention on godfather zio
Reviewed by: Adam Leventhal <ahl@delphix.com> Reviewed by: Alex Reece <alex.reece@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Richard Elling <richard.elling@gmail.com> Reviewed by: Bayard Bell <Bayard.Bell@nexenta.com> Approved by: Garrett D'Amore <garrett@damore.org> Author: Matthew Ahrens <mahrens@delphix.com> illumos/illumos-gate@6f834bc197
This commit is contained in:
parent
39eeb9830d
commit
58c4ebeee8
@ -2565,10 +2565,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) {
|
||||
|
@ -1222,7 +1222,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;
|
||||
}
|
||||
|
||||
@ -2141,8 +2143,13 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config,
|
||||
/*
|
||||
* 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
|
||||
@ -3481,8 +3488,13 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
|
||||
/*
|
||||
* 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.
|
||||
|
@ -204,7 +204,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 */
|
||||
|
@ -1367,7 +1367,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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user