mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
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: Shaohua 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
112067f090
commit
6fb332fabd
@ -1143,10 +1143,20 @@ again:
|
||||
|
||||
/* Allocate more to the pcp list if necessary */
|
||||
if (unlikely(&page->lru == &pcp->list)) {
|
||||
int get_one_page = 0;
|
||||
|
||||
pcp->count += rmqueue_bulk(zone, 0,
|
||||
pcp->batch, &pcp->list,
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user