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:
kaf24@firebug.cl.cam.ac.uk committed 2005-03-16 09:46:54 +00:00
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 *
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.