On Thu, Sep 15, 2011 at 01:29:24PM +0100, David Vrabel wrote:
> From: David Vrabel <david.vrabel@xxxxxxxxxx>
>
> In xen_memory_setup() pages that occur in gaps in the memory map are
> released back to Xen. This reduces the domain's current page count in
> the hypervisor. The Xen balloon driver does not correctly decrease
> its initial current_pages count to reflect this. If 'delta' pages are
> released and the target is adjusted the resulting reservation is
> always 'delta' less than the requested target.
>
> This affects dom0 if the initial allocation of pages overlaps the PCI
> memory region but won't affect most domU guests that have been setup
> with pseudo-physical memory maps that don't have gaps.
>
> Fix this by accouting for the released pages when starting the balloon
> driver.
Does this make the behaviour of the pvops guest be similar to the
old-style XenOLinux? If so, perhaps we should include that in the git
description for usability purposes (ie, when somebody searches the git
log for what has happened in v3.2 Linux).
>
> If the domain's targets are managed by xapi, the domain may eventually
> run out of memory and die because xapi currently gets its target
> calculations wrong and whenever it is restarted it always reduces the
> target by 'delta'.
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> ---
> arch/x86/xen/setup.c | 7 ++++++-
> drivers/xen/balloon.c | 4 +++-
> include/xen/page.h | 2 ++
> 3 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
> index 46d6d21..c983717 100644
> --- a/arch/x86/xen/setup.c
> +++ b/arch/x86/xen/setup.c
> @@ -39,6 +39,9 @@ extern void xen_syscall32_target(void);
> /* Amount of extra memory space we add to the e820 ranges */
> phys_addr_t xen_extra_mem_start, xen_extra_mem_size;
>
> +/* Number of pages released from the initial allocation. */
> +unsigned long xen_released_pages;
> +
> /*
> * The maximum amount of extra memory compared to the base size. The
> * main scaling factor is the size of struct page. At extreme ratios
> @@ -313,7 +316,9 @@ char * __init xen_memory_setup(void)
> extra_pages = 0;
> }
>
> - extra_pages += xen_return_unused_memory(xen_start_info->nr_pages,
> &e820);
> + xen_released_pages = xen_return_unused_memory(xen_start_info->nr_pages,
> + &e820);
> + extra_pages += xen_released_pages;
>
> /*
> * Clamp the amount of extra memory to a EXTRA_MEM_RATIO
> diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
> index 5dfd8f8..4f59fb3 100644
> --- a/drivers/xen/balloon.c
> +++ b/drivers/xen/balloon.c
> @@ -565,7 +565,9 @@ static int __init balloon_init(void)
>
> pr_info("xen/balloon: Initialising balloon driver.\n");
>
> - balloon_stats.current_pages = xen_pv_domain() ?
> min(xen_start_info->nr_pages, max_pfn) : max_pfn;
> + balloon_stats.current_pages = xen_pv_domain()
> + ? min(xen_start_info->nr_pages - xen_released_pages, max_pfn)
> + : max_pfn;
> balloon_stats.target_pages = balloon_stats.current_pages;
> balloon_stats.balloon_low = 0;
> balloon_stats.balloon_high = 0;
> diff --git a/include/xen/page.h b/include/xen/page.h
> index 0be36b9..92b61f8 100644
> --- a/include/xen/page.h
> +++ b/include/xen/page.h
> @@ -5,4 +5,6 @@
>
> extern phys_addr_t xen_extra_mem_start, xen_extra_mem_size;
>
> +extern unsigned long xen_released_pages;
> +
> #endif /* _XEN_PAGE_H */
> --
> 1.7.2.5
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|