summaryrefslogtreecommitdiffstats
path: root/mm/compaction.c
diff options
context:
space:
mode:
authorYisheng Xie <xieyisheng1@huawei.com>2017-05-03 17:53:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-05-03 18:52:09 -0400
commit1ef36db2a96f23ac0a278d498072ef7193c8b8f2 (patch)
tree8422079b17f79c192197cbdd16a968e5dfaba6ab /mm/compaction.c
parent60a7a88dbb9fc9adcca78a10a3ecf36966b5a45c (diff)
mm/compaction: ignore block suitable after check large free page
By reviewing code, I find that if the migrate target is a large free page and we ignore suitable, it may splite large target free page into smaller block which is not good for defrag. So move the ignore block suitable after check large free page. As Vlastimil pointed out in RFC version that this patch is just based on logical analyses which might be better for future-proofing the function and it is most likely won't have any visible effect right now, for direct compaction shouldn't have to be called if there's a >=pageblock_order page already available. Link: http://lkml.kernel.org/r/1489490743-5364-1-git-send-email-xieyisheng1@huawei.com Signed-off-by: Yisheng Xie <xieyisheng1@huawei.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Michal Hocko <mhocko@suse.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: David Rientjes <rientjes@google.com> Cc: Minchan Kim <minchan@kernel.org> Cc: Hanjun Guo <guohanjun@huawei.com> Cc: Xishi Qiu <qiuxishi@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/compaction.c')
-rw-r--r--mm/compaction.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/compaction.c b/mm/compaction.c
index 81e1eaa2a2cf..09c5282ebdd2 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -992,9 +992,6 @@ isolate_migratepages_range(struct compact_control *cc, unsigned long start_pfn,
992static bool suitable_migration_target(struct compact_control *cc, 992static bool suitable_migration_target(struct compact_control *cc,
993 struct page *page) 993 struct page *page)
994{ 994{
995 if (cc->ignore_block_suitable)
996 return true;
997
998 /* If the page is a large free page, then disallow migration */ 995 /* If the page is a large free page, then disallow migration */
999 if (PageBuddy(page)) { 996 if (PageBuddy(page)) {
1000 /* 997 /*
@@ -1006,6 +1003,9 @@ static bool suitable_migration_target(struct compact_control *cc,
1006 return false; 1003 return false;
1007 } 1004 }
1008 1005
1006 if (cc->ignore_block_suitable)
1007 return true;
1008
1009 /* If the block is MIGRATE_MOVABLE or MIGRATE_CMA, allow migration */ 1009 /* If the block is MIGRATE_MOVABLE or MIGRATE_CMA, allow migration */
1010 if (migrate_async_suitable(get_pageblock_migratetype(page))) 1010 if (migrate_async_suitable(get_pageblock_migratetype(page)))
1011 return true; 1011 return true;