• J
    mm: update min_free_kbytes from khugepaged after core initialization · bc22af74
    Jason Baron 提交于
    Khugepaged attempts to raise min_free_kbytes if its set too low.
    However, on boot khugepaged sets min_free_kbytes first from
    subsys_initcall(), and then the mm 'core' over-rides min_free_kbytes
    after from init_per_zone_wmark_min(), via a module_init() call.
    
    Khugepaged used to use a late_initcall() to set min_free_kbytes (such
    that it occurred after the core initialization), however this was
    removed when the initialization of min_free_kbytes was integrated into
    the starting of the khugepaged thread.
    
    The fix here is simply to invoke the core initialization using a
    core_initcall() instead of module_init(), such that the previous
    initialization ordering is restored.  I didn't restore the
    late_initcall() since start_stop_khugepaged() already sets
    min_free_kbytes via set_recommended_min_free_kbytes().
    
    This was noticed when we had a number of page allocation failures when
    moving a workload to a kernel with this new initialization ordering.  On
    an 8GB system this restores min_free_kbytes back to 67584 from 11365
    when CONFIG_TRANSPARENT_HUGEPAGE=y is set and either
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y or
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y.
    
    Fixes: 79553da2 ("thp: cleanup khugepaged startup")
    Signed-off-by: NJason Baron <jbaron@akamai.com>
    Acked-by: NKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: NDavid Rientjes <rientjes@google.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    bc22af74
page_alloc.c 197.6 KB