diff options
-rw-r--r-- | mm/huge_memory.c | 25 |
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 | ||
68 | static int khugepaged(void *none); | 68 | static int khugepaged(void *none); |
69 | static int khugepaged_slab_init(void); | 69 | static int khugepaged_slab_init(void); |
70 | static void khugepaged_slab_exit(void); | ||
70 | 71 | ||
71 | #define MM_SLOTS_HASH_BITS 10 | 72 | #define MM_SLOTS_HASH_BITS 10 |
72 | static __read_mostly DEFINE_HASHTABLE(mm_slots_hash, MM_SLOTS_HASH_BITS); | 73 | static __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; |
656 | out: | 661 | err_khugepaged: |
662 | unregister_shrinker(&huge_zero_page_shrinker); | ||
663 | err_hzp_shrinker: | ||
664 | khugepaged_slab_exit(); | ||
665 | err_slab: | ||
657 | hugepage_exit_sysfs(hugepage_kobj); | 666 | hugepage_exit_sysfs(hugepage_kobj); |
667 | err_sysfs: | ||
658 | return err; | 668 | return err; |
659 | } | 669 | } |
660 | subsys_initcall(hugepage_init); | 670 | subsys_initcall(hugepage_init); |
@@ -1974,6 +1984,11 @@ static int __init khugepaged_slab_init(void) | |||
1974 | return 0; | 1984 | return 0; |
1975 | } | 1985 | } |
1976 | 1986 | ||
1987 | static void __init khugepaged_slab_exit(void) | ||
1988 | { | ||
1989 | kmem_cache_destroy(mm_slot_cache); | ||
1990 | } | ||
1991 | |||
1977 | static inline struct mm_slot *alloc_mm_slot(void) | 1992 | static inline struct mm_slot *alloc_mm_slot(void) |
1978 | { | 1993 | { |
1979 | if (!mm_slot_cache) /* initialization failed */ | 1994 | if (!mm_slot_cache) /* initialization failed */ |