[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: [PATCH][v2.6.29][XEN] Return unused memory to hypervisor



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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.