Commit 5eef150c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'stable/e820-3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen

* 'stable/e820-3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
  xen: release all pages within 1-1 p2m mappings
  xen: allow extra memory to be in multiple regions
  xen: allow balloon driver to use more than one memory region
  xen/balloon: simplify test for the end of usable RAM
  xen/balloon: account for pages released during memory setup
parents 315eb8a2 f3f436e3
This diff is collapsed.
...@@ -555,17 +555,40 @@ void free_xenballooned_pages(int nr_pages, struct page** pages) ...@@ -555,17 +555,40 @@ void free_xenballooned_pages(int nr_pages, struct page** pages)
} }
EXPORT_SYMBOL(free_xenballooned_pages); EXPORT_SYMBOL(free_xenballooned_pages);
static int __init balloon_init(void) static void __init balloon_add_region(unsigned long start_pfn,
unsigned long pages)
{ {
unsigned long pfn, extra_pfn_end; unsigned long pfn, extra_pfn_end;
struct page *page; struct page *page;
/*
* If the amount of usable memory has been limited (e.g., with
* the 'mem' command line parameter), don't add pages beyond
* this limit.
*/
extra_pfn_end = min(max_pfn, start_pfn + pages);
for (pfn = start_pfn; pfn < extra_pfn_end; pfn++) {
page = pfn_to_page(pfn);
/* totalram_pages and totalhigh_pages do not
include the boot-time balloon extension, so
don't subtract from it. */
__balloon_append(page);
}
}
static int __init balloon_init(void)
{
int i;
if (!xen_domain()) if (!xen_domain())
return -ENODEV; return -ENODEV;
pr_info("xen/balloon: Initialising balloon driver.\n"); pr_info("xen/balloon: Initialising balloon driver.\n");
balloon_stats.current_pages = xen_pv_domain() ? min(xen_start_info->nr_pages, max_pfn) : max_pfn; balloon_stats.current_pages = xen_pv_domain()
? min(xen_start_info->nr_pages - xen_released_pages, max_pfn)
: max_pfn;
balloon_stats.target_pages = balloon_stats.current_pages; balloon_stats.target_pages = balloon_stats.current_pages;
balloon_stats.balloon_low = 0; balloon_stats.balloon_low = 0;
balloon_stats.balloon_high = 0; balloon_stats.balloon_high = 0;
...@@ -584,24 +607,13 @@ static int __init balloon_init(void) ...@@ -584,24 +607,13 @@ static int __init balloon_init(void)
#endif #endif
/* /*
* Initialise the balloon with excess memory space. We need * Initialize the balloon with pages from the extra memory
* to make sure we don't add memory which doesn't exist or * regions (see arch/x86/xen/setup.c).
* 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()), for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++)
(unsigned long)PFN_DOWN(xen_extra_mem_start + xen_extra_mem_size)); if (xen_extra_mem[i].size)
for (pfn = PFN_UP(xen_extra_mem_start); balloon_add_region(PFN_UP(xen_extra_mem[i].start),
pfn < extra_pfn_end; PFN_DOWN(xen_extra_mem[i].size));
pfn++) {
page = pfn_to_page(pfn);
/* totalram_pages and totalhigh_pages do not include the boot-time
balloon extension, so don't subtract from it. */
__balloon_append(page);
}
return 0; return 0;
} }
......
...@@ -3,6 +3,16 @@ ...@@ -3,6 +3,16 @@
#include <asm/xen/page.h> #include <asm/xen/page.h>
extern phys_addr_t xen_extra_mem_start, xen_extra_mem_size; struct xen_memory_region {
phys_addr_t start;
phys_addr_t size;
};
#define XEN_EXTRA_MEM_MAX_REGIONS 128 /* == E820MAX */
extern __initdata
struct xen_memory_region xen_extra_mem[XEN_EXTRA_MEM_MAX_REGIONS];
extern unsigned long xen_released_pages;
#endif /* _XEN_PAGE_H */ #endif /* _XEN_PAGE_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment