]> granicus.if.org Git - spl/commitdiff
Fix --enable-debug-kmem-tracking option
authorTim Chase <tim@chase2k.com>
Fri, 31 May 2013 02:52:36 +0000 (21:52 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 18 Jun 2013 18:40:33 +0000 (11:40 -0700)
Re-order initialization in spl_kmem_init to allow for kmem tracing
to work.  The spl_kmem_init function calls taskq_create prior to
initializing the tracking (calling spl_kmem_init_tracking).  Since
taskq_create uses kmem_alloc, NULL dereferences occur because the
global kmem_list hasn't had its next & prev pointers initialized yet.

This commit moves the calls to spl_kmem_init_tracking earlier in the
spl_kmem_init function in order that the subsequent kmem_alloc calls
(by taskq_create) work properly.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #243

module/spl/spl-kmem.c

index a0ca2d2be5d684aa4d21e9bc8b2265687981f5c6..f64c0441d687657eff78920393b97f4294903e5a 100644 (file)
@@ -2418,13 +2418,6 @@ spl_kmem_init(void)
        int rc = 0;
        SENTRY;
 
-       init_rwsem(&spl_kmem_cache_sem);
-       INIT_LIST_HEAD(&spl_kmem_cache_list);
-       spl_kmem_cache_taskq = taskq_create("spl_kmem_cache",
-           1, maxclsyspri, 1, 32, TASKQ_PREPOPULATE);
-
-       spl_register_shrinker(&spl_kmem_cache_shrinker);
-
 #ifdef DEBUG_KMEM
        kmem_alloc_used_set(0);
        vmem_alloc_used_set(0);
@@ -2432,6 +2425,14 @@ spl_kmem_init(void)
        spl_kmem_init_tracking(&kmem_list, &kmem_lock, KMEM_TABLE_SIZE);
        spl_kmem_init_tracking(&vmem_list, &vmem_lock, VMEM_TABLE_SIZE);
 #endif
+
+       init_rwsem(&spl_kmem_cache_sem);
+       INIT_LIST_HEAD(&spl_kmem_cache_list);
+       spl_kmem_cache_taskq = taskq_create("spl_kmem_cache",
+           1, maxclsyspri, 1, 32, TASKQ_PREPOPULATE);
+
+       spl_register_shrinker(&spl_kmem_cache_shrinker);
+
        SRETURN(rc);
 }