lkml.org 
[lkml]   [2007]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[2.6.22.2 review 60/84] hugetlb: fix race in alloc_fresh_huge_page()

    From: Joe Jin <joe.jin@oracle.com>

    That static `nid' index needs locking. Without it we can end up calling
    alloc_pages_node() with an illegal node ID and the kernel crashes.

    Acked-by: Gurudas Pai <gurudas.pai@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    mm/hugetlb.c | 15 +++++++++++----
    1 file changed, 11 insertions(+), 4 deletions(-)

    --- a/mm/hugetlb.c
    +++ b/mm/hugetlb.c
    @@ -101,13 +101,20 @@ static void free_huge_page(struct page *

    static int alloc_fresh_huge_page(void)
    {
    - static int nid = 0;
    + static int prev_nid;
    struct page *page;
    - page = alloc_pages_node(nid, GFP_HIGHUSER|__GFP_COMP|__GFP_NOWARN,
    - HUGETLB_PAGE_ORDER);
    - nid = next_node(nid, node_online_map);
    + static DEFINE_SPINLOCK(nid_lock);
    + int nid;
    +
    + spin_lock(&nid_lock);
    + nid = next_node(prev_nid, node_online_map);
    if (nid == MAX_NUMNODES)
    nid = first_node(node_online_map);
    + prev_nid = nid;
    + spin_unlock(&nid_lock);
    +
    + page = alloc_pages_node(nid, GFP_HIGHUSER|__GFP_COMP|__GFP_NOWARN,
    + HUGETLB_PAGE_ORDER);
    if (page) {
    set_compound_page_dtor(page, free_huge_page);
    spin_lock(&hugetlb_lock);
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-08-07 23:23    [W:4.063 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site