diff options
| author | Ben Hutchings <[email protected]> | 2013-04-29 22:07:49 +0000 |
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2013-04-29 22:54:35 +0000 |
| commit | 055e4fd96e95b0eee0d92fd54a26be7f0d3bcad0 (patch) | |
| tree | 48f7e2d9a829daf6fef897e7d34dfa01f8cf83b3 /mm/sparse-vmemmap.c | |
| parent | mm, hugetlb: include hugepages in meminfo (diff) | |
| download | kernel-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.c | 8 |
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); |
