diff options
author | Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | 2015-04-15 19:14:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-15 19:35:18 -0400 |
commit | 65ebb64f4d2ce8eba4d0ec82d6cf65022e70e4a1 (patch) | |
tree | 52086d74382f1645a649794585c8f3f2581c6313 /mm | |
parent | bdfedb76f4f5aa5e37380e3b71adee4a39f30fc6 (diff) |
thp: handle errors in hugepage_init() properly
We miss error-handling in few cases hugepage_init(). Let's fix that.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Acked-by: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-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 */ |