aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/xen/setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/xen/setup.c')
-rw-r--r--arch/x86/xen/setup.c19
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
187static 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 /*