xen/balloon: make sure we only include remaining extra ram
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Tue, 14 Sep 2010 17:32:32 +0000 (10:32 -0700)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Sat, 20 Nov 2010 06:18:26 +0000 (22:18 -0800)
If the user specifies mem= on the kernel command line, some or all
of the extra memory E820 region may be clipped away, so make sure
we don't try to add more extra memory than exists in E820.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
drivers/xen/balloon.c

index 77b5dc3597e31d6c543e9c8cd5959cca53d5c375..2b17ad5b4b32d27277a115de4cd2fd7834f7769d 100644 (file)
@@ -50,6 +50,7 @@
 #include <asm/pgtable.h>
 #include <asm/uaccess.h>
 #include <asm/tlb.h>
+#include <asm/e820.h>
 
 #include <asm/xen/hypervisor.h>
 #include <asm/xen/hypercall.h>
@@ -391,7 +392,7 @@ static struct notifier_block xenstore_notifier;
 
 static int __init balloon_init(void)
 {
-       unsigned long pfn;
+       unsigned long pfn, extra_pfn_end;
        struct page *page;
 
        if (!xen_pv_domain())
@@ -412,8 +413,10 @@ static int __init balloon_init(void)
        register_balloon(&balloon_sysdev);
 
        /* Initialise the balloon with excess memory space. */
+       extra_pfn_end = min(e820_end_of_ram_pfn(),
+                           (unsigned long)PFN_DOWN(xen_extra_mem_start + xen_extra_mem_size));
        for (pfn = PFN_UP(xen_extra_mem_start);
-            pfn < PFN_DOWN(xen_extra_mem_start + xen_extra_mem_size);
+            pfn < extra_pfn_end;
             pfn++) {
                page = pfn_to_page(pfn);
                /* totalram_pages doesn't include the boot-time