[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#699913: linux-image-3.2.0-4-amd64: Memory hotplug (VMware) often fails



Control: tag -1 upstream moreinfo

On Wed, 2013-02-06 at 18:02 +0100, Bernhard Schmidt wrote:
> Package: src:linux
> Version: 3.2.35-2
> Severity: normal
> 
> Adding additional RAM to a virtual machine running Debian Wheezy on
> VMware ESXi 5.0 often, but not always leads to the attached backtrace.
> 
> If that happens, the system has considerably less new (offline) memory 
> banks in /sys/devices/system/memory/memory* than it should have, and 
> setting all available memory banks online does not give all the memory
> expected.
[...]

Please test whether the attached patch fixes this.  Instructions for
building a patched kernel package are in the Debian kernel handbook:
<http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official>.

Ben.

-- 
Ben Hutchings
We get into the habit of living before acquiring the habit of thinking.
                                                              - Albert Camus
From: Ben Hutchings <ben@decadent.org.uk>
Date: Mon, 11 Feb 2013 00:56:24 +0000
Subject: [PATCH] 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.

Reported-by: Bernhard Schmidt <Bernhard.Schmidt@lrz.de>
Reference: http://bugs.debian.org/699913
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
 mm/sparse-vmemmap.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
index 1b7e22a..22b7e18 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);

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: