aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2011-09-28 12:46:32 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-09-29 11:12:09 -0400
commitaa24411b6717fd1e6ecef281bec497f6f30bbd66 (patch)
tree1cab7520c7732067732fcdbdfb2c7c50811bd18a
parentd93dc5c4478c1fd5de85a3e8aece9aad7bbae044 (diff)
xen/balloon: account for pages released during memory setup
In xen_memory_setup() pages that occur in gaps in the memory map are released back to Xen. This reduces the domain's current page count in the hypervisor. The Xen balloon driver does not correctly decrease its initial current_pages count to reflect this. If 'delta' pages are released and the target is adjusted the resulting reservation is always 'delta' less than the requested target. This affects dom0 if the initial allocation of pages overlaps the PCI memory region but won't affect most domU guests that have been setup with pseudo-physical memory maps that don't have gaps. Fix this by accouting for the released pages when starting the balloon driver. If the domain's targets are managed by xapi, the domain may eventually run out of memory and die because xapi currently gets its target calculations wrong and whenever it is restarted it always reduces the target by 'delta'. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-rw-r--r--arch/x86/xen/setup.c7
-rw-r--r--drivers/xen/balloon.c4
-rw-r--r--include/xen/page.h2
3 files changed, 11 insertions, 2 deletions
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
index 46d6d21dbdbe..c983717c018c 100644
--- a/arch/x86/xen/setup.c
+++ b/arch/x86/xen/setup.c
@@ -39,6 +39,9 @@ extern void xen_syscall32_target(void);
39/* Amount of extra memory space we add to the e820 ranges */ 39/* Amount of extra memory space we add to the e820 ranges */
40phys_addr_t xen_extra_mem_start, xen_extra_mem_size; 40phys_addr_t xen_extra_mem_start, xen_extra_mem_size;
41 41
42/* Number of pages released from the initial allocation. */
43unsigned long xen_released_pages;
44
42/* 45/*
43 * The maximum amount of extra memory compared to the base size. The 46 * The maximum amount of extra memory compared to the base size. The
44 * main scaling factor is the size of struct page. At extreme ratios 47 * main scaling factor is the size of struct page. At extreme ratios
@@ -313,7 +316,9 @@ char * __init xen_memory_setup(void)
313 extra_pages = 0; 316 extra_pages = 0;
314 } 317 }
315 318
316 extra_pages += xen_return_unused_memory(xen_start_info->nr_pages, &e820); 319 xen_released_pages = xen_return_unused_memory(xen_start_info->nr_pages,
320 &e820);
321 extra_pages += xen_released_pages;
317 322
318 /* 323 /*
319 * Clamp the amount of extra memory to a EXTRA_MEM_RATIO 324 * Clamp the amount of extra memory to a EXTRA_MEM_RATIO
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 5dfd8f8ff07f..4f59fb373381 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -565,7 +565,9 @@ static int __init balloon_init(void)
565 565
566 pr_info("xen/balloon: Initialising balloon driver.\n"); 566 pr_info("xen/balloon: Initialising balloon driver.\n");
567 567
568 balloon_stats.current_pages = xen_pv_domain() ? min(xen_start_info->nr_pages, max_pfn) : max_pfn; 568 balloon_stats.current_pages = xen_pv_domain()
569 ? min(xen_start_info->nr_pages - xen_released_pages, max_pfn)
570 : max_pfn;
569 balloon_stats.target_pages = balloon_stats.current_pages; 571 balloon_stats.target_pages = balloon_stats.current_pages;
570 balloon_stats.balloon_low = 0; 572 balloon_stats.balloon_low = 0;
571 balloon_stats.balloon_high = 0; 573 balloon_stats.balloon_high = 0;
diff --git a/include/xen/page.h b/include/xen/page.h
index 0be36b976f4b..92b61f8c772c 100644
--- a/include/xen/page.h
+++ b/include/xen/page.h
@@ -5,4 +5,6 @@
5 5
6extern phys_addr_t xen_extra_mem_start, xen_extra_mem_size; 6extern phys_addr_t xen_extra_mem_start, xen_extra_mem_size;
7 7
8extern unsigned long xen_released_pages;
9
8#endif /* _XEN_PAGE_H */ 10#endif /* _XEN_PAGE_H */