Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1408910 > unrolled thread

[PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()

Started byMel Gorman <mgorman@techsingularity.net>
First post2016-05-30 11:10 +0200
Last post2016-05-30 13:00 +0200
Articles 3 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue() Mel Gorman <mgorman@techsingularity.net> - 2016-05-30 11:10 +0200
    Re: [PATCH] mm, page_alloc: prevent infinite loop in  buffered_rmqueue() Vlastimil Babka <vbabka@suse.cz> - 2016-05-30 11:50 +0200
      Re: [PATCH] mm, page_alloc: prevent infinite loop in  buffered_rmqueue() Mel Gorman <mgorman@techsingularity.net> - 2016-05-30 13:00 +0200

#1408910 — [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()

FromMel Gorman <mgorman@techsingularity.net>
Date2016-05-30 11:10 +0200
Subject[PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()
Message-ID<rErmW-2bT-29@gated-at.bofh.it>
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

[toc] | [next] | [standalone]


#1408950 — Re: [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()

FromVlastimil Babka <vbabka@suse.cz>
Date2016-05-30 11:50 +0200
SubjectRe: [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()
Message-ID<rErZE-2oF-21@gated-at.bofh.it>
In reply to#1408910
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
>

[toc] | [prev] | [next] | [standalone]


#1408984 — Re: [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()

FromMel Gorman <mgorman@techsingularity.net>
Date2016-05-30 13:00 +0200
SubjectRe: [PATCH] mm, page_alloc: prevent infinite loop in buffered_rmqueue()
Message-ID<rEt5o-33J-9@gated-at.bofh.it>
In reply to#1408950
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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web