diff --git a/mm/compaction.c b/mm/compaction.c index 94b5c0865dd1..e8f5b4e2cb05 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -219,17 +219,21 @@ static void reset_cached_positions(struct zone *zone) } /* - * Hugetlbfs pages should consistenly be skipped until updated by the hugetlb - * subsystem. It is always pointless to compact pages of pageblock_order and - * the free scanner can reconsider when no longer huge. + * Compound pages of >= pageblock_order should consistenly be skipped until + * released. It is always pointless to compact pages of such order (if they are + * migratable), and the pageblocks they occupy cannot contain any free pages. */ -static bool pageblock_skip_persistent(struct page *page, unsigned int order) +static bool pageblock_skip_persistent(struct page *page) { - if (!PageHuge(page)) + if (!PageCompound(page)) return false; - if (order != pageblock_order) - return false; - return true; + + page = compound_head(page); + + if (compound_order(page) >= pageblock_order) + return true; + + return false; } /* @@ -256,7 +260,7 @@ static void __reset_isolation_suitable(struct zone *zone) continue; if (zone != page_zone(page)) continue; - if (pageblock_skip_persistent(page, compound_order(page))) + if (pageblock_skip_persistent(page)) continue; clear_pageblock_skip(page); @@ -323,8 +327,7 @@ static inline bool isolation_suitable(struct compact_control *cc, return true; } -static inline bool pageblock_skip_persistent(struct page *page, - unsigned int order) +static inline bool pageblock_skip_persistent(struct page *page) { return false; }