From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jacob Shin Subject: [PATCH] xen: allow extra memory stay within lowest available range Date: Tue, 24 Jan 2012 19:42:40 -0600 Message-ID: <20120125014240.GA9561@jshin-Toonie> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: jeremy@goop.org, xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org We have a machine with 1.5 TB of memory which has a e820 that looks like this: (XEN) 0000000000000000 - 000000000008f400 (usable) (XEN) 000000000008f400 - 00000000000a0000 (reserved) (XEN) 00000000000d0000 - 0000000000100000 (reserved) (XEN) 0000000000100000 - 00000000c7eb0000 (usable) (XEN) 00000000c7eb0000 - 00000000c7ed8000 (ACPI data) (XEN) 00000000c7ed8000 - 00000000c7eda000 (ACPI NVS) (XEN) 00000000c7eda000 - 00000000c8000000 (reserved) (XEN) 00000000c8000000 - 00000000c8001000 (reserved) (XEN) 00000000d8000000 - 00000000d8001000 (reserved) (XEN) 00000000d8400000 - 00000000d8401000 (reserved) (XEN) 00000000d8800000 - 00000000d8801000 (reserved) (XEN) 00000000fec00000 - 00000000fec10000 (reserved) (XEN) 00000000fee00000 - 00000000fee01000 (reserved) (XEN) 00000000fff00000 - 0000000100000000 (reserved) (XEN) 0000000100000000 - 000000f038000000 (usable) (XEN) 000000f038000000 - 000000fd00000000 (reserved) (XEN) 0000010000000000 - 0000018fff000000 (usable) Booting with dom0_mem=1024M, 2.6.32.48 adds extra pages for ballooning at the end, and Dom0 panics: .. [ 0.000000] Xen: 00000000fff00000 - 0000000100000000 (reserved) [ 0.000000] Xen: 000000f038000000 - 000000fd00000000 (reserved) [ 0.000000] Xen: 000000fd00000000 - 000000ff40000000 (usable) .. [ 0.000000] init_memory_mapping: 0000000100000000-000000ff40000000 [ 0.000000] 0100000000 - ff40000000 page 4k [ 0.000000] Kernel panic - not syncing: Cannot find space for the kernel page tables .. [ 0.000000] [] panic+0x8c/0x1a2 [ 0.000000] [] init_memory_mapping+0x3d4/0x4b9 [ 0.000000] [] setup_arch+0x651/0xaaa [ 0.000000] [] ? printk+0x3c/0x3e [ 0.000000] [] ? _raw_spin_unlock_irqrestore+0x10/0x12 [ 0.000000] [] start_kernel+0x8f/0x3ca [ 0.000000] [] x86_64_start_reservations+0xb6/0xba [ 0.000000] [] xen_start_kernel+0x5a0/0x5a7 Below patch allows extra memory to settle on the first available memory range that can accommodate it. Resulting e820 looks like this: [ 0.000000] Xen: 00000000fff00000 - 0000000100000000 (reserved) [ 0.000000] Xen: 0000000100000000 - 0000000340000000 (usable) [ 0.000000] Xen: 000000f038000000 - 000000fd00000000 (reserved) This patch is moot on 3.2 and later because another patch already handles this case: dc91c728fddc29dfed1ae96f6807216b5f42d3a1 xen: allow extra memory to be in multiple regions. Signed-off-by: Jacob Shin --- arch/x86/xen/setup.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 46d6d21..1ce626d 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c @@ -240,6 +240,7 @@ char * __init xen_memory_setup(void) memcpy(map_raw, map, sizeof(map)); e820.nr_map = 0; xen_extra_mem_start = mem_end; + extra_limit = xen_get_max_pages(); for (i = 0; i < memmap.nr_entries; i++) { unsigned long long end; @@ -268,7 +269,9 @@ char * __init xen_memory_setup(void) } if (map[i].size > 0 && end > xen_extra_mem_start) - xen_extra_mem_start = end; + if (PFN_DOWN(map[i].addr - xen_extra_mem_start) < + (extra_limit - max_pfn)) + xen_extra_mem_start = end; /* Add region if any remains */ if (map[i].size > 0) @@ -305,7 +308,6 @@ char * __init xen_memory_setup(void) sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); - extra_limit = xen_get_max_pages(); if (max_pfn + extra_pages > extra_limit) { if (extra_limit > max_pfn) extra_pages = extra_limit - max_pfn; -- 1.7.8.4