mm/compaction: do not call suitable_migration_target() on every page
suitable_migration_target() checks that pageblock is suitable for migration target. In isolate_freepages_block(), it is called on every page and this is inefficient. So make it called once per pageblock. suitable_migration_target() also checks if page is highorder or not, but it's criteria for highorder is pageblock order. So calling it once within pageblock range has no problem. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Mel Gorman <mgorman@suse.de> Cc: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
7d348b9ea6
Коммит
01ead5340b
|
@ -244,6 +244,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|||
struct page *cursor, *valid_page = NULL;
|
||||
unsigned long flags;
|
||||
bool locked = false;
|
||||
bool checked_pageblock = false;
|
||||
|
||||
cursor = pfn_to_page(blockpfn);
|
||||
|
||||
|
@ -275,8 +276,16 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
|
|||
break;
|
||||
|
||||
/* Recheck this is a suitable migration target under lock */
|
||||
if (!strict && !suitable_migration_target(page))
|
||||
break;
|
||||
if (!strict && !checked_pageblock) {
|
||||
/*
|
||||
* We need to check suitability of pageblock only once
|
||||
* and this isolate_freepages_block() is called with
|
||||
* pageblock range, so just check once is sufficient.
|
||||
*/
|
||||
checked_pageblock = true;
|
||||
if (!suitable_migration_target(page))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Recheck this is a buddy page under lock */
|
||||
if (!PageBuddy(page))
|
||||
|
|
Загрузка…
Ссылка в новой задаче