Skip to content

Commit

Permalink
thp: handle errors in hugepage_init() properly
Browse files Browse the repository at this point in the history
We miss error-handling in few cases hugepage_init(). Let's fix that.

Signed-off-by: Kirill A. Shutemov <[email protected]>
Cc: Andrea Arcangeli <[email protected]>
Acked-by: David Rientjes <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
kiryl authored and torvalds committed Apr 15, 2015
1 parent bdfedb7 commit 65ebb64
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions mm/huge_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ static unsigned int khugepaged_max_ptes_none __read_mostly = HPAGE_PMD_NR-1;

static int khugepaged(void *none);
static int khugepaged_slab_init(void);
static void khugepaged_slab_exit(void);

#define MM_SLOTS_HASH_BITS 10
static __read_mostly DEFINE_HASHTABLE(mm_slots_hash, MM_SLOTS_HASH_BITS);
Expand Down Expand Up @@ -634,13 +635,15 @@ static int __init hugepage_init(void)

err = hugepage_init_sysfs(&hugepage_kobj);
if (err)
return err;
goto err_sysfs;

err = khugepaged_slab_init();
if (err)
goto out;
goto err_slab;

register_shrinker(&huge_zero_page_shrinker);
err = register_shrinker(&huge_zero_page_shrinker);
if (err)
goto err_hzp_shrinker;

/*
* By default disable transparent hugepages on smaller systems,
Expand All @@ -650,11 +653,18 @@ static int __init hugepage_init(void)
if (totalram_pages < (512 << (20 - PAGE_SHIFT)))
transparent_hugepage_flags = 0;

start_khugepaged();
err = start_khugepaged();
if (err)
goto err_khugepaged;

return 0;
out:
err_khugepaged:
unregister_shrinker(&huge_zero_page_shrinker);
err_hzp_shrinker:
khugepaged_slab_exit();
err_slab:
hugepage_exit_sysfs(hugepage_kobj);
err_sysfs:
return err;
}
subsys_initcall(hugepage_init);
Expand Down Expand Up @@ -1974,6 +1984,11 @@ static int __init khugepaged_slab_init(void)
return 0;
}

static void __init khugepaged_slab_exit(void)
{
kmem_cache_destroy(mm_slot_cache);
}

static inline struct mm_slot *alloc_mm_slot(void)
{
if (!mm_slot_cache) /* initialization failed */
Expand Down

0 comments on commit 65ebb64

Please sign in to comment.