From f200b836734550ba258a0d7e05381dc8cebf80f4 Mon Sep 17 00:00:00 2001 From: Chunwei Chen Date: Thu, 8 Dec 2016 13:00:20 -0800 Subject: [PATCH] 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 Signed-off-by: Chunwei Chen Closes #588 --- include/sys/taskq.h | 2 ++ module/spl/spl-taskq.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/sys/taskq.h b/include/sys/taskq.h index 1eecda4..5adda88 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 b362bef..83f483e 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; -- 2.39.2