diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-03-16 09:46:54 +0000 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-03-16 09:46:54 +0000 |
commit | d5e030e698c55a3f358ef09fde39657ded1ead53 (patch) | |
tree | da0e814f6fef843a5427f7cff728551f3d0aea78 | |
parent | b336843e00376acccd75e81b47d4b2c5021c12fc (diff) | |
download | xen-d5e030e698c55a3f358ef09fde39657ded1ead53.tar.gz xen-d5e030e698c55a3f358ef09fde39657ded1ead53.tar.bz2 xen-d5e030e698c55a3f358ef09fde39657ded1ead53.zip |
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>
-rw-r--r-- | linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c | 28 | ||||
-rw-r--r-- | linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c | 25 |
2 files changed, 40 insertions, 13 deletions
diff --git a/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c b/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c index 46507fbd93..50fc7c1b13 100644 --- a/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c +++ b/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c @@ -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)))); diff --git a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c index 9b892b04ba..8551fad5a7 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c +++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c @@ -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 * |