From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH 2/3] xen-balloon: Add interface to retrieve ballooned pages Date: Wed, 9 Mar 2011 16:59:03 -0500 Message-ID: <20110309215903.GB18343@dumpdata.com> References: <1299521208-8531-1-git-send-email-dgdegra@tycho.nsa.gov> <1299521208-8531-3-git-send-email-dgdegra@tycho.nsa.gov> <20110309210354.GN8049@dumpdata.com> <4D77EF7C.10505@tycho.nsa.gov> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <4D77EF7C.10505@tycho.nsa.gov> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Daniel De Graaf Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com List-Id: xen-devel@lists.xenproject.org On Wed, Mar 09, 2011 at 04:22:04PM -0500, Daniel De Graaf wrote: > On 03/09/2011 04:03 PM, Konrad Rzeszutek Wilk wrote: > > On Mon, Mar 07, 2011 at 01:06:47PM -0500, Daniel De Graaf wrote: > >> Pages that have been ballooned are useful for other Xen drivers doing > >> grant table actions, because these pages have valid struct page/PFNs but > >> have no valid MFN so are available for remapping. > >> > >> Signed-off-by: Daniel De Graaf > >> --- > >> drivers/xen/balloon.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ > >> include/xen/balloon.h | 3 ++ > >> 2 files changed, 57 insertions(+), 0 deletions(-) > >> > >> diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c > >> index b0a7a92..be53596 100644 > >> --- a/drivers/xen/balloon.c > >> +++ b/drivers/xen/balloon.c > >> @@ -328,6 +328,60 @@ void balloon_set_new_target(unsigned long target) > >> } > >> EXPORT_SYMBOL_GPL(balloon_set_new_target); > >> > >> +/** > >> + * get_ballooned_pages - get pages that have been ballooned out > >> + * @nr_pages: Number of pages to get > >> + * @pages: pages returned > >> + * @force: Try to balloon out more pages if needed > >> + * @return number of pages retrieved > >> + */ > >> +int get_ballooned_pages(int nr_pages, struct page** pages, int force) > >> +{ > >> + int rv = 0; > >> + struct page* page; > >> + mutex_lock(&balloon_mutex); > >> + /* Pages are pulled off the back of the queue to prefer highmem */ > >> + while (rv < nr_pages) { > >> + if (list_empty(&ballooned_pages)) { > >> + if (!force) > >> + break; > >> + if (decrease_reservation(nr_pages - rv)) > > > > I am looking at the implementation of decrease_reservation with > > Daniel's Kipper patches ("xen/balloon: Protect against CPU exhaust by event/x process") > > and his code will the functionality of trying to balloon out the amount of > > pages you want. But if it can't balloon out all, it will try the best it > > can. Meaning if nr_pages is 256 and rv is 0, and we only say get 100 of them, > > this particular loop would keep on going forever.. until it got the rest > > of those 156 pages which it might not. > > > > Perhaps rebasing on top of Daniel's patch and utilize the BP_EAGAIN logic > > to back-off, or just return -EBUSY with the amount returned? > > > > I think adding a parameter to decrease_reservation specifying what GFP_* flags > will be used in allocation might be useful. The correct rebase of my most recent > patch on top of Daniel Kiper's patch would be to return -ENOMEM when > decrease_reservation returns BP_EAGAIN. Since GFP_BALLOON does not try very hard > in the memory allocation, this might produce memory errors more often than it > should, whereas the alloc_xenballooned_pages call may wish to just use GFP_HIGHUSER > and risk invoking the OOM killer if required. OK. Looking forward to the patches. > > Would you prefer I submitted all three patches rebased on top of Daniel Kipper's > R4 patches (or do you have ak git tree with those already included)? #devel/balloon-hotplug (jsut pushed it so it might take 10 minutes for it to show up).