aboutsummaryrefslogtreecommitdiffstats
path: root/module/spl/spl-generic.c
diff options
context:
space:
mode:
authorChunwei Chen <[email protected]>2015-12-02 14:52:46 -0800
committerBrian Behlendorf <[email protected]>2016-01-20 13:07:45 -0800
commit16522ac29023d94bc29e97761b01b252117cbbfe (patch)
treec05042fbea285fe0c73640afd915b3a3d69c8476 /module/spl/spl-generic.c
parentde77e245902cc5bb6c22591d54e31c7647ff912f (diff)
Use tsd to store tq for taskq_member
To prevent taskq_member holding tq_lock and doing linear search, thus causing contention. We store the taskq pointer to which the thread belongs in tsd. This way taskq_member will not need to touch tq_lock, and tsd has per slot spinlock. So the contention should be reduced greatly. Signed-off-by: Chunwei Chen <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #500 Closes #504 Closes #505
Diffstat (limited to 'module/spl/spl-generic.c')
-rw-r--r--module/spl/spl-generic.c49
1 files changed, 23 insertions, 26 deletions
diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c
index 4d9846cf5..dc3e74aa5 100644
--- a/module/spl/spl-generic.c
+++ b/module/spl/spl-generic.c
@@ -491,29 +491,20 @@ spl_kvmem_init(void)
rc = spl_kmem_init();
if (rc)
- goto out1;
+ return (rc);
rc = spl_vmem_init();
- if (rc)
- goto out2;
-
- rc = spl_kmem_cache_init();
- if (rc)
- goto out3;
+ if (rc) {
+ spl_kmem_fini();
+ return (rc);
+ }
return (rc);
-out3:
- spl_vmem_fini();
-out2:
- spl_kmem_fini();
-out1:
- return (rc);
}
static void
spl_kvmem_fini(void)
{
- spl_kmem_cache_fini();
spl_vmem_fini();
spl_kmem_fini();
}
@@ -532,38 +523,43 @@ spl_init(void)
if ((rc = spl_rw_init()))
goto out3;
- if ((rc = spl_taskq_init()))
+ if ((rc = spl_tsd_init()))
goto out4;
- if ((rc = spl_vn_init()))
+ if ((rc = spl_taskq_init()))
goto out5;
- if ((rc = spl_proc_init()))
+ if ((rc = spl_kmem_cache_init()))
goto out6;
- if ((rc = spl_kstat_init()))
+ if ((rc = spl_vn_init()))
goto out7;
- if ((rc = spl_tsd_init()))
+ if ((rc = spl_proc_init()))
goto out8;
- if ((rc = spl_zlib_init()))
+ if ((rc = spl_kstat_init()))
goto out9;
+ if ((rc = spl_zlib_init()))
+ goto out10;
+
printk(KERN_NOTICE "SPL: Loaded module v%s-%s%s\n", SPL_META_VERSION,
SPL_META_RELEASE, SPL_DEBUG_STR);
return (rc);
+out10:
+ spl_kstat_fini();
out9:
- spl_tsd_fini();
+ spl_proc_fini();
out8:
- spl_kstat_fini();
+ spl_vn_fini();
out7:
- spl_proc_fini();
+ spl_kmem_cache_fini();
out6:
- spl_vn_fini();
-out5:
spl_taskq_fini();
+out5:
+ spl_tsd_fini();
out4:
spl_rw_fini();
out3:
@@ -584,11 +580,12 @@ spl_fini(void)
printk(KERN_NOTICE "SPL: Unloaded module v%s-%s%s\n",
SPL_META_VERSION, SPL_META_RELEASE, SPL_DEBUG_STR);
spl_zlib_fini();
- spl_tsd_fini();
spl_kstat_fini();
spl_proc_fini();
spl_vn_fini();
+ spl_kmem_cache_fini();
spl_taskq_fini();
+ spl_tsd_fini();
spl_rw_fini();
spl_mutex_fini();
spl_kvmem_fini();