diff options
-rw-r--r-- | mm/page_cgroup.c | 12 | ||||
-rw-r--r-- | mm/sparse-vmemmap.c | 8 | ||||
-rw-r--r-- | mm/sparse.c | 9 |
3 files changed, 22 insertions, 7 deletions
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index f22b4ebbd8dc..3d535d594826 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) | |||
116 | nid = page_to_nid(pfn_to_page(pfn)); | 116 | nid = page_to_nid(pfn_to_page(pfn)); |
117 | table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION; | 117 | table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION; |
118 | VM_BUG_ON(!slab_is_available()); | 118 | VM_BUG_ON(!slab_is_available()); |
119 | base = kmalloc_node(table_size, | 119 | if (node_state(nid, N_HIGH_MEMORY)) { |
120 | base = kmalloc_node(table_size, | ||
120 | GFP_KERNEL | __GFP_NOWARN, nid); | 121 | GFP_KERNEL | __GFP_NOWARN, nid); |
121 | if (!base) | 122 | if (!base) |
122 | base = vmalloc_node(table_size, nid); | 123 | base = vmalloc_node(table_size, nid); |
124 | } else { | ||
125 | base = kmalloc(table_size, GFP_KERNEL | __GFP_NOWARN); | ||
126 | if (!base) | ||
127 | base = vmalloc(table_size); | ||
128 | } | ||
123 | } else { | 129 | } else { |
124 | /* | 130 | /* |
125 | * We don't have to allocate page_cgroup again, but | 131 | * We don't have to allocate page_cgroup again, but |
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index a13ea6401ae7..d9714bdcb4a3 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c | |||
@@ -48,8 +48,14 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node) | |||
48 | { | 48 | { |
49 | /* If the main allocator is up use that, fallback to bootmem. */ | 49 | /* If the main allocator is up use that, fallback to bootmem. */ |
50 | if (slab_is_available()) { | 50 | if (slab_is_available()) { |
51 | struct page *page = alloc_pages_node(node, | 51 | struct page *page; |
52 | |||
53 | if (node_state(node, N_HIGH_MEMORY)) | ||
54 | page = alloc_pages_node(node, | ||
52 | GFP_KERNEL | __GFP_ZERO, get_order(size)); | 55 | GFP_KERNEL | __GFP_ZERO, get_order(size)); |
56 | else | ||
57 | page = alloc_pages(GFP_KERNEL | __GFP_ZERO, | ||
58 | get_order(size)); | ||
53 | if (page) | 59 | if (page) |
54 | return page_address(page); | 60 | return page_address(page); |
55 | return NULL; | 61 | return NULL; |
diff --git a/mm/sparse.c b/mm/sparse.c index da432d9f0ae8..6ce4aab69e99 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -62,9 +62,12 @@ static struct mem_section noinline __init_refok *sparse_index_alloc(int nid) | |||
62 | unsigned long array_size = SECTIONS_PER_ROOT * | 62 | unsigned long array_size = SECTIONS_PER_ROOT * |
63 | sizeof(struct mem_section); | 63 | sizeof(struct mem_section); |
64 | 64 | ||
65 | if (slab_is_available()) | 65 | if (slab_is_available()) { |
66 | section = kmalloc_node(array_size, GFP_KERNEL, nid); | 66 | if (node_state(nid, N_HIGH_MEMORY)) |
67 | else | 67 | section = kmalloc_node(array_size, GFP_KERNEL, nid); |
68 | else | ||
69 | section = kmalloc(array_size, GFP_KERNEL); | ||
70 | } else | ||
68 | section = alloc_bootmem_node(NODE_DATA(nid), array_size); | 71 | section = alloc_bootmem_node(NODE_DATA(nid), array_size); |
69 | 72 | ||
70 | if (section) | 73 | if (section) |