From 1ece0a7bcce8655f59e6dc9bd3d8cad492aa9207 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Mon, 31 Oct 2011 17:06:51 -0700 Subject: [PATCH] --- yaml --- r: 272109 b: refs/heads/master c: 39deaf8585152f1a35c1676d3d7dc6ae0fb65967 h: refs/heads/master i: 272107: aeec4a5efe9fbc7363b6ad72a37a85c3fa37bbe2 v: v3 --- [refs] | 2 +- trunk/include/linux/mmzone.h | 2 ++ trunk/mm/compaction.c | 7 +++++-- trunk/mm/vmscan.c | 3 +++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 113ba63186c0..05bf69d2b2e7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4356f21d09283dc6d39a6f7287a65ddab61e2808 +refs/heads/master: 39deaf8585152f1a35c1676d3d7dc6ae0fb65967 diff --git a/trunk/include/linux/mmzone.h b/trunk/include/linux/mmzone.h index 436ce6e7a446..80da968798ea 100644 --- a/trunk/include/linux/mmzone.h +++ b/trunk/include/linux/mmzone.h @@ -168,6 +168,8 @@ static inline int is_unevictable_lru(enum lru_list l) #define ISOLATE_INACTIVE ((__force isolate_mode_t)0x1) /* Isolate active pages */ #define ISOLATE_ACTIVE ((__force isolate_mode_t)0x2) +/* Isolate clean file */ +#define ISOLATE_CLEAN ((__force isolate_mode_t)0x4) /* LRU Isolation modes. */ typedef unsigned __bitwise__ isolate_mode_t; diff --git a/trunk/mm/compaction.c b/trunk/mm/compaction.c index 47f717fa4233..a0e420207ebf 100644 --- a/trunk/mm/compaction.c +++ b/trunk/mm/compaction.c @@ -261,6 +261,7 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, unsigned long last_pageblock_nr = 0, pageblock_nr; unsigned long nr_scanned = 0, nr_isolated = 0; struct list_head *migratelist = &cc->migratepages; + isolate_mode_t mode = ISOLATE_ACTIVE|ISOLATE_INACTIVE; /* Do not scan outside zone boundaries */ low_pfn = max(cc->migrate_pfn, zone->zone_start_pfn); @@ -348,9 +349,11 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, continue; } + if (!cc->sync) + mode |= ISOLATE_CLEAN; + /* Try isolate the page */ - if (__isolate_lru_page(page, - ISOLATE_ACTIVE|ISOLATE_INACTIVE, 0) != 0) + if (__isolate_lru_page(page, mode, 0) != 0) continue; VM_BUG_ON(PageTransCompound(page)); diff --git a/trunk/mm/vmscan.c b/trunk/mm/vmscan.c index ec6dbcb976d1..c007e78d7078 100644 --- a/trunk/mm/vmscan.c +++ b/trunk/mm/vmscan.c @@ -1045,6 +1045,9 @@ int __isolate_lru_page(struct page *page, isolate_mode_t mode, int file) ret = -EBUSY; + if ((mode & ISOLATE_CLEAN) && (PageDirty(page) || PageWriteback(page))) + return ret; + if (likely(get_page_unless_zero(page))) { /* * Be careful not to clear PageLRU until after we're