diff options
Diffstat (limited to 'arch/x86/xen/setup.c')
-rw-r--r-- | arch/x86/xen/setup.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 02ffd9e48c9f..ff3dfa176814 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -183,6 +183,19 @@ static unsigned long __init xen_set_identity(const struct e820entry *list, | |||
183 | PFN_UP(start_pci), PFN_DOWN(last)); | 183 | PFN_UP(start_pci), PFN_DOWN(last)); |
184 | return identity; | 184 | return identity; |
185 | } | 185 | } |
186 | |||
187 | static unsigned long __init xen_get_max_pages(void) | ||
188 | { | ||
189 | unsigned long max_pages = MAX_DOMAIN_PAGES; | ||
190 | domid_t domid = DOMID_SELF; | ||
191 | int ret; | ||
192 | |||
193 | ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); | ||
194 | if (ret > 0) | ||
195 | max_pages = ret; | ||
196 | return min(max_pages, MAX_DOMAIN_PAGES); | ||
197 | } | ||
198 | |||
186 | /** | 199 | /** |
187 | * machine_specific_memory_setup - Hook for machine specific memory setup. | 200 | * machine_specific_memory_setup - Hook for machine specific memory setup. |
188 | **/ | 201 | **/ |
@@ -291,6 +304,12 @@ char * __init xen_memory_setup(void) | |||
291 | 304 | ||
292 | sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); | 305 | sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); |
293 | 306 | ||
307 | extra_limit = xen_get_max_pages(); | ||
308 | if (extra_limit >= max_pfn) | ||
309 | extra_pages = extra_limit - max_pfn; | ||
310 | else | ||
311 | extra_pages = 0; | ||
312 | |||
294 | extra_pages += xen_return_unused_memory(xen_start_info->nr_pages, &e820); | 313 | extra_pages += xen_return_unused_memory(xen_start_info->nr_pages, &e820); |
295 | 314 | ||
296 | /* | 315 | /* |