Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Kirill A. Shutemov and committed by
Linus Torvalds
65ebb64f bdfedb76

+20 -5
+20 -5
mm/huge_memory.c
··· 67 67 68 68 static int khugepaged(void *none); 69 69 static int khugepaged_slab_init(void); 70 + static void khugepaged_slab_exit(void); 70 71 71 72 #define MM_SLOTS_HASH_BITS 10 72 73 static __read_mostly DEFINE_HASHTABLE(mm_slots_hash, MM_SLOTS_HASH_BITS); ··· 635 634 636 635 err = hugepage_init_sysfs(&hugepage_kobj); 637 636 if (err) 638 - return err; 637 + goto err_sysfs; 639 638 640 639 err = khugepaged_slab_init(); 641 640 if (err) 642 - goto out; 641 + goto err_slab; 643 642 644 - register_shrinker(&huge_zero_page_shrinker); 643 + err = register_shrinker(&huge_zero_page_shrinker); 644 + if (err) 645 + goto err_hzp_shrinker; 645 646 646 647 /* 647 648 * By default disable transparent hugepages on smaller systems, ··· 653 650 if (totalram_pages < (512 << (20 - PAGE_SHIFT))) 654 651 transparent_hugepage_flags = 0; 655 652 656 - start_khugepaged(); 653 + err = start_khugepaged(); 654 + if (err) 655 + goto err_khugepaged; 657 656 658 657 return 0; 659 - out: 658 + err_khugepaged: 659 + unregister_shrinker(&huge_zero_page_shrinker); 660 + err_hzp_shrinker: 661 + khugepaged_slab_exit(); 662 + err_slab: 660 663 hugepage_exit_sysfs(hugepage_kobj); 664 + err_sysfs: 661 665 return err; 662 666 } 663 667 subsys_initcall(hugepage_init); ··· 1982 1972 return -ENOMEM; 1983 1973 1984 1974 return 0; 1975 + } 1976 + 1977 + static void __init khugepaged_slab_exit(void) 1978 + { 1979 + kmem_cache_destroy(mm_slot_cache); 1985 1980 } 1986 1981 1987 1982 static inline struct mm_slot *alloc_mm_slot(void)