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