On Fri, Mar 27, 2015 at 03:00:26PM -0700, Andrew Morton wrote: > On Fri, 27 Mar 2015 14:47:08 -0700 Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: > > > Fair enough, but take a look at start_khugepaged(): > > > > : static int start_khugepaged(void) > > : { > > : int err = 0; > > : if (khugepaged_enabled()) { > > : if (!khugepaged_thread) > > : khugepaged_thread = kthread_run(khugepaged, NULL, > > : "khugepaged"); > > : if (unlikely(IS_ERR(khugepaged_thread))) { > > : pr_err("khugepaged: kthread_run(khugepaged) failed\n"); > > : err = PTR_ERR(khugepaged_thread); > > : khugepaged_thread = NULL; > > > > -->> stop here > > > > : } > > : > > : if (!list_empty(&khugepaged_scan.mm_head)) > > : wake_up_interruptible(&khugepaged_wait); > > : > > : set_recommended_min_free_kbytes(); > > : } else if (khugepaged_thread) { > > : kthread_stop(khugepaged_thread); > > : khugepaged_thread = NULL; > > : } > > : > > : return err; > > : } > > Looking more closely... This code seems a bit screwy. > > - why is set_recommended_min_free_kbytes() a late_initcall? We've > already done that within > subsys_initcall->hugepage_init->set_recommended_min_free_kbytes() > > - there isn't much point in running start_khugepaged() if we've just > set transparent_hugepage_flags to zero. > > - start_khugepaged() is misnamed. > > So something like this? Looks like you didn't apply this. Here's proper patch: >From 8b4b0d0742998042b38d2ba26d4432b26fe71707 Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> Date: Thu, 2 Apr 2015 14:56:25 +0300 Subject: [PATCH] thp: cleanup khugepaged startup Few trivial cleanups: - no need to call set_recommended_min_free_kbytes() from late_initcall() -- start_khugepaged() calls it; - no need to call set_recommended_min_free_kbytes() from start_khugepaged() if khugepaged is not started; - there isn't much point in running start_khugepaged() if we've just set transparent_hugepage_flags to zero; - start_khugepaged() is misnamed -- it also used to stop the thread; Not-yet-signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> --- mm/huge_memory.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 370a3bbc960d..95df717c0095 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -110,10 +110,6 @@ static int set_recommended_min_free_kbytes(void) int nr_zones = 0; unsigned long recommended_min; - /* khugepaged thread has stopped to failed to start */ - if (!khugepaged_thread) - return 0; - for_each_populated_zone(zone) nr_zones++; @@ -145,9 +141,8 @@ static int set_recommended_min_free_kbytes(void) setup_per_zone_wmarks(); return 0; } -late_initcall(set_recommended_min_free_kbytes); -static int start_khugepaged(void) +static int start_stop_khugepaged(void) { int err = 0; if (khugepaged_enabled()) { @@ -158,6 +153,7 @@ static int start_khugepaged(void) pr_err("khugepaged: kthread_run(khugepaged) failed\n"); err = PTR_ERR(khugepaged_thread); khugepaged_thread = NULL; + goto fail; } if (!list_empty(&khugepaged_scan.mm_head)) @@ -168,7 +164,7 @@ static int start_khugepaged(void) kthread_stop(khugepaged_thread); khugepaged_thread = NULL; } - +fail: return err; } @@ -302,7 +298,7 @@ static ssize_t enabled_store(struct kobject *kobj, int err; mutex_lock(&khugepaged_mutex); - err = start_khugepaged(); + err = start_stop_khugepaged(); mutex_unlock(&khugepaged_mutex); if (err) @@ -651,10 +647,12 @@ static int __init hugepage_init(void) * where the extra memory used could hurt more than TLB overhead * is likely to save. The admin can still enable it through /sys. */ - if (totalram_pages < (512 << (20 - PAGE_SHIFT))) + if (totalram_pages < (512 << (20 - PAGE_SHIFT))) { transparent_hugepage_flags = 0; + return 0; + } - err = start_khugepaged(); + err = start_stop_khugepaged(); if (err) goto err_khugepaged; -- Kirill A. Shutemov -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>