aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-03-16 09:46:54 +0000
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-03-16 09:46:54 +0000
commitd5e030e698c55a3f358ef09fde39657ded1ead53 (patch)
treeda0e814f6fef843a5427f7cff728551f3d0aea78
parentb336843e00376acccd75e81b47d4b2c5021c12fc (diff)
downloadxen-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.c28
-rw-r--r--linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c25
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 *