static int khugepaged(void *none);
 static int khugepaged_slab_init(void);
+static void khugepaged_slab_exit(void);
 
 #define MM_SLOTS_HASH_BITS 10
 static __read_mostly DEFINE_HASHTABLE(mm_slots_hash, MM_SLOTS_HASH_BITS);
 
        err = hugepage_init_sysfs(&hugepage_kobj);
        if (err)
-               return err;
+               goto err_sysfs;
 
        err = khugepaged_slab_init();
        if (err)
-               goto out;
+               goto err_slab;
 
-       register_shrinker(&huge_zero_page_shrinker);
+       err = register_shrinker(&huge_zero_page_shrinker);
+       if (err)
+               goto err_hzp_shrinker;
 
        /*
         * By default disable transparent hugepages on smaller systems,
        if (totalram_pages < (512 << (20 - PAGE_SHIFT)))
                transparent_hugepage_flags = 0;
 
-       start_khugepaged();
+       err = start_khugepaged();
+       if (err)
+               goto err_khugepaged;
 
        return 0;
-out:
+err_khugepaged:
+       unregister_shrinker(&huge_zero_page_shrinker);
+err_hzp_shrinker:
+       khugepaged_slab_exit();
+err_slab:
        hugepage_exit_sysfs(hugepage_kobj);
+err_sysfs:
        return err;
 }
 subsys_initcall(hugepage_init);
        return 0;
 }
 
+static void __init khugepaged_slab_exit(void)
+{
+       kmem_cache_destroy(mm_slot_cache);
+}
+
 static inline struct mm_slot *alloc_mm_slot(void)
 {
        if (!mm_slot_cache)     /* initialization failed */