lkml.org 
[lkml]   [2007]   [Aug]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[2.6.20.17 review 39/58] hugetlb: fix race in alloc_fresh_huge_page()
    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>
    Signed-off-by: Willy Tarreau <w@1wt.eu>
    ---
    mm/hugetlb.c | 15 +++++++++++----
    1 files changed, 11 insertions(+), 4 deletions(-)

    diff --git a/mm/hugetlb.c b/mm/hugetlb.c
    index 36db012..7c07eb2 100644
    --- a/mm/hugetlb.c
    +++ b/mm/hugetlb.c
    @@ -101,13 +101,20 @@ static void free_huge_page(struct page *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);
    --
    1.5.2.5
    --
    -
    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-22 11:29    [W:0.023 / U:0.324 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site