Commit 72e9cf2a authored by Daniel De Graaf's avatar Daniel De Graaf Committed by Konrad Rzeszutek Wilk

xen/balloon: Avoid OOM when requesting highmem

If highmem pages are requested from the balloon on a system without
highmem, the implementation of alloc_xenballooned_pages will allocate
all available memory trying to find highmem pages to return. Allow
low memory to be returned when highmem pages are requested to avoid
this loop.
Signed-off-by: default avatarDaniel De Graaf <dgdegra@tycho.nsa.gov>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 5f76d707
...@@ -501,7 +501,7 @@ EXPORT_SYMBOL_GPL(balloon_set_new_target); ...@@ -501,7 +501,7 @@ EXPORT_SYMBOL_GPL(balloon_set_new_target);
* alloc_xenballooned_pages - get pages that have been ballooned out * alloc_xenballooned_pages - get pages that have been ballooned out
* @nr_pages: Number of pages to get * @nr_pages: Number of pages to get
* @pages: pages returned * @pages: pages returned
* @highmem: highmem or lowmem pages * @highmem: allow highmem pages
* @return 0 on success, error otherwise * @return 0 on success, error otherwise
*/ */
int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem) int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem)
...@@ -511,7 +511,7 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem) ...@@ -511,7 +511,7 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem)
mutex_lock(&balloon_mutex); mutex_lock(&balloon_mutex);
while (pgno < nr_pages) { while (pgno < nr_pages) {
page = balloon_retrieve(highmem); page = balloon_retrieve(highmem);
if (page && PageHighMem(page) == highmem) { if (page && (highmem || !PageHighMem(page))) {
pages[pgno++] = page; pages[pgno++] = page;
} else { } else {
enum bp_state st; enum bp_state st;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment