lkml.org 
[lkml]   [2015]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.0 211/220] mm, thp: really limit transparent hugepage allocation to local node
    Date
    4.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: David Rientjes <rientjes@google.com>

    commit 5265047ac30191ea24b16503165000c225f54feb upstream.

    Commit 077fcf116c8c ("mm/thp: allocate transparent hugepages on local
    node") restructured alloc_hugepage_vma() with the intent of only
    allocating transparent hugepages locally when there was not an effective
    interleave mempolicy.

    alloc_pages_exact_node() does not limit the allocation to the single node,
    however, but rather prefers it. This is because __GFP_THISNODE is not set
    which would cause the node-local nodemask to be passed. Without it, only
    a nodemask that prefers the local node is passed.

    Fix this by passing __GFP_THISNODE and falling back to small pages when
    the allocation fails.

    Commit 9f1b868a13ac ("mm: thp: khugepaged: add policy for finding target
    node") suffers from a similar problem for khugepaged, which is also fixed.

    Fixes: 077fcf116c8c ("mm/thp: allocate transparent hugepages on local node")
    Fixes: 9f1b868a13ac ("mm: thp: khugepaged: add policy for finding target node")
    Signed-off-by: David Rientjes <rientjes@google.com>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Pravin Shelar <pshelar@nicira.com>
    Cc: Jarno Rajahalme <jrajahalme@nicira.com>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: Tejun Heo <tj@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    mm/huge_memory.c | 9 +++++++--
    mm/mempolicy.c | 3 ++-
    2 files changed, 9 insertions(+), 3 deletions(-)

    --- a/mm/huge_memory.c
    +++ b/mm/huge_memory.c
    @@ -2316,8 +2316,14 @@ static struct page
    struct vm_area_struct *vma, unsigned long address,
    int node)
    {
    + gfp_t flags;
    +
    VM_BUG_ON_PAGE(*hpage, *hpage);

    + /* Only allocate from the target node */
    + flags = alloc_hugepage_gfpmask(khugepaged_defrag(), __GFP_OTHER_NODE) |
    + __GFP_THISNODE;
    +
    /*
    * Before allocating the hugepage, release the mmap_sem read lock.
    * The allocation can take potentially a long time if it involves
    @@ -2326,8 +2332,7 @@ static struct page
    */
    up_read(&mm->mmap_sem);

    - *hpage = alloc_pages_exact_node(node, alloc_hugepage_gfpmask(
    - khugepaged_defrag(), __GFP_OTHER_NODE), HPAGE_PMD_ORDER);
    + *hpage = alloc_pages_exact_node(node, flags, HPAGE_PMD_ORDER);
    if (unlikely(!*hpage)) {
    count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
    *hpage = ERR_PTR(-ENOMEM);
    --- a/mm/mempolicy.c
    +++ b/mm/mempolicy.c
    @@ -1985,7 +1985,8 @@ retry_cpuset:
    nmask = policy_nodemask(gfp, pol);
    if (!nmask || node_isset(node, *nmask)) {
    mpol_cond_put(pol);
    - page = alloc_pages_exact_node(node, gfp, order);
    + page = alloc_pages_exact_node(node,
    + gfp | __GFP_THISNODE, order);
    goto out;
    }
    }



    \
     
     \ /
      Last update: 2015-05-02 22:01    [W:4.687 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site