mm, page_alloc: prevent infinite loop in buffered_rmqueue()
Subsystems (2)
PATCH 1/1 mm, page_alloc: prevent infinite loop in buffered_rmqueue()
From: Vlastimil Babka <[email protected]>
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.
--- mm/page_alloc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
mm/page_alloc.c +5 -4
@@ -2609,11 +2609,12 @@ struct page *buffered_rmqueue(struct zone *preferred_zone, page = list_last_entry(list, struct page, lru); else page = list_first_entry(list, struct page, lru); - }while (page &&check_new_pcp (page)); -__dec_zone_state (zone,NR_ALLOC_BATCH ); -list_del (&page->lru); - pcp->count--; +__dec_zone_state (zone,NR_ALLOC_BATCH ); +list_del (&page->lru); + pcp->count--; + + }while (check_new_pcp (page)); }else {/* * We most definitely don't want callers attempting to
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 9 lines · Mel Gorman
From: Vlastimil Babka <[email protected]>
In
DEBUG_VMkernel, we can hit infinite loop for order == 0 inbuffered_rmqueue()whencheck_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.
That was a wrong one, which I corrected later. Also it's no longer mmotm. Correction below:
Quoted 3 lines
Reported-by Naoya Horiguchi <[email protected]>Signed-off-by Vlastimil Babka <[email protected]>Signed-off-by Mel Gorman <[email protected]>
Thanks Mel, I've missed that the patch didn't go in.
Quoted 16 lines
--- mm/page_alloc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)mm/page_alloc.c +0
-2@@ -2609,11 +2609,12 @@ struct page *buffered_rmqueue(struct zone *preferred_zone, page = list_last_entry(list, struct page, lru); else page = list_first_entry(list, struct page, lru); - }while (page &&check_new_pcp (page)); -__dec_zone_state (zone,NR_ALLOC_BATCH );
mm/page_alloc.c struct page *buffered_rmqueue(struct zone *preferred_zone, · line 2620
Quoted 10 lines
mm/page_alloc.c +5
-2-list_del (&page->lru); - pcp->count--; +__dec_zone_state (zone,NR_ALLOC_BATCH ); +list_del (&page->lru); + pcp->count--; + + }while (check_new_pcp (page)); }else {/* * We most definitely don't want callers attempting to
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 9 lines · Vlastimil Babka
Quoted 8 lines · Mel Gorman
From: Vlastimil Babka <[email protected]>
In
DEBUG_VMkernel, we can hit infinite loop for order == 0 inbuffered_rmqueue()whencheck_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.
Quoted 8 lines
Quoted 1 line
That was a wrong one, which I corrected later. Also it's no longer mmotm. Correction below:
Fixes 479f854a207c ("mm, page_alloc: defer debugging checks of pagesallocated from the PCP")
Yes sorry, I meant to clean it up but had just re-read the patch itself, confirmed it was missing and was still required.
Signature · 8 lines
Mel Gorman SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>