diff options
author | Shaohua Li <shaohua.li@intel.com> | 2009-09-21 17:01:19 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-22 07:17:26 -0700 |
commit | f52407ce2deac76c87abc8211a63ea152ba72d54 (patch) | |
tree | 6e3976fae721bd178d68d11750f7ad7f86d8feca /mm/page_cgroup.c | |
parent | 8e7e40d9658cf7b2ae2b76484e235799b3ddaa97 (diff) | |
download | op-kernel-dev-f52407ce2deac76c87abc8211a63ea152ba72d54.zip op-kernel-dev-f52407ce2deac76c87abc8211a63ea152ba72d54.tar.gz |
memory hotplug: alloc page from other node in memory online
To initialize hotadded node, some pages are allocated. At that time, the
node hasn't memory, this makes the allocation always fail. In such case,
let's allocate pages from other nodes.
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Yakui Zhao <yakui.zhao@intel.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Christoph Lameter <cl@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page_cgroup.c')
-rw-r--r-- | mm/page_cgroup.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index f22b4eb..3d535d5 100644 --- a/mm/page_cgroup.c +++ b/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 |