All of lore.kernel.org
 help / color / mirror / Atom feed
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Vrabel <david.vrabel@citrix.com>
Cc: xen-devel@lists.xenproject.org,
	Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	Daniel Kiper <daniel.kiper@oracle.com>
Subject: Re: [PATCHv2 08/10] xen/balloon: use hotplugged pages for foreign mappings etc.
Date: Fri, 24 Jul 2015 14:55:45 -0400	[thread overview]
Message-ID: <20150724185545.GD12824@l.oracle.com> (raw)
In-Reply-To: <1437738468-24110-9-git-send-email-david.vrabel@citrix.com>

On Fri, Jul 24, 2015 at 12:47:46PM +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

Is that udev rule already in distros?

> 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@citrix.com>
> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
> ---
>  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 cc68a4d..fd6970f3 100644
> --- a/drivers/xen/balloon.c
> +++ b/drivers/xen/balloon.c
> @@ -99,6 +99,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);
> @@ -127,6 +128,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)
> @@ -253,7 +255,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
> @@ -334,7 +337,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 */
>  
> @@ -538,13 +541,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) {
> +				int ret;
> +
> +				mutex_unlock(&balloon_mutex);
> +				ret = wait_event_timeout(balloon_wq,
> +					!list_empty(&ballooned_pages),
> +					msecs_to_jiffies(100));
> +				mutex_lock(&balloon_mutex);
> +				if (ret > 0)
> +					continue;
> +			}
> +
>  			st = decrease_reservation(nr_pages - pgno, GFP_USER);
>  			if (st != BP_DONE)
>  				goto out_undo;
> @@ -553,11 +574,8 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages)
>  	mutex_unlock(&balloon_mutex);
>  	return 0;
>   out_undo:
> -	while (pgno)
> -		balloon_append(pages[--pgno]);
> -	/* Free the memory back to the kernel soon */
> -	schedule_delayed_work(&balloon_worker, 0);
>  	mutex_unlock(&balloon_mutex);
> +	free_xenballooned_pages(pgno, pages);
>  	return -ENOMEM;
>  }
>  EXPORT_SYMBOL(alloc_xenballooned_pages);
> @@ -578,6 +596,8 @@ void free_xenballooned_pages(int nr_pages, struct page **pages)
>  			balloon_append(pages[i]);
>  	}
>  
> +	balloon_stats.target_unpopulated -= nr_pages;
> +
>  	/* The balloon may be too large now. Shrink it if needed. */
>  	if (current_credit())
>  		schedule_delayed_work(&balloon_worker, 0);
> diff --git a/include/xen/balloon.h b/include/xen/balloon.h
> index 83efdeb..d1767df 100644
> --- a/include/xen/balloon.h
> +++ b/include/xen/balloon.h
> @@ -8,6 +8,7 @@ struct balloon_stats {
>  	/* We aim for 'current allocation' == 'target allocation'. */
>  	unsigned long current_pages;
>  	unsigned long target_pages;
> +	unsigned long target_unpopulated;
>  	/* Number of pages in high- and low-memory balloons. */
>  	unsigned long balloon_low;
>  	unsigned long balloon_high;
> -- 
> 2.1.4
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Vrabel <david.vrabel@citrix.com>
Cc: xen-devel@lists.xenproject.org,
	Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	Daniel Kiper <daniel.kiper@oracle.com>
Subject: Re: [PATCHv2 08/10] xen/balloon: use hotplugged pages for foreign mappings etc.
Date: Fri, 24 Jul 2015 14:55:45 -0400	[thread overview]
Message-ID: <20150724185545.GD12824@l.oracle.com> (raw)
In-Reply-To: <1437738468-24110-9-git-send-email-david.vrabel@citrix.com>

On Fri, Jul 24, 2015 at 12:47:46PM +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

Is that udev rule already in distros?

> 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@citrix.com>
> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
> ---
>  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 cc68a4d..fd6970f3 100644
> --- a/drivers/xen/balloon.c
> +++ b/drivers/xen/balloon.c
> @@ -99,6 +99,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);
> @@ -127,6 +128,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)
> @@ -253,7 +255,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
> @@ -334,7 +337,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 */
>  
> @@ -538,13 +541,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) {
> +				int ret;
> +
> +				mutex_unlock(&balloon_mutex);
> +				ret = wait_event_timeout(balloon_wq,
> +					!list_empty(&ballooned_pages),
> +					msecs_to_jiffies(100));
> +				mutex_lock(&balloon_mutex);
> +				if (ret > 0)
> +					continue;
> +			}
> +
>  			st = decrease_reservation(nr_pages - pgno, GFP_USER);
>  			if (st != BP_DONE)
>  				goto out_undo;
> @@ -553,11 +574,8 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages)
>  	mutex_unlock(&balloon_mutex);
>  	return 0;
>   out_undo:
> -	while (pgno)
> -		balloon_append(pages[--pgno]);
> -	/* Free the memory back to the kernel soon */
> -	schedule_delayed_work(&balloon_worker, 0);
>  	mutex_unlock(&balloon_mutex);
> +	free_xenballooned_pages(pgno, pages);
>  	return -ENOMEM;
>  }
>  EXPORT_SYMBOL(alloc_xenballooned_pages);
> @@ -578,6 +596,8 @@ void free_xenballooned_pages(int nr_pages, struct page **pages)
>  			balloon_append(pages[i]);
>  	}
>  
> +	balloon_stats.target_unpopulated -= nr_pages;
> +
>  	/* The balloon may be too large now. Shrink it if needed. */
>  	if (current_credit())
>  		schedule_delayed_work(&balloon_worker, 0);
> diff --git a/include/xen/balloon.h b/include/xen/balloon.h
> index 83efdeb..d1767df 100644
> --- a/include/xen/balloon.h
> +++ b/include/xen/balloon.h
> @@ -8,6 +8,7 @@ struct balloon_stats {
>  	/* We aim for 'current allocation' == 'target allocation'. */
>  	unsigned long current_pages;
>  	unsigned long target_pages;
> +	unsigned long target_unpopulated;
>  	/* Number of pages in high- and low-memory balloons. */
>  	unsigned long balloon_low;
>  	unsigned long balloon_high;
> -- 
> 2.1.4
> 

  reply	other threads:[~2015-07-24 18:55 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-24 11:47 [PATCHv2 00/10] mm, xen/balloon: memory hotplug improvements David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47 ` [PATCHv2 01/10] mm: memory hotplug with an existing resource David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-28 14:54   ` Daniel Kiper
2015-07-28 14:54     ` Daniel Kiper
2015-07-28 14:54   ` Daniel Kiper
2015-07-24 11:47 ` [PATCHv2 02/10] xen/balloon: remove scratch page left overs David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47 ` [PATCHv2 03/10] x86/xen: discard RAM regions above the maximum reservation David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47 ` [PATCHv2 04/10] xen/balloon: find non-conflicting regions to place hotplugged memory David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47 ` [PATCHv2 05/10] xen/balloon: rationalize memory hotplug stats David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 18:54   ` Konrad Rzeszutek Wilk
2015-07-24 18:54     ` Konrad Rzeszutek Wilk
2015-07-24 18:54   ` Konrad Rzeszutek Wilk
2015-07-28 15:22   ` Daniel Kiper
2015-07-28 15:22     ` Daniel Kiper
2015-07-28 15:22   ` Daniel Kiper
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47 ` [PATCHv2 06/10] xen/balloon: only hotplug additional memory if required David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-29 15:55   ` Daniel Kiper
2015-07-29 15:55     ` Daniel Kiper
2015-07-29 16:02     ` David Vrabel
2015-07-29 16:02       ` David Vrabel
2015-07-29 16:02     ` David Vrabel
2015-07-29 15:55   ` Daniel Kiper
2015-07-24 11:47 ` [PATCHv2 07/10] xen/balloon: make alloc_xenballoon_pages() always allocate low pages David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47 ` [PATCHv2 08/10] xen/balloon: use hotplugged pages for foreign mappings etc David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 18:55   ` Konrad Rzeszutek Wilk [this message]
2015-07-24 18:55     ` Konrad Rzeszutek Wilk
2015-07-27 10:18     ` [Xen-devel] " David Vrabel
2015-07-27 10:18       ` David Vrabel
2015-07-27 10:18     ` David Vrabel
2015-07-24 18:55   ` Konrad Rzeszutek Wilk
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47 ` [PATCHv2 09/10] x86/xen: export xen_alloc_p2m_entry() David Vrabel
2015-07-24 11:47 ` David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 18:51   ` Konrad Rzeszutek Wilk
2015-07-24 18:51     ` Konrad Rzeszutek Wilk
2015-07-24 18:51   ` Konrad Rzeszutek Wilk
2015-07-29 16:10   ` Daniel Kiper
2015-07-29 16:10     ` Daniel Kiper
2015-07-29 16:10   ` Daniel Kiper
2015-07-24 11:47 ` [PATCHv2 10/10] xen/balloon: pre-allocate p2m entries for ballooned pages David Vrabel
2015-07-24 11:47   ` David Vrabel
2015-07-24 23:21   ` [Xen-devel] " Julien Grall
2015-07-24 23:21     ` Julien Grall
2015-07-27  9:30     ` David Vrabel
2015-07-27  9:30       ` David Vrabel
2015-07-27 11:01       ` Julien Grall
2015-07-27 11:01       ` [Xen-devel] " Julien Grall
2015-07-27 11:01         ` Julien Grall
2015-07-27 12:40         ` David Vrabel
2015-07-27 12:40           ` David Vrabel
2015-07-27 12:40         ` David Vrabel
2015-07-27  9:30     ` David Vrabel
2015-07-24 23:21   ` Julien Grall
2015-07-24 11:47 ` David Vrabel
2015-07-27 19:37 ` [PATCHv2 00/10] mm, xen/balloon: memory hotplug improvements Daniel Kiper
2015-07-27 19:37 ` Daniel Kiper
2015-07-27 19:37   ` Daniel Kiper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150724185545.GD12824@l.oracle.com \
    --to=konrad.wilk@oracle.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=daniel.kiper@oracle.com \
    --cc=david.vrabel@citrix.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.