diff options
author | Konstantin Khlebnikov <khlebnikov@openvz.org> | 2012-05-29 18:06:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 19:22:25 -0400 |
commit | f3fd4a61928a5edf5b033a417e761b488b43e203 (patch) | |
tree | f56c5b6f4a4c732c9167e4cacb3e9c25ced0d000 /mm | |
parent | 014483bcccc5edbf861d89dc1a6f7cdc02f9f4c0 (diff) |
mm: remove lru type checks from __isolate_lru_page()
After patch "mm: forbid lumpy-reclaim in shrink_active_list()" we can
completely remove anon/file and active/inactive lru type filters from
__isolate_lru_page(), because isolation for 0-order reclaim always
isolates pages from right lru list. And pages-isolation for lumpy
shrink_inactive_list() or memory-compaction anyway allowed to isolate
pages from all evictable lru lists.
Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Hugh Dickins <hughd@google.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Cc: Glauber Costa <glommer@parallels.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Minchan Kim <minchan@kernel.org>
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/compaction.c | 4 | ||||
-rw-r--r-- | mm/vmscan.c | 23 |
2 files changed, 6 insertions, 21 deletions
diff --git a/mm/compaction.c b/mm/compaction.c index 840ee288e296..74e1b3803839 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
@@ -226,7 +226,7 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc, | |||
226 | unsigned long last_pageblock_nr = 0, pageblock_nr; | 226 | unsigned long last_pageblock_nr = 0, pageblock_nr; |
227 | unsigned long nr_scanned = 0, nr_isolated = 0; | 227 | unsigned long nr_scanned = 0, nr_isolated = 0; |
228 | struct list_head *migratelist = &cc->migratepages; | 228 | struct list_head *migratelist = &cc->migratepages; |
229 | isolate_mode_t mode = ISOLATE_ACTIVE|ISOLATE_INACTIVE; | 229 | isolate_mode_t mode = 0; |
230 | 230 | ||
231 | /* | 231 | /* |
232 | * Ensure that there are not too many pages isolated from the LRU | 232 | * Ensure that there are not too many pages isolated from the LRU |
@@ -329,7 +329,7 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc, | |||
329 | mode |= ISOLATE_ASYNC_MIGRATE; | 329 | mode |= ISOLATE_ASYNC_MIGRATE; |
330 | 330 | ||
331 | /* Try isolate the page */ | 331 | /* Try isolate the page */ |
332 | if (__isolate_lru_page(page, mode, 0) != 0) | 332 | if (__isolate_lru_page(page, mode) != 0) |
333 | continue; | 333 | continue; |
334 | 334 | ||
335 | VM_BUG_ON(PageTransCompound(page)); | 335 | VM_BUG_ON(PageTransCompound(page)); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 987be819fad6..27ef5769b9e4 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -949,29 +949,14 @@ keep: | |||
949 | * | 949 | * |
950 | * returns 0 on success, -ve errno on failure. | 950 | * returns 0 on success, -ve errno on failure. |
951 | */ | 951 | */ |
952 | int __isolate_lru_page(struct page *page, isolate_mode_t mode, int file) | 952 | int __isolate_lru_page(struct page *page, isolate_mode_t mode) |
953 | { | 953 | { |
954 | bool all_lru_mode; | ||
955 | int ret = -EINVAL; | 954 | int ret = -EINVAL; |
956 | 955 | ||
957 | /* Only take pages on the LRU. */ | 956 | /* Only take pages on the LRU. */ |
958 | if (!PageLRU(page)) | 957 | if (!PageLRU(page)) |
959 | return ret; | 958 | return ret; |
960 | 959 | ||
961 | all_lru_mode = (mode & (ISOLATE_ACTIVE|ISOLATE_INACTIVE)) == | ||
962 | (ISOLATE_ACTIVE|ISOLATE_INACTIVE); | ||
963 | |||
964 | /* | ||
965 | * When checking the active state, we need to be sure we are | ||
966 | * dealing with comparible boolean values. Take the logical not | ||
967 | * of each. | ||
968 | */ | ||
969 | if (!all_lru_mode && !PageActive(page) != !(mode & ISOLATE_ACTIVE)) | ||
970 | return ret; | ||
971 | |||
972 | if (!all_lru_mode && !!page_is_file_cache(page) != file) | ||
973 | return ret; | ||
974 | |||
975 | /* Do not give back unevictable pages for compaction */ | 960 | /* Do not give back unevictable pages for compaction */ |
976 | if (PageUnevictable(page)) | 961 | if (PageUnevictable(page)) |
977 | return ret; | 962 | return ret; |
@@ -1070,7 +1055,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, | |||
1070 | 1055 | ||
1071 | VM_BUG_ON(!PageLRU(page)); | 1056 | VM_BUG_ON(!PageLRU(page)); |
1072 | 1057 | ||
1073 | switch (__isolate_lru_page(page, mode, file)) { | 1058 | switch (__isolate_lru_page(page, mode)) { |
1074 | case 0: | 1059 | case 0: |
1075 | mem_cgroup_lru_del(page); | 1060 | mem_cgroup_lru_del(page); |
1076 | list_move(&page->lru, dst); | 1061 | list_move(&page->lru, dst); |
@@ -1282,7 +1267,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct mem_cgroup_zone *mz, | |||
1282 | unsigned long nr_file; | 1267 | unsigned long nr_file; |
1283 | unsigned long nr_dirty = 0; | 1268 | unsigned long nr_dirty = 0; |
1284 | unsigned long nr_writeback = 0; | 1269 | unsigned long nr_writeback = 0; |
1285 | isolate_mode_t isolate_mode = ISOLATE_INACTIVE; | 1270 | isolate_mode_t isolate_mode = 0; |
1286 | int file = is_file_lru(lru); | 1271 | int file = is_file_lru(lru); |
1287 | struct zone *zone = mz->zone; | 1272 | struct zone *zone = mz->zone; |
1288 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(mz); | 1273 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(mz); |
@@ -1452,7 +1437,7 @@ static void shrink_active_list(unsigned long nr_to_scan, | |||
1452 | struct page *page; | 1437 | struct page *page; |
1453 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(mz); | 1438 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(mz); |
1454 | unsigned long nr_rotated = 0; | 1439 | unsigned long nr_rotated = 0; |
1455 | isolate_mode_t isolate_mode = ISOLATE_ACTIVE; | 1440 | isolate_mode_t isolate_mode = 0; |
1456 | int file = is_file_lru(lru); | 1441 | int file = is_file_lru(lru); |
1457 | struct zone *zone = mz->zone; | 1442 | struct zone *zone = mz->zone; |
1458 | 1443 | ||