diff --git a/include/sys/zfs_context.h b/include/sys/zfs_context.h index 2ac41e007..1027e7215 100644 --- a/include/sys/zfs_context.h +++ b/include/sys/zfs_context.h @@ -368,6 +368,7 @@ typedef void (task_func_t)(void *); #define TASKQ_DYNAMIC 0x0004 /* Use dynamic thread scheduling */ #define TASKQ_THREADS_CPU_PCT 0x0008 /* Scale # threads by # cpus */ #define TASKQ_DC_BATCH 0x0010 /* Mark threads as batch */ +#define TASKQ_NORECLAIM 0x0020 /* Disable direct memory reclaim */ #define TQ_SLEEP KM_SLEEP /* Can block for memory */ #define TQ_NOSLEEP KM_NOSLEEP /* cannot block for memory; may fail */ 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); } } }