Thanks to Yamahata-san's prior work, we can now size the xenheap with
a boot option. However, a user isn't always going to know to do this.
For instance, when I configure an HP superdome system in NUMA mode, I
get much higher physical addresses, which makes the boot allocator
alloc_bitmap exceed the default xenheap size on it's own. This leads to
a failure trying to allocate a ridiculously huge block of memory later
on. This patch adds in a test to make sure we don't hit this case and
automatically increases xenheap_size to account for it. Thanks,
Alex
Signed-off-by: Alex Williamson <alex.williamson@xxxxxx>
---
diff -r 59b8768d0d0d xen/arch/ia64/xen/xensetup.c
--- a/xen/arch/ia64/xen/xensetup.c Wed Mar 05 11:18:25 2008 +0000
+++ b/xen/arch/ia64/xen/xensetup.c Fri Mar 07 11:19:02 2008 -0700
@@ -80,11 +80,11 @@ static void __init parse_xenheap_megabyt
{
unsigned long megabytes = simple_strtoll(s, NULL, 0);
-#define XENHEAP_MEGABYTES_MIN 16
+#define XENHEAP_MEGABYTES_MIN 16UL
if (megabytes < XENHEAP_MEGABYTES_MIN)
megabytes = XENHEAP_MEGABYTES_MIN;
-#define XENHEAP_MEGABYTES_MAX 4096 /* need more? If so,
+#define XENHEAP_MEGABYTES_MAX 4096UL /* need more? If so,
__pickle()/__unpickle() must be
revised. */
if (megabytes > XENHEAP_MEGABYTES_MAX)
@@ -258,6 +258,26 @@ md_overlap_with_boot_param(const efi_mem
#define MD_SIZE(md) (md->num_pages << EFI_PAGE_SHIFT)
#define MD_END(md) ((md)->phys_addr + MD_SIZE(md))
+static unsigned long __init
+efi_get_max_addr (void)
+{
+ void *efi_map_start, *efi_map_end, *p;
+ efi_memory_desc_t *md;
+ u64 efi_desc_size;
+ unsigned long max_addr = 0;
+
+ efi_map_start = __va(ia64_boot_param->efi_memmap);
+ efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
+ efi_desc_size = ia64_boot_param->efi_memdesc_size;
+
+ for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
+ md = p;
+ if (is_xenheap_usable_memory(md) && MD_END(md) > max_addr)
+ max_addr = MD_END(md);
+ }
+ return max_addr;
+}
+
extern char __init_begin[], __init_end[];
static void noinline init_done(void)
{
@@ -398,6 +418,17 @@ void __init start_kernel(void)
}
printk("Xen command line: %s\n", saved_command_line);
+
+ /*
+ * Test if the boot allocator bitmap will overflow xenheap_size. If
+ * so, continue to bump it up until we have at least a minimum space
+ * for the actual xenheap.
+ */
+ max_page = efi_get_max_addr() >> PAGE_SHIFT;
+ while ((max_page >> 3) > xenheap_size - (XENHEAP_MEGABYTES_MIN << 20))
+ xenheap_size <<= 1;
+
+ BUG_ON(xenheap_size > (XENHEAP_MEGABYTES_MAX << 20));
xenheap_phys_end = xen_pstart + xenheap_size;
printk("xen image pstart: 0x%lx, xenheap pend: 0x%lx\n",
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|