aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorShaohua Li <shaohua.li@intel.com>2009-09-21 20:01:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-09-22 10:17:25 -0400
commit6fb332fabd7288af9dbe7992394aa6ba97c1a537 (patch)
tree261fe72f01461d65532730f283108be2306b80b5 /mm
parent112067f0905b2de862c607ee62411cf47d2fe5c4 (diff)
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>
Diffstat (limited to 'mm')
-rw-r--r--mm/page_alloc.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 1a3a893ef50e..8a8302711725 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1143,10 +1143,20 @@ again:
1143 1143
1144 /* Allocate more to the pcp list if necessary */ 1144 /* Allocate more to the pcp list if necessary */
1145 if (unlikely(&page->lru == &pcp->list)) { 1145 if (unlikely(&page->lru == &pcp->list)) {
1146 int get_one_page = 0;
1147
1146 pcp->count += rmqueue_bulk(zone, 0, 1148 pcp->count += rmqueue_bulk(zone, 0,
1147 pcp->batch, &pcp->list, 1149 pcp->batch, &pcp->list,
1148 migratetype, cold); 1150 migratetype, cold);
1149 page = list_entry(pcp->list.next, struct page, lru); 1151 list_for_each_entry(page, &pcp->list, lru) {
1152 if (get_pageblock_migratetype(page) !=
1153 MIGRATE_ISOLATE) {
1154 get_one_page = 1;
1155 break;
1156 }
1157 }
1158 if (!get_one_page)
1159 goto failed;
1150 } 1160 }
1151 1161
1152 list_del(&page->lru); 1162 list_del(&page->lru);