diff mbox series

[3/6] mm: compaction: skip more fully scanned pageblock

Message ID f4efd2fa08735794a6d809da3249b6715ba6ad38.1685018752.git.baolin.wang@linux.alibaba.com (mailing list archive)
State New
Headers show
Series Misc cleanups and improvements for compaction | expand

Commit Message

Baolin Wang May 25, 2023, 12:53 p.m. UTC
In fast_isolate_around(), it assumes the pageblock is fully scanned if
cc->nr_freepages < cc->nr_migratepages after trying to isolate some free
pages, and will set skip flag to avoid scanning in future. However this
can miss setting the skip flag for a fully scanned pageblock (returned
'start_pfn' is equal to 'end_pfn') in the case where cc->nr_freepages
is larger than cc->nr_migratepages.

So using the returned 'start_pfn' from isolate_freepages_block() and
'end_pfn' to decide if a pageblock is fully scanned makes more sense.
It can also cover the case where cc->nr_freepages < cc->nr_migratepages,
which means the 'start_pfn' is usually equal to 'end_pfn' except some
uncommon fatal error occurs after non-strict mode isolation.

Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
---
 mm/compaction.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Vlastimil Babka May 30, 2023, 7:59 a.m. UTC | #1
On 5/25/23 14:53, Baolin Wang wrote:
> In fast_isolate_around(), it assumes the pageblock is fully scanned if
> cc->nr_freepages < cc->nr_migratepages after trying to isolate some free
> pages, and will set skip flag to avoid scanning in future. However this
> can miss setting the skip flag for a fully scanned pageblock (returned
> 'start_pfn' is equal to 'end_pfn') in the case where cc->nr_freepages
> is larger than cc->nr_migratepages.
> 
> So using the returned 'start_pfn' from isolate_freepages_block() and
> 'end_pfn' to decide if a pageblock is fully scanned makes more sense.
> It can also cover the case where cc->nr_freepages < cc->nr_migratepages,
> which means the 'start_pfn' is usually equal to 'end_pfn' except some
> uncommon fatal error occurs after non-strict mode isolation.
> 
> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>

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

> ---
>  mm/compaction.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/mm/compaction.c b/mm/compaction.c
> index 3737c6591bfb..1e5183f39ca9 100644
> --- a/mm/compaction.c
> +++ b/mm/compaction.c
> @@ -1411,7 +1411,7 @@ fast_isolate_around(struct compact_control *cc, unsigned long pfn)
>  	isolate_freepages_block(cc, &start_pfn, end_pfn, &cc->freepages, 1, false);
>  
>  	/* Skip this pageblock in the future as it's full or nearly full */
> -	if (cc->nr_freepages < cc->nr_migratepages)
> +	if (start_pfn == end_pfn)
>  		set_pageblock_skip(page);
>  
>  	return;
diff mbox series

Patch

diff --git a/mm/compaction.c b/mm/compaction.c
index 3737c6591bfb..1e5183f39ca9 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1411,7 +1411,7 @@  fast_isolate_around(struct compact_control *cc, unsigned long pfn)
 	isolate_freepages_block(cc, &start_pfn, end_pfn, &cc->freepages, 1, false);
 
 	/* Skip this pageblock in the future as it's full or nearly full */
-	if (cc->nr_freepages < cc->nr_migratepages)
+	if (start_pfn == end_pfn)
 		set_pageblock_skip(page);
 
 	return;