aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>2010-10-26 17:21:44 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-26 19:52:07 -0400
commit08fc468f4eaf6683bae5bdb94743a09d8630cb80 (patch)
treea2225421eb8e01a8e9df588f5064be81059af91a /mm
parent47185052165a4c5de0a461018238375dd982c2ec (diff)
vmscan: isolate_lru_pages(): stop neighbour search if neighbour cannot be isolated
isolate_lru_pages() does not just isolate LRU tail pages, but also isolates neighbour pages of the eviction page. The neighbour search does not stop even if neighbours cannot be isolated which is excessive as the lumpy reclaim will no longer result in a successful higher order allocation. This patch stops the PFN neighbour pages if an isolation fails and moves on to the next block. Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Mel Gorman <mel@csn.ul.ie> Reviewed-by: Wu Fengguang <fengguang.wu@intel.com> Reviewed-by: Minchan Kim <minchan.kim@gmail.com> Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Johannes Weiner <hannes@cmpxchg.org> 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>
Diffstat (limited to 'mm')
-rw-r--r--mm/vmscan.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index cec8081bbd95..130ad0239f52 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1051,7 +1051,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
1051 1051
1052 /* Check that we have not crossed a zone boundary. */ 1052 /* Check that we have not crossed a zone boundary. */
1053 if (unlikely(page_zone_id(cursor_page) != zone_id)) 1053 if (unlikely(page_zone_id(cursor_page) != zone_id))
1054 continue; 1054 break;
1055 1055
1056 /* 1056 /*
1057 * If we don't have enough swap space, reclaiming of 1057 * If we don't have enough swap space, reclaiming of
@@ -1059,8 +1059,8 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
1059 * pointless. 1059 * pointless.
1060 */ 1060 */
1061 if (nr_swap_pages <= 0 && PageAnon(cursor_page) && 1061 if (nr_swap_pages <= 0 && PageAnon(cursor_page) &&
1062 !PageSwapCache(cursor_page)) 1062 !PageSwapCache(cursor_page))
1063 continue; 1063 break;
1064 1064
1065 if (__isolate_lru_page(cursor_page, mode, file) == 0) { 1065 if (__isolate_lru_page(cursor_page, mode, file) == 0) {
1066 list_move(&cursor_page->lru, dst); 1066 list_move(&cursor_page->lru, dst);
@@ -1071,11 +1071,16 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
1071 nr_lumpy_dirty++; 1071 nr_lumpy_dirty++;
1072 scan++; 1072 scan++;
1073 } else { 1073 } else {
1074 if (mode == ISOLATE_BOTH && 1074 /* the page is freed already. */
1075 page_count(cursor_page)) 1075 if (!page_count(cursor_page))
1076 nr_lumpy_failed++; 1076 continue;
1077 break;
1077 } 1078 }
1078 } 1079 }
1080
1081 /* If we break out of the loop above, lumpy reclaim failed */
1082 if (pfn < end_pfn)
1083 nr_lumpy_failed++;
1079 } 1084 }
1080 1085
1081 *scanned = scan; 1086 *scanned = scan;