提交 a97dae1a 编写于 作者: D David Vrabel

x86/xen: add extra memory for remapped frames during setup

If the non-RAM regions in the e820 memory map are larger than the size
of the initial balloon, a BUG was triggered as the frames are remaped
beyond the limit of the linear p2m.  The frames are remapped into the
initial balloon area (xen_extra_mem) but not enough of this is
available.

Ensure enough extra memory regions are added for these remapped
frames.
Signed-off-by: NDavid Vrabel <david.vrabel@citrix.com>
Reviewed-by: NJuergen Gross <jgross@suse.com>
上级 bc7142cf
...@@ -366,7 +366,7 @@ static void __init xen_do_set_identity_and_remap_chunk( ...@@ -366,7 +366,7 @@ static void __init xen_do_set_identity_and_remap_chunk(
static unsigned long __init xen_set_identity_and_remap_chunk( static unsigned long __init xen_set_identity_and_remap_chunk(
const struct e820entry *list, size_t map_size, unsigned long start_pfn, const struct e820entry *list, size_t map_size, unsigned long start_pfn,
unsigned long end_pfn, unsigned long nr_pages, unsigned long remap_pfn, unsigned long end_pfn, unsigned long nr_pages, unsigned long remap_pfn,
unsigned long *released) unsigned long *released, unsigned long *remapped)
{ {
unsigned long pfn; unsigned long pfn;
unsigned long i = 0; unsigned long i = 0;
...@@ -404,6 +404,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk( ...@@ -404,6 +404,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk(
/* Update variables to reflect new mappings. */ /* Update variables to reflect new mappings. */
i += size; i += size;
remap_pfn += size; remap_pfn += size;
*remapped += size;
} }
/* /*
...@@ -420,12 +421,13 @@ static unsigned long __init xen_set_identity_and_remap_chunk( ...@@ -420,12 +421,13 @@ static unsigned long __init xen_set_identity_and_remap_chunk(
static void __init xen_set_identity_and_remap( static void __init xen_set_identity_and_remap(
const struct e820entry *list, size_t map_size, unsigned long nr_pages, const struct e820entry *list, size_t map_size, unsigned long nr_pages,
unsigned long *released) unsigned long *released, unsigned long *remapped)
{ {
phys_addr_t start = 0; phys_addr_t start = 0;
unsigned long last_pfn = nr_pages; unsigned long last_pfn = nr_pages;
const struct e820entry *entry; const struct e820entry *entry;
unsigned long num_released = 0; unsigned long num_released = 0;
unsigned long num_remapped = 0;
int i; int i;
/* /*
...@@ -452,12 +454,13 @@ static void __init xen_set_identity_and_remap( ...@@ -452,12 +454,13 @@ static void __init xen_set_identity_and_remap(
last_pfn = xen_set_identity_and_remap_chunk( last_pfn = xen_set_identity_and_remap_chunk(
list, map_size, start_pfn, list, map_size, start_pfn,
end_pfn, nr_pages, last_pfn, end_pfn, nr_pages, last_pfn,
&num_released); &num_released, &num_remapped);
start = end; start = end;
} }
} }
*released = num_released; *released = num_released;
*remapped = num_remapped;
pr_info("Released %ld page(s)\n", num_released); pr_info("Released %ld page(s)\n", num_released);
} }
...@@ -577,6 +580,7 @@ char * __init xen_memory_setup(void) ...@@ -577,6 +580,7 @@ char * __init xen_memory_setup(void)
struct xen_memory_map memmap; struct xen_memory_map memmap;
unsigned long max_pages; unsigned long max_pages;
unsigned long extra_pages = 0; unsigned long extra_pages = 0;
unsigned long remapped_pages;
int i; int i;
int op; int op;
...@@ -626,9 +630,10 @@ char * __init xen_memory_setup(void) ...@@ -626,9 +630,10 @@ char * __init xen_memory_setup(void)
* underlying RAM. * underlying RAM.
*/ */
xen_set_identity_and_remap(map, memmap.nr_entries, max_pfn, xen_set_identity_and_remap(map, memmap.nr_entries, max_pfn,
&xen_released_pages); &xen_released_pages, &remapped_pages);
extra_pages += xen_released_pages; extra_pages += xen_released_pages;
extra_pages += remapped_pages;
/* /*
* Clamp the amount of extra memory to a EXTRA_MEM_RATIO * Clamp the amount of extra memory to a EXTRA_MEM_RATIO
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册