mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Illumos 5176 - lock contention on godfather zio
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> References: https://www.illumos.org/issues/5176 https://github.com/illumos/illumos-gate/commit/6f834bc Porting notes: Under Linux max_ncpus is defined as num_possible_cpus(). This is largest number of cpu ids which might be available during the life time of the system boot. This value can be larger than the number of present cpus if CONFIG_HOTPLUG_CPU is defined. Ported by: Turbo Fredriksson <turbo@bayour.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #2711
This commit is contained in:
committed by
Brian Behlendorf
parent
07a3312f17
commit
e022864d19
+19
-7
@@ -1252,7 +1252,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 (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;
|
||||
}
|
||||
|
||||
@@ -2165,7 +2167,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config,
|
||||
uberblock_t *ub = &spa->spa_uberblock;
|
||||
uint64_t children, config_cache_txg = spa->spa_config_txg;
|
||||
int orig_mode = spa->spa_mode;
|
||||
int parse;
|
||||
int parse, i;
|
||||
uint64_t obj;
|
||||
boolean_t missing_feat_write = B_FALSE;
|
||||
|
||||
@@ -2189,8 +2191,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 (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
|
||||
@@ -3495,7 +3502,7 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
|
||||
uint64_t version, obj;
|
||||
boolean_t has_features;
|
||||
nvpair_t *elem;
|
||||
int c;
|
||||
int c, i;
|
||||
char *poolname;
|
||||
nvlist_t *nvl;
|
||||
|
||||
@@ -3556,8 +3563,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 (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.
|
||||
|
||||
+1
-1
@@ -1474,7 +1474,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);
|
||||
|
||||
Reference in New Issue
Block a user