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

Re: [Xen-devel] [PATCHv1 8/8] xen/balloon: use hotplugged pages for foreign mappings etc.



On Thu, Jun 25, 2015 at 06:11:03PM +0100, David Vrabel wrote:
> alloc_xenballooned_pages() is used to get ballooned pages to back
> foreign mappings etc.  Instead of having to balloon out real pages,
> use (if supported) hotplugged memory.
>
> This makes more memory available to the guest and reduces
> fragmentation in the p2m.
>
> If userspace is lacking a udev rule (or similar) to online hotplugged
> regions automatically, alloc_xenballooned_pages() will timeout and
> fall back to the old behaviour of ballooning out pages.
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>

In general Reviewed-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx> but...

> ---
>  drivers/xen/balloon.c |   32 ++++++++++++++++++++++++++------
>  include/xen/balloon.h |    1 +
>  2 files changed, 27 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
> index 95c261c..a26c5f3 100644
> --- a/drivers/xen/balloon.c
> +++ b/drivers/xen/balloon.c
> @@ -97,6 +97,7 @@ static xen_pfn_t frame_list[PAGE_SIZE / sizeof(unsigned 
> long)];
>
>  /* List of ballooned pages, threaded through the mem_map array. */
>  static LIST_HEAD(ballooned_pages);
> +static DECLARE_WAIT_QUEUE_HEAD(balloon_wq);
>
>  /* Main work function, always executed in process context. */
>  static void balloon_process(struct work_struct *work);
> @@ -125,6 +126,7 @@ static void __balloon_append(struct page *page)
>               list_add(&page->lru, &ballooned_pages);
>               balloon_stats.balloon_low++;
>       }
> +     wake_up(&balloon_wq);
>  }
>
>  static void balloon_append(struct page *page)
> @@ -247,7 +249,8 @@ static enum bp_state reserve_additional_memory(void)
>       int nid, rc;
>       unsigned long balloon_hotplug;
>
> -     credit = balloon_stats.target_pages - balloon_stats.total_pages;
> +     credit = balloon_stats.target_pages + balloon_stats.target_unpopulated
> +             - balloon_stats.total_pages;
>
>       /*
>        * Already hotplugged enough pages?  Wait for them to be
> @@ -328,7 +331,7 @@ static struct notifier_block xen_memory_nb = {
>  static enum bp_state reserve_additional_memory(void)
>  {
>       balloon_stats.target_pages = balloon_stats.current_pages;
> -     return BP_DONE;
> +     return BP_ECANCELED;
>  }
>  #endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
>
> @@ -532,13 +535,31 @@ int alloc_xenballooned_pages(int nr_pages, struct page 
> **pages)
>  {
>       int pgno = 0;
>       struct page *page;
> +
>       mutex_lock(&balloon_mutex);
> +
> +     balloon_stats.target_unpopulated += nr_pages;
> +
>       while (pgno < nr_pages) {
>               page = balloon_retrieve(true);
>               if (page) {
>                       pages[pgno++] = page;
>               } else {
>                       enum bp_state st;
> +
> +                     st = reserve_additional_memory();
> +                     if (st != BP_ECANCELED) {

...think if you use BP_ECANCELED in patch #6...

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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