aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/huge_memory.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 1db93fbda06a..c257006749bb 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -67,6 +67,7 @@ static unsigned int khugepaged_max_ptes_none __read_mostly = HPAGE_PMD_NR-1;
67 67
68static int khugepaged(void *none); 68static int khugepaged(void *none);
69static int khugepaged_slab_init(void); 69static int khugepaged_slab_init(void);
70static void khugepaged_slab_exit(void);
70 71
71#define MM_SLOTS_HASH_BITS 10 72#define MM_SLOTS_HASH_BITS 10
72static __read_mostly DEFINE_HASHTABLE(mm_slots_hash, MM_SLOTS_HASH_BITS); 73static __read_mostly DEFINE_HASHTABLE(mm_slots_hash, MM_SLOTS_HASH_BITS);
@@ -634,13 +635,15 @@ static int __init hugepage_init(void)
634 635
635 err = hugepage_init_sysfs(&hugepage_kobj); 636 err = hugepage_init_sysfs(&hugepage_kobj);
636 if (err) 637 if (err)
637 return err; 638 goto err_sysfs;
638 639
639 err = khugepaged_slab_init(); 640 err = khugepaged_slab_init();
640 if (err) 641 if (err)
641 goto out; 642 goto err_slab;
642 643
643 register_shrinker(&huge_zero_page_shrinker); 644 err = register_shrinker(&huge_zero_page_shrinker);
645 if (err)
646 goto err_hzp_shrinker;
644 647
645 /* 648 /*
646 * By default disable transparent hugepages on smaller systems, 649 * By default disable transparent hugepages on smaller systems,
@@ -650,11 +653,18 @@ static int __init hugepage_init(void)
650 if (totalram_pages < (512 << (20 - PAGE_SHIFT))) 653 if (totalram_pages < (512 << (20 - PAGE_SHIFT)))
651 transparent_hugepage_flags = 0; 654 transparent_hugepage_flags = 0;
652 655
653 start_khugepaged(); 656 err = start_khugepaged();
657 if (err)
658 goto err_khugepaged;
654 659
655 return 0; 660 return 0;
656out: 661err_khugepaged:
662 unregister_shrinker(&huge_zero_page_shrinker);
663err_hzp_shrinker:
664 khugepaged_slab_exit();
665err_slab:
657 hugepage_exit_sysfs(hugepage_kobj); 666 hugepage_exit_sysfs(hugepage_kobj);
667err_sysfs:
658 return err; 668 return err;
659} 669}
660subsys_initcall(hugepage_init); 670subsys_initcall(hugepage_init);
@@ -1974,6 +1984,11 @@ static int __init khugepaged_slab_init(void)
1974 return 0; 1984 return 0;
1975} 1985}
1976 1986
1987static void __init khugepaged_slab_exit(void)
1988{
1989 kmem_cache_destroy(mm_slot_cache);
1990}
1991
1977static inline struct mm_slot *alloc_mm_slot(void) 1992static inline struct mm_slot *alloc_mm_slot(void)
1978{ 1993{
1979 if (!mm_slot_cache) /* initialization failed */ 1994 if (!mm_slot_cache) /* initialization failed */