diff options
Diffstat (limited to 'arch/x86/xen/setup.c')
| -rw-r--r-- | arch/x86/xen/setup.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index df118a825f3..46d6d21dbdb 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c @@ -184,6 +184,19 @@ static unsigned long __init xen_set_identity(const struct e820entry *list,  					PFN_UP(start_pci), PFN_DOWN(last));  	return identity;  } + +static unsigned long __init xen_get_max_pages(void) +{ +	unsigned long max_pages = MAX_DOMAIN_PAGES; +	domid_t domid = DOMID_SELF; +	int ret; + +	ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); +	if (ret > 0) +		max_pages = ret; +	return min(max_pages, MAX_DOMAIN_PAGES); +} +  /**   * machine_specific_memory_setup - Hook for machine specific memory setup.   **/ @@ -292,6 +305,14 @@ char * __init xen_memory_setup(void)  	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); +	extra_limit = xen_get_max_pages(); +	if (max_pfn + extra_pages > extra_limit) { +		if (extra_limit > max_pfn) +			extra_pages = extra_limit - max_pfn; +		else +			extra_pages = 0; +	} +  	extra_pages += xen_return_unused_memory(xen_start_info->nr_pages, &e820);  	/*  |