aboutsummaryrefslogtreecommitdiffstats
path: root/mm/sparse-vmemmap.c
diff options
context:
space:
mode:
authorBen Hutchings <[email protected]>2013-04-29 22:07:49 +0000
committerLinus Torvalds <[email protected]>2013-04-29 22:54:35 +0000
commit055e4fd96e95b0eee0d92fd54a26be7f0d3bcad0 (patch)
tree48f7e2d9a829daf6fef897e7d34dfa01f8cf83b3 /mm/sparse-vmemmap.c
parentmm, hugetlb: include hugepages in meminfo (diff)
downloadkernel-055e4fd96e95b0eee0d92fd54a26be7f0d3bcad0.tar.gz
kernel-055e4fd96e95b0eee0d92fd54a26be7f0d3bcad0.zip
mm: try harder to allocate vmemmap blocks
Hot-adding memory on x86_64 normally requires huge page allocation. When this is done to a VM guest, it's usually because the system is already tight on memory, so the request tends to fail. Try to avoid this by adding __GFP_REPEAT to the allocation flags. Addresses http://bugs.debian.org/699913 Signed-off-by: Ben Hutchings <[email protected]> Signed-off-by: Johannes Weiner <[email protected]> Reported-by: Bernhard Schmidt <[email protected]> Tested-by: Bernhard Schmidt <[email protected]> Cc: Russell King <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: "Luck, Tony" <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: David Miller <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'mm/sparse-vmemmap.c')
-rw-r--r--mm/sparse-vmemmap.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
index 1b7e22ab9b09..22b7e18e9dea 100644
--- a/mm/sparse-vmemmap.c
+++ b/mm/sparse-vmemmap.c
@@ -53,10 +53,12 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node)
struct page *page;
if (node_state(node, N_HIGH_MEMORY))
- page = alloc_pages_node(node,
- GFP_KERNEL | __GFP_ZERO, get_order(size));
+ page = alloc_pages_node(
+ node, GFP_KERNEL | __GFP_ZERO | __GFP_REPEAT,
+ get_order(size));
else
- page = alloc_pages(GFP_KERNEL | __GFP_ZERO,
+ page = alloc_pages(
+ GFP_KERNEL | __GFP_ZERO | __GFP_REPEAT,
get_order(size));
if (page)
return page_address(page);