All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: Wonhyuk Yang <vvghjk1234@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Mel Gorman <mgorman@techsingularity.net>, linux-mm@kvack.org
Subject: Re: [PATCH] mm/compactoin: Fix edge case of fast_find_migrateblock()
Date: Mon, 25 Jan 2021 17:49:53 +0100	[thread overview]
Message-ID: <0ed60e73-9c4f-5a62-754d-b3c864239941@suse.cz> (raw)
In-Reply-To: <20210123154320.24278-1-vvghjk1234@gmail.com>

On 1/23/21 4:43 PM, Wonhyuk Yang wrote:
> In the fast_find_migrateblock(), It iterate freelist to find
> proper pageblock. But there are two edge cases. First, if the page
> we found is equal to cc->migrate_pfn, it is considered that we
> didn't found suitable pageblock. Second, if the loop was terminated
> because order is less than PAGE_ALLOC_COSTLY_ORDER, it could
> be considered that we found suitable one.
> 
> Fixes: 70b44595eafe9 ("mm, compaction: use free lists to quickly locate
> a migration source")
> 
> Signed-off-by: Wonhyuk Yang <vvghjk1234@gmail.com>

Seems correct, although it's quite subtle code and it's been a long time...

Acked-by: Vlastimil Babka <vbabka@suse.cz>

Maybe instead of replacing one magic value of 'pfn' with another
(cc->migrate_pfn with high_pfn) I would just add a "bool found" and use it
appropriately. Would make the function less subtle perhaps.

While reviewing I found more potentially questionable parts, if you're interested:

- if we go through "if (get_pageblock_skip(freepage))... continue;" we are
increasing nr_scanned++; but not checking the limit.

- the "if (list_is_last(freelist, &freepage->lru)) break;" part seems
unneccesary? if we are on the last page and just "continue;" the
list_for_each_entry() iteration should stop anyway.

> ---
>  mm/compaction.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/mm/compaction.c b/mm/compaction.c
> index e5acb9714436..46f49e6b7d1a 100644
> --- a/mm/compaction.c
> +++ b/mm/compaction.c
> @@ -1742,8 +1742,8 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc)
>  		distance >>= 2;
>  	high_pfn = pageblock_start_pfn(cc->migrate_pfn + distance);
>  
> -	for (order = cc->order - 1;
> -	     order >= PAGE_ALLOC_COSTLY_ORDER && pfn == cc->migrate_pfn && nr_scanned < limit;
> +	for (order = cc->order - 1, pfn = high_pfn;
> +	     order >= PAGE_ALLOC_COSTLY_ORDER && pfn == high_pfn && nr_scanned < limit;
>  	     order--) {
>  		struct free_area *area = &cc->zone->free_area[order];
>  		struct list_head *freelist;
> @@ -1785,7 +1785,6 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc)
>  			}
>  
>  			if (nr_scanned >= limit) {
> -				cc->fast_search_fail++;
>  				move_freelist_tail(freelist, freepage);
>  				break;
>  			}
> @@ -1799,9 +1798,10 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc)
>  	 * If fast scanning failed then use a cached entry for a page block
>  	 * that had free pages as the basis for starting a linear scan.
>  	 */
> -	if (pfn == cc->migrate_pfn)
> +	if (pfn == high_pfn) {
> +		cc->fast_search_fail++;
>  		pfn = reinit_migrate_pfn(cc);
> -
> +	}
>  	return pfn;
>  }
>  
> 



  reply	other threads:[~2021-01-25 16:49 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-23 15:43 [PATCH] mm/compactoin: Fix edge case of fast_find_migrateblock() Wonhyuk Yang
2021-01-25 16:49 ` Vlastimil Babka [this message]
2021-01-26 14:37   ` Wonhyuk Yang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0ed60e73-9c4f-5a62-754d-b3c864239941@suse.cz \
    --to=vbabka@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    --cc=vvghjk1234@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.