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

[Xen-ia64-devel] [PATCH] Automatic xenheap sizing



   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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.