linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()
@ 2016-05-30  9:01 Mel Gorman
  2016-05-30  9:46 ` Vlastimil Babka
  0 siblings, 1 reply; 3+ messages in thread
From: Mel Gorman @ 2016-05-30  9:01 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Vlastimil Babka, Naoya Horiguchi, Linux-MM, LKML

From: Vlastimil Babka <vbabka@suse.cz>

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: http://www.ozlabs.org/~akpm/mmotm/broken-out/mm-page_alloc-defer-debugging-checks-of-freed-pages-until-a-pcp-drain.patch
Reported-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
---
 mm/page_alloc.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index f8f3bfc435ee..bb320cde4d6d 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -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 majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()
  2016-05-30  9:01 [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue() Mel Gorman
@ 2016-05-30  9:46 ` Vlastimil Babka
  2016-05-30 10:57   ` Mel Gorman
  0 siblings, 1 reply; 3+ messages in thread
From: Vlastimil Babka @ 2016-05-30  9:46 UTC (permalink / raw)
  To: Mel Gorman, Andrew Morton; +Cc: Naoya Horiguchi, Linux-MM, LKML

On 05/30/2016 11:01 AM, Mel Gorman wrote:
> From: Vlastimil Babka <vbabka@suse.cz>
>
> 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: http://www.ozlabs.org/~akpm/mmotm/broken-out/mm-page_alloc-defer-debugging-checks-of-freed-pages-until-a-pcp-drain.patch

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 pages 
allocated from the PCP")

> Reported-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
> Signed-off-by: Mel Gorman <mgorman@techsingularity.net>

Thanks Mel, I've missed that the patch didn't go in.

> ---
>  mm/page_alloc.c | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index f8f3bfc435ee..bb320cde4d6d 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -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 majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()
  2016-05-30  9:46 ` Vlastimil Babka
@ 2016-05-30 10:57   ` Mel Gorman
  0 siblings, 0 replies; 3+ messages in thread
From: Mel Gorman @ 2016-05-30 10:57 UTC (permalink / raw)
  To: Vlastimil Babka; +Cc: Andrew Morton, Naoya Horiguchi, Linux-MM, LKML

On Mon, May 30, 2016 at 11:46:05AM +0200, Vlastimil Babka wrote:
> On 05/30/2016 11:01 AM, Mel Gorman wrote:
> >From: Vlastimil Babka <vbabka@suse.cz>
> >
> >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: http://www.ozlabs.org/~akpm/mmotm/broken-out/mm-page_alloc-defer-debugging-checks-of-freed-pages-until-a-pcp-drain.patch
> 
> 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 pages
> allocated 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.

-- 
Mel Gorman
SUSE Labs

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-05-30 10:57 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-30  9:01 [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue() Mel Gorman
2016-05-30  9:46 ` Vlastimil Babka
2016-05-30 10:57   ` Mel Gorman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).