aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunwei Chen <[email protected]>2016-12-08 13:00:20 -0800
committerBrian Behlendorf <[email protected]>2016-12-08 14:00:20 -0700
commitf200b836734550ba258a0d7e05381dc8cebf80f4 (patch)
treea1abc270a47d214cf24a296c9cb1e7b657a2dac3
parent493492559e32aa77ff8a5b32572afab5b848a53b (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.h2
-rw-r--r--module/spl/spl-taskq.c14
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;