aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorVlastimil Babka <vbabka@suse.cz>2016-06-03 17:55:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-06-03 19:02:56 -0400
commit83b9355bf6f449c7d1231206c300ea89d3313a9d (patch)
tree7f780a66a7476fcd2410d6932b957c9e9dd0afa0 /mm
parent879be4f378cb412af3a3fe107d35835c99099add (diff)
mm, page_alloc: prevent infinite loop in buffered_rmqueue()
In DEBUG_VM kernel, we can hit infinite loop for order == 0 in buffered_rmqueue() when check_new_pcp() returns 1, because the bad page is never removed from the pcp list. Fix this by removing the page before retrying. Also we don't need to check if page is non-NULL, because we simply grab it from the list which was just tested for being non-empty. Fixes: 479f854a207c ("mm, page_alloc: defer debugging checks of pages allocated from the PCP") Link: http://lkml.kernel.org/r/20160530090154.GM2527@techsingularity.net Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Mel Gorman <mgorman@techsingularity.net> Reported-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.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.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index d27e8b968ac3..2e860f431d6b 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2615,11 +2615,12 @@ struct page *buffered_rmqueue(struct zone *preferred_zone,
2615 page = list_last_entry(list, struct page, lru); 2615 page = list_last_entry(list, struct page, lru);
2616 else 2616 else
2617 page = list_first_entry(list, struct page, lru); 2617 page = list_first_entry(list, struct page, lru);
2618 } while (page && check_new_pcp(page));
2619 2618
2620 __dec_zone_state(zone, NR_ALLOC_BATCH); 2619 __dec_zone_state(zone, NR_ALLOC_BATCH);
2621 list_del(&page->lru); 2620 list_del(&page->lru);
2622 pcp->count--; 2621 pcp->count--;
2622
2623 } while (check_new_pcp(page));
2623 } else { 2624 } else {
2624 /* 2625 /*
2625 * We most definitely don't want callers attempting to 2626 * We most definitely don't want callers attempting to