Skip to content

Commit

Permalink
hugetlb: fix race in alloc_fresh_huge_page()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
joejin00 authored and Linus Torvalds committed Jul 16, 2007
1 parent 2706a1b commit f96efd5
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions mm/hugetlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit f96efd5

Please sign in to comment.