Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

KOSAKI Motohiro and committed by
Linus Torvalds
08fc468f 47185052

+11 -6
+11 -6
mm/vmscan.c
··· 1051 1051 1052 1052 /* Check that we have not crossed a zone boundary. */ 1053 1053 if (unlikely(page_zone_id(cursor_page) != zone_id)) 1054 - continue; 1054 + break; 1055 1055 1056 1056 /* 1057 1057 * If we don't have enough swap space, reclaiming of ··· 1059 1059 * pointless. 1060 1060 */ 1061 1061 if (nr_swap_pages <= 0 && PageAnon(cursor_page) && 1062 - !PageSwapCache(cursor_page)) 1063 - continue; 1062 + !PageSwapCache(cursor_page)) 1063 + break; 1064 1064 1065 1065 if (__isolate_lru_page(cursor_page, mode, file) == 0) { 1066 1066 list_move(&cursor_page->lru, dst); ··· 1071 1071 nr_lumpy_dirty++; 1072 1072 scan++; 1073 1073 } else { 1074 - if (mode == ISOLATE_BOTH && 1075 - page_count(cursor_page)) 1076 - nr_lumpy_failed++; 1074 + /* the page is freed already. */ 1075 + if (!page_count(cursor_page)) 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 1086 *scanned = scan;