From 673ce3610994890f672dd3e7e8ca5eb398ad1a09 Mon Sep 17 00:00:00 2001 From: Shaohua Li Date: Mon, 21 Sep 2009 17:01:19 -0700 Subject: [PATCH] --- yaml --- r: 164370 b: refs/heads/master c: f52407ce2deac76c87abc8211a63ea152ba72d54 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/page_cgroup.c | 12 +++++++++--- trunk/mm/sparse-vmemmap.c | 8 +++++++- trunk/mm/sparse.c | 9 ++++++--- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index f1d3597c2061..9c5e2426731c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8e7e40d9658cf7b2ae2b76484e235799b3ddaa97 +refs/heads/master: f52407ce2deac76c87abc8211a63ea152ba72d54 diff --git a/trunk/mm/page_cgroup.c b/trunk/mm/page_cgroup.c index f22b4ebbd8dc..3d535d594826 100644 --- a/trunk/mm/page_cgroup.c +++ b/trunk/mm/page_cgroup.c @@ -116,10 +116,16 @@ static int __init_refok init_section_page_cgroup(unsigned long pfn) nid = page_to_nid(pfn_to_page(pfn)); table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION; VM_BUG_ON(!slab_is_available()); - base = kmalloc_node(table_size, + if (node_state(nid, N_HIGH_MEMORY)) { + base = kmalloc_node(table_size, GFP_KERNEL | __GFP_NOWARN, nid); - if (!base) - base = vmalloc_node(table_size, nid); + if (!base) + base = vmalloc_node(table_size, nid); + } else { + base = kmalloc(table_size, GFP_KERNEL | __GFP_NOWARN); + if (!base) + base = vmalloc(table_size); + } } else { /* * We don't have to allocate page_cgroup again, but diff --git a/trunk/mm/sparse-vmemmap.c b/trunk/mm/sparse-vmemmap.c index a13ea6401ae7..d9714bdcb4a3 100644 --- a/trunk/mm/sparse-vmemmap.c +++ b/trunk/mm/sparse-vmemmap.c @@ -48,8 +48,14 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node) { /* If the main allocator is up use that, fallback to bootmem. */ if (slab_is_available()) { - struct page *page = alloc_pages_node(node, + struct page *page; + + if (node_state(node, N_HIGH_MEMORY)) + page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, get_order(size)); + else + page = alloc_pages(GFP_KERNEL | __GFP_ZERO, + get_order(size)); if (page) return page_address(page); return NULL; diff --git a/trunk/mm/sparse.c b/trunk/mm/sparse.c index da432d9f0ae8..6ce4aab69e99 100644 --- a/trunk/mm/sparse.c +++ b/trunk/mm/sparse.c @@ -62,9 +62,12 @@ static struct mem_section noinline __init_refok *sparse_index_alloc(int nid) unsigned long array_size = SECTIONS_PER_ROOT * sizeof(struct mem_section); - if (slab_is_available()) - section = kmalloc_node(array_size, GFP_KERNEL, nid); - else + if (slab_is_available()) { + if (node_state(nid, N_HIGH_MEMORY)) + section = kmalloc_node(array_size, GFP_KERNEL, nid); + else + section = kmalloc(array_size, GFP_KERNEL); + } else section = alloc_bootmem_node(NODE_DATA(nid), array_size); if (section)