aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/xen/balloon.c12
-rw-r--r--drivers/xen/gntdev.c2
-rw-r--r--include/xen/balloon.h5
3 files changed, 12 insertions, 7 deletions
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 5dfd8f8ff07f..cd8b4704ef4e 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -501,20 +501,24 @@ EXPORT_SYMBOL_GPL(balloon_set_new_target);
501 * alloc_xenballooned_pages - get pages that have been ballooned out 501 * alloc_xenballooned_pages - get pages that have been ballooned out
502 * @nr_pages: Number of pages to get 502 * @nr_pages: Number of pages to get
503 * @pages: pages returned 503 * @pages: pages returned
504 * @highmem: highmem or lowmem pages
504 * @return 0 on success, error otherwise 505 * @return 0 on success, error otherwise
505 */ 506 */
506int alloc_xenballooned_pages(int nr_pages, struct page** pages) 507int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem)
507{ 508{
508 int pgno = 0; 509 int pgno = 0;
509 struct page* page; 510 struct page* page;
510 mutex_lock(&balloon_mutex); 511 mutex_lock(&balloon_mutex);
511 while (pgno < nr_pages) { 512 while (pgno < nr_pages) {
512 page = balloon_retrieve(true); 513 page = balloon_retrieve(highmem);
513 if (page) { 514 if (page && PageHighMem(page) == highmem) {
514 pages[pgno++] = page; 515 pages[pgno++] = page;
515 } else { 516 } else {
516 enum bp_state st; 517 enum bp_state st;
517 st = decrease_reservation(nr_pages - pgno, GFP_HIGHUSER); 518 if (page)
519 balloon_append(page);
520 st = decrease_reservation(nr_pages - pgno,
521 highmem ? GFP_HIGHUSER : GFP_USER);
518 if (st != BP_DONE) 522 if (st != BP_DONE)
519 goto out_undo; 523 goto out_undo;
520 } 524 }
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index f914b26cf0c2..7b9b1d1b75a5 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -123,7 +123,7 @@ static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count)
123 NULL == add->pages) 123 NULL == add->pages)
124 goto err; 124 goto err;
125 125
126 if (alloc_xenballooned_pages(count, add->pages)) 126 if (alloc_xenballooned_pages(count, add->pages, false /* lowmem */))
127 goto err; 127 goto err;
128 128
129 for (i = 0; i < count; i++) { 129 for (i = 0; i < count; i++) {
diff --git a/include/xen/balloon.h b/include/xen/balloon.h
index 76f7538bb339..d29c153705bc 100644
--- a/include/xen/balloon.h
+++ b/include/xen/balloon.h
@@ -25,8 +25,9 @@ extern struct balloon_stats balloon_stats;
25 25
26void balloon_set_new_target(unsigned long target); 26void balloon_set_new_target(unsigned long target);
27 27
28int alloc_xenballooned_pages(int nr_pages, struct page** pages); 28int alloc_xenballooned_pages(int nr_pages, struct page **pages,
29void free_xenballooned_pages(int nr_pages, struct page** pages); 29 bool highmem);
30void free_xenballooned_pages(int nr_pages, struct page **pages);
30 31
31struct sys_device; 32struct sys_device;
32#ifdef CONFIG_XEN_SELFBALLOONING 33#ifdef CONFIG_XEN_SELFBALLOONING