Commit 6fb332fa authored by Shaohua Li's avatar Shaohua Li Committed by Linus Torvalds

memory hotplug: exclude isolated page from pco page alloc

Pages marked as isolated should not be allocated again.  If such pages
reside in pcp list, they can be allocated too, so there is a ping-pong
memory offline frees some pages to pcp list and the pages get allocated
and then memory offline frees them again, this loop will happen again and
again.

This should have no impact in normal code path, because in normal code
path, pages in pcp list aren't isolated, and below loop will break in the
first entry.
Signed-off-by: default avatarShaohua Li <shaohua.li@intel.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Christoph Lameter <cl@linux-foundation.org>
Cc: Yakui Zhao <yakui.zhao@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 112067f0
...@@ -1143,10 +1143,20 @@ again: ...@@ -1143,10 +1143,20 @@ again:
/* Allocate more to the pcp list if necessary */ /* Allocate more to the pcp list if necessary */
if (unlikely(&page->lru == &pcp->list)) { if (unlikely(&page->lru == &pcp->list)) {
int get_one_page = 0;
pcp->count += rmqueue_bulk(zone, 0, pcp->count += rmqueue_bulk(zone, 0,
pcp->batch, &pcp->list, pcp->batch, &pcp->list,
migratetype, cold); migratetype, cold);
page = list_entry(pcp->list.next, struct page, lru); list_for_each_entry(page, &pcp->list, lru) {
if (get_pageblock_migratetype(page) !=
MIGRATE_ISOLATE) {
get_one_page = 1;
break;
}
}
if (!get_one_page)
goto failed;
} }
list_del(&page->lru); list_del(&page->lru);
......
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