aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>2015-04-15 19:14:20 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-15 19:35:18 -0400
commit65ebb64f4d2ce8eba4d0ec82d6cf65022e70e4a1 (patch)
tree52086d74382f1645a649794585c8f3f2581c6313 /mm
parentbdfedb76f4f5aa5e37380e3b71adee4a39f30fc6 (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.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 */