]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/huge_memory.c
ARM: dts: Add minimal support for LogicPD Torpedo DM3730 devkit
[karo-tx-linux.git] / mm / huge_memory.c
index 1db93fbda06a95e4bbf6ef6e1d4c44e59fb548e2..078832cf3636579e1d9cc1c396b037319e52a6bd 100644 (file)
@@ -67,6 +67,7 @@ static unsigned int khugepaged_max_ptes_none __read_mostly = HPAGE_PMD_NR-1;
 
 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);
@@ -109,9 +110,6 @@ static int set_recommended_min_free_kbytes(void)
        int nr_zones = 0;
        unsigned long recommended_min;
 
-       if (!khugepaged_enabled())
-               return 0;
-
        for_each_populated_zone(zone)
                nr_zones++;
 
@@ -143,9 +141,8 @@ static int set_recommended_min_free_kbytes(void)
        setup_per_zone_wmarks();
        return 0;
 }
-late_initcall(set_recommended_min_free_kbytes);
 
-static int start_khugepaged(void)
+static int start_stop_khugepaged(void)
 {
        int err = 0;
        if (khugepaged_enabled()) {
@@ -156,6 +153,7 @@ static int start_khugepaged(void)
                        pr_err("khugepaged: kthread_run(khugepaged) failed\n");
                        err = PTR_ERR(khugepaged_thread);
                        khugepaged_thread = NULL;
+                       goto fail;
                }
 
                if (!list_empty(&khugepaged_scan.mm_head))
@@ -166,7 +164,7 @@ static int start_khugepaged(void)
                kthread_stop(khugepaged_thread);
                khugepaged_thread = NULL;
        }
-
+fail:
        return err;
 }
 
@@ -300,7 +298,7 @@ static ssize_t enabled_store(struct kobject *kobj,
                int err;
 
                mutex_lock(&khugepaged_mutex);
-               err = start_khugepaged();
+               err = start_stop_khugepaged();
                mutex_unlock(&khugepaged_mutex);
 
                if (err)
@@ -634,27 +632,38 @@ static int __init hugepage_init(void)
 
        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,
         * where the extra memory used could hurt more than TLB overhead
         * is likely to save.  The admin can still enable it through /sys.
         */
-       if (totalram_pages < (512 << (20 - PAGE_SHIFT)))
+       if (totalram_pages < (512 << (20 - PAGE_SHIFT))) {
                transparent_hugepage_flags = 0;
+               return 0;
+       }
 
-       start_khugepaged();
+       err = start_stop_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);
@@ -1974,6 +1983,11 @@ static int __init khugepaged_slab_init(void)
        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 */