diff options
author | Chunwei Chen <[email protected]> | 2016-12-08 13:00:20 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-12-08 14:00:20 -0700 |
commit | f200b836734550ba258a0d7e05381dc8cebf80f4 (patch) | |
tree | a1abc270a47d214cf24a296c9cb1e7b657a2dac3 | |
parent | 493492559e32aa77ff8a5b32572afab5b848a53b (diff) |
Add system_delay_taskq for long delay
Add a dedicated system_delay_taskq for long delay like spa_deadman and
zpl_posix_acl_free. This will allow us to use system_taskq in the manner of
dispatch multiple tasks and call taskq_wait_outstanding.
Reviewed by: Brian Behlendorf <[email protected]>
Signed-off-by: Chunwei Chen <[email protected]>
Closes #588
-rw-r--r-- | include/sys/taskq.h | 2 | ||||
-rw-r--r-- | module/spl/spl-taskq.c | 14 |
2 files changed, 16 insertions, 0 deletions
diff --git a/include/sys/taskq.h b/include/sys/taskq.h index 1eecda4d2..5adda8827 100644 --- a/include/sys/taskq.h +++ b/include/sys/taskq.h @@ -129,6 +129,8 @@ typedef struct taskq_thread { /* Global system-wide dynamic task queue available for all consumers */ extern taskq_t *system_taskq; +/* Global dynamic task queue for long delay */ +extern taskq_t *system_delay_taskq; /* List of all taskqs */ extern struct list_head tq_list; diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c index b362bef54..83f483ea9 100644 --- a/module/spl/spl-taskq.c +++ b/module/spl/spl-taskq.c @@ -50,6 +50,9 @@ MODULE_PARM_DESC(spl_taskq_thread_sequential, /* Global system-wide dynamic task queue available for all consumers */ taskq_t *system_taskq; EXPORT_SYMBOL(system_taskq); +/* Global dynamic task queue for long delay */ +taskq_t *system_delay_taskq; +EXPORT_SYMBOL(system_delay_taskq); /* Private dedicated taskq for creating new taskq threads on demand. */ static taskq_t *dynamic_taskq; @@ -1238,10 +1241,18 @@ spl_taskq_init(void) if (system_taskq == NULL) return (1); + system_delay_taskq = taskq_create("spl_delay_taskq", MAX(boot_ncpus, 4), + maxclsyspri, boot_ncpus, INT_MAX, TASKQ_PREPOPULATE|TASKQ_DYNAMIC); + if (system_delay_taskq == NULL) { + taskq_destroy(system_taskq); + return (1); + } + dynamic_taskq = taskq_create("spl_dynamic_taskq", 1, maxclsyspri, boot_ncpus, INT_MAX, TASKQ_PREPOPULATE); if (dynamic_taskq == NULL) { taskq_destroy(system_taskq); + taskq_destroy(system_delay_taskq); return (1); } @@ -1261,6 +1272,9 @@ spl_taskq_fini(void) taskq_destroy(dynamic_taskq); dynamic_taskq = NULL; + taskq_destroy(system_delay_taskq); + system_delay_taskq = NULL; + taskq_destroy(system_taskq); system_taskq = NULL; |