summaryrefslogtreecommitdiffstats
path: root/module/zfs/spa.c
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2011-05-06 15:12:15 -0700
committerBrian Behlendorf <[email protected]>2011-05-06 15:26:26 -0700
commit21ade34764d11498abece590b965ce766f31de88 (patch)
treec42ae469dd9f39192d951a851e421179170abcb4 /module/zfs/spa.c
parent3117dd0b9005eb76e483b9772c493883b82998bb (diff)
Disable direct reclaim for z_wr_* threads
The direct reclaim path in the z_wr_* threads must be disabled to ensure forward progress is always maintained for txg processing. This ensures that a txg will never get stuck waiting on itself because it entered the following memory reclaim callpath. ->prune_icache()->dispose_list()->zpl_clear_inode()->zfs_inactive() ->dmu_tx_assign()->dmu_tx_wait()->tgx_wait_open() It would be preferable to target this exact code path but the kernel offers no way to do this without custom patches. To avoid this we are forced to disable all reclaim for these threads. It should not be necessary to do this for other other z_* threads because they will not hold a txg open. Closes #232
Diffstat (limited to 'module/zfs/spa.c')
-rw-r--r--module/zfs/spa.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/module/zfs/spa.c b/module/zfs/spa.c
index 3599e61c9..57d25c3d1 100644
--- a/module/zfs/spa.c
+++ b/module/zfs/spa.c
@@ -614,9 +614,8 @@ spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub)
static taskq_t *
spa_taskq_create(spa_t *spa, const char *name, enum zti_modes mode,
- uint_t value)
+ uint_t value, uint_t flags)
{
- uint_t flags = TASKQ_PREPOPULATE;
boolean_t batch = B_FALSE;
switch (mode) {
@@ -666,13 +665,17 @@ spa_create_zio_taskqs(spa_t *spa)
const zio_taskq_info_t *ztip = &zio_taskqs[t][q];
enum zti_modes mode = ztip->zti_mode;
uint_t value = ztip->zti_value;
+ uint_t flags = TASKQ_PREPOPULATE;
char name[32];
+ if (t == ZIO_TYPE_WRITE)
+ flags |= TASKQ_NORECLAIM;
+
(void) snprintf(name, sizeof (name),
"%s_%s", zio_type_name[t], zio_taskq_types[q]);
spa->spa_zio_taskq[t][q] =
- spa_taskq_create(spa, name, mode, value);
+ spa_taskq_create(spa, name, mode, value, flags);
}
}
}