On 08/19/09 06:05, Miroslav Rezanina wrote:
> when running linux as XEN guest and use boot parameter mem= to set memory
> lower then is assigned to guest, not used memory should be returned to
> hypervisor as free. This is working with kernel available on xen.org pages,
> but is not working with kernel 2.6.29. Comparing both kernels I found code
> for returning unused memory to hypervisor is missing. Following patch add
> this functionality to 2.6.29 kernel.
>
The idea is sound, but I think it might be better to walk the e820
table, and remove any memory ranges which aren't marked as E820_RAM.
That makes it possible to carve holes in the address space as well as
simply truncate it.
Also, something appears to have smashed your indentation.
J
> Miroslav Rezanina <mrezanin@xxxxxxxxxx>
> --
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index 6a8811a..fd6b0e7 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -118,6 +118,10 @@ struct boot_params __initdata boot_params;
> struct boot_params boot_params;
> #endif
>
> +#ifdef CONFIG_XEN
> +void __init xen_return_unused_mem(void);
> +#endif
> +
> /*
> * Machine setup..
> */
> @@ -920,6 +924,9 @@ void __init setup_arch(char **cmdline_p)
> paging_init();
> paravirt_pagetable_setup_done(swapper_pg_dir);
> paravirt_post_allocator_init();
> +#ifdef CONFIG_XEN
> + xen_return_unused_mem();
> +#endif
>
> #ifdef CONFIG_X86_64
> map_vsyscall();
> diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
> index 15c6c68..bc5d2bc 100644
> --- a/arch/x86/xen/setup.c
> +++ b/arch/x86/xen/setup.c
> @@ -20,6 +20,7 @@
> #include <xen/page.h>
> #include <xen/interface/callback.h>
> #include <xen/interface/physdev.h>
> +#include <xen/interface/memory.h>
> #include <xen/features.h>
>
> #include "xen-ops.h"
> @@ -34,6 +35,36 @@ extern void xen_syscall32_target(void);
>
>
> /**
> + * Author: Miroslav Rezanina <mrezanin@xxxxxxxxxx>
> + * Function retuns unused memory to hypevisor
> + **/
> +void __init xen_return_unused_mem(void)
> +{
> + if (xen_start_info->nr_pages > max_pfn) {
> + /*
> + * the max_pfn was shrunk (probably by mem=
> + * kernel parameter); shrink reservation with the HV
> + */
> + struct xen_memory_reservation reservation = {
> + .address_bits = 0,
> + .extent_order = 0,
> + .domid = DOMID_SELF
> + };
> + unsigned int difference;
> + int ret;
> +
> + difference = xen_start_info->nr_pages - max_pfn;
> +
> + set_xen_guest_handle(reservation.extent_start,
> + ((unsigned long *)xen_start_info->mfn_list) + max_pfn);
> + reservation.nr_extents = difference;
> + ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
> + &reservation);
> + BUG_ON (ret != difference);
> + }
> +}
> +
> +/**
> * machine_specific_memory_setup - Hook for machine specific memory setup.
> **/
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|