aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2010-12-02 15:30:06 -0800
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2010-12-02 15:30:06 -0800
commit2a4c92fa24e1853d0e21f9e6e45859b832240f94 (patch)
tree03550915de5b335b5c333a75709e8c8b46514703 /drivers/xen
parentbc15fde77fc5d9ec2eec6066a5ab554ea1266a0a (diff)
downloadkernel_samsung_smdk4412-2a4c92fa24e1853d0e21f9e6e45859b832240f94.zip
kernel_samsung_smdk4412-2a4c92fa24e1853d0e21f9e6e45859b832240f94.tar.gz
kernel_samsung_smdk4412-2a4c92fa24e1853d0e21f9e6e45859b832240f94.tar.bz2
xen: prevent crashes with non-HIGHMEM 32-bit kernels with largeish memory
If this is a non-HIGHMEM 32-bit kernel, then the page structures only go up to the limit of addressable memory, even if more memory is physically present. Don't try to add that extra memory to the balloon. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/balloon.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 2b17ad5..43f9f02 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -412,8 +412,16 @@ 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(),
+ /*
+ * Initialise the balloon with excess memory space. We need
+ * to make sure we don't add memory which doesn't exist or
+ * logically exist. The E820 map can be trimmed to be smaller
+ * than the amount of physical memory due to the mem= command
+ * line parameter. And if this is a 32-bit non-HIGHMEM kernel
+ * on a system with memory which requires highmem to access,
+ * don't try to use it.
+ */
+ extra_pfn_end = min(min(max_pfn, 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 < extra_pfn_end;