mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
bitkeeper revision 1.1159.258.58 (4238008ex_KSQqR2a5fd8soijqba4g)
If a Linux guest is allocated more memory than it can use (due to highmem constraints) it will now give that RAM back to Xen. Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
b336843e00
commit
d5e030e698
2 files changed
+40
-13
No files matched your search
@@ -377,15 +377,31 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
paging_init();
|
||||
|
||||
/* Make sure we have a large enough P->M table. */
|
||||
if ( max_pfn > xen_start_info.nr_pages )
|
||||
/* Make sure we have a correctly sized P->M table. */
|
||||
if ( max_pfn != xen_start_info.nr_pages )
|
||||
{
|
||||
phys_to_machine_mapping = alloc_bootmem_low_pages(
|
||||
max_pfn * sizeof(unsigned long));
|
||||
memset(phys_to_machine_mapping, ~0, max_pfn * sizeof(unsigned long));
|
||||
memcpy(phys_to_machine_mapping,
|
||||
(unsigned long *)xen_start_info.mfn_list,
|
||||
xen_start_info.nr_pages * sizeof(unsigned long));
|
||||
if ( max_pfn > xen_start_info.nr_pages )
|
||||
{
|
||||
memset(phys_to_machine_mapping, ~0,
|
||||
max_pfn * sizeof(unsigned long));
|
||||
memcpy(phys_to_machine_mapping,
|
||||
(unsigned long *)xen_start_info.mfn_list,
|
||||
xen_start_info.nr_pages * sizeof(unsigned long));
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(phys_to_machine_mapping,
|
||||
(unsigned long *)xen_start_info.mfn_list,
|
||||
max_pfn * sizeof(unsigned long));
|
||||
if (HYPERVISOR_dom_mem_op(
|
||||
MEMOP_decrease_reservation,
|
||||
(unsigned long *)xen_start_info.mfn_list + max_pfn,
|
||||
xen_start_info.nr_pages - max_pfn, 0) !=
|
||||
(xen_start_info.nr_pages - max_pfn))
|
||||
BUG();
|
||||
}
|
||||
free_bootmem(__pa(xen_start_info.mfn_list),
|
||||
PFN_PHYS(PFN_UP(xen_start_info.nr_pages *
|
||||
sizeof(unsigned long))));
|
||||
|
||||
@@ -1491,15 +1491,26 @@ void __init setup_arch(char **cmdline_p)
|
||||
#endif
|
||||
paging_init();
|
||||
|
||||
/* Make sure we have a large enough P->M table. */
|
||||
if (max_pfn > xen_start_info.nr_pages) {
|
||||
/* Make sure we have a correctly sized P->M table. */
|
||||
if (max_pfn != xen_start_info.nr_pages) {
|
||||
phys_to_machine_mapping = alloc_bootmem_low_pages(
|
||||
max_pfn * sizeof(unsigned long));
|
||||
memset(phys_to_machine_mapping, ~0,
|
||||
max_pfn * sizeof(unsigned long));
|
||||
memcpy(phys_to_machine_mapping,
|
||||
(unsigned long *)xen_start_info.mfn_list,
|
||||
xen_start_info.nr_pages * sizeof(unsigned long));
|
||||
if (max_pfn > xen_start_info.nr_pages) {
|
||||
memset(phys_to_machine_mapping, ~0,
|
||||
max_pfn * sizeof(unsigned long));
|
||||
memcpy(phys_to_machine_mapping,
|
||||
(unsigned long *)xen_start_info.mfn_list,
|
||||
xen_start_info.nr_pages * sizeof(unsigned long));
|
||||
} else {
|
||||
memcpy(phys_to_machine_mapping,
|
||||
(unsigned long *)xen_start_info.mfn_list,
|
||||
max_pfn * sizeof(unsigned long));
|
||||
if (HYPERVISOR_dom_mem_op(
|
||||
MEMOP_decrease_reservation,
|
||||
(unsigned long *)xen_start_info.mfn_list + max_pfn,
|
||||
xen_start_info.nr_pages - max_pfn, 0) !=
|
||||
(xen_start_info.nr_pages - max_pfn)) BUG();
|
||||
}
|
||||
free_bootmem(
|
||||
__pa(xen_start_info.mfn_list),
|
||||
PFN_PHYS(PFN_UP(xen_start_info.nr_pages *
|
||||
|
||||