diff --git a/[refs] b/[refs] index 75ef033eab0e..14933d737aae 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5d6892407cab23d4bf2f6de065ca351a53849323 +refs/heads/master: bc835011afbea3957217ee716093d791fb2fe44f diff --git a/trunk/mm/compaction.c b/trunk/mm/compaction.c index b0fbfdfad298..da25b5a2e476 100644 --- a/trunk/mm/compaction.c +++ b/trunk/mm/compaction.c @@ -295,10 +295,25 @@ static unsigned long isolate_migratepages(struct zone *zone, continue; } + if (!PageLRU(page)) + continue; + + /* + * PageLRU is set, and lru_lock excludes isolation, + * splitting and collapsing (collapsing has already + * happened if PageLRU is set). + */ + if (PageTransHuge(page)) { + low_pfn += (1 << compound_order(page)) - 1; + continue; + } + /* Try isolate the page */ if (__isolate_lru_page(page, ISOLATE_BOTH, 0) != 0) continue; + VM_BUG_ON(PageTransCompound(page)); + /* Successfully isolated */ del_page_from_lru_list(zone, page, page_lru(page)); list_add(&page->lru, migratelist);