diff options
Diffstat (limited to 'mm/compaction.c')
-rw-r--r-- | mm/compaction.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/mm/compaction.c b/mm/compaction.c index 694eaabaaebd..470474c03b61 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/backing-dev.h> | 14 | #include <linux/backing-dev.h> |
15 | #include <linux/sysctl.h> | 15 | #include <linux/sysctl.h> |
16 | #include <linux/sysfs.h> | 16 | #include <linux/sysfs.h> |
17 | #include <linux/balloon_compaction.h> | ||
17 | #include "internal.h" | 18 | #include "internal.h" |
18 | 19 | ||
19 | #if defined CONFIG_COMPACTION || defined CONFIG_CMA | 20 | #if defined CONFIG_COMPACTION || defined CONFIG_CMA |
@@ -565,9 +566,24 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc, | |||
565 | goto next_pageblock; | 566 | goto next_pageblock; |
566 | } | 567 | } |
567 | 568 | ||
568 | /* Check may be lockless but that's ok as we recheck later */ | 569 | /* |
569 | if (!PageLRU(page)) | 570 | * Check may be lockless but that's ok as we recheck later. |
571 | * It's possible to migrate LRU pages and balloon pages | ||
572 | * Skip any other type of page | ||
573 | */ | ||
574 | if (!PageLRU(page)) { | ||
575 | if (unlikely(balloon_page_movable(page))) { | ||
576 | if (locked && balloon_page_isolate(page)) { | ||
577 | /* Successfully isolated */ | ||
578 | cc->finished_update_migrate = true; | ||
579 | list_add(&page->lru, migratelist); | ||
580 | cc->nr_migratepages++; | ||
581 | nr_isolated++; | ||
582 | goto check_compact_cluster; | ||
583 | } | ||
584 | } | ||
570 | continue; | 585 | continue; |
586 | } | ||
571 | 587 | ||
572 | /* | 588 | /* |
573 | * PageLRU is set. lru_lock normally excludes isolation | 589 | * PageLRU is set. lru_lock normally excludes isolation |
@@ -621,6 +637,7 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc, | |||
621 | cc->nr_migratepages++; | 637 | cc->nr_migratepages++; |
622 | nr_isolated++; | 638 | nr_isolated++; |
623 | 639 | ||
640 | check_compact_cluster: | ||
624 | /* Avoid isolating too much */ | 641 | /* Avoid isolating too much */ |
625 | if (cc->nr_migratepages == COMPACT_CLUSTER_MAX) { | 642 | if (cc->nr_migratepages == COMPACT_CLUSTER_MAX) { |
626 | ++low_pfn; | 643 | ++low_pfn; |