lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 454/639] fork,memcg: alloc_thread_stack_node needs to set tsk->stack
    Date
    From: Andrea Arcangeli <aarcange@redhat.com>

    [ Upstream commit 1bf4580e00a248a2c86269125390eb3648e1877c ]

    Commit 5eed6f1dff87 ("fork,memcg: fix crash in free_thread_stack on
    memcg charge fail") corrected two instances, but there was a third
    instance of this bug.

    Without setting tsk->stack, if memcg_charge_kernel_stack fails, it'll
    execute free_thread_stack() on a dangling pointer.

    Enterprise kernels are compiled with VMAP_STACK=y so this isn't
    critical, but custom VMAP_STACK=n builds should have some performance
    advantage, with the drawback of risking to fail fork because compaction
    didn't succeed. So as long as VMAP_STACK=n is a supported option it's
    worth fixing it upstream.

    Link: http://lkml.kernel.org/r/20190619011450.28048-1-aarcange@redhat.com
    Fixes: 9b6f7e163cd0 ("mm: rework memcg kernel stack accounting")
    Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
    Reviewed-by: Rik van Riel <riel@surriel.com>
    Acked-by: Roman Gushchin <guro@fb.com>
    Acked-by: Michal Hocko <mhocko@suse.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/fork.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    diff --git a/kernel/fork.c b/kernel/fork.c
    index 1bd119530a492..1a2d18e98bf99 100644
    --- a/kernel/fork.c
    +++ b/kernel/fork.c
    @@ -240,7 +240,11 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
    struct page *page = alloc_pages_node(node, THREADINFO_GFP,
    THREAD_SIZE_ORDER);

    - return page ? page_address(page) : NULL;
    + if (likely(page)) {
    + tsk->stack = page_address(page);
    + return tsk->stack;
    + }
    + return NULL;
    #endif
    }

    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:25    [W:2.061 / U:4.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site