diff options
author | Konstantin Khlebnikov <khlebnikov@openvz.org> | 2012-05-29 18:07:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 19:22:26 -0400 |
commit | 1a93be0e7a6fc7f3d19101402665c7a958beb568 (patch) | |
tree | af2988851801b6e5d04d3e3f6d5c2932d75ff08a /mm/vmscan.c | |
parent | c56d5c7dfeb5cc754e17fa3d423086a3c551c219 (diff) |
mm/vmscan: push lruvec pointer into shrink_list()
Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 79e2ead21c57..6dbf2c2082e7 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1205,7 +1205,7 @@ putback_inactive_pages(struct lruvec *lruvec, | |||
1205 | * of reclaimed pages | 1205 | * of reclaimed pages |
1206 | */ | 1206 | */ |
1207 | static noinline_for_stack unsigned long | 1207 | static noinline_for_stack unsigned long |
1208 | shrink_inactive_list(unsigned long nr_to_scan, struct mem_cgroup_zone *mz, | 1208 | shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, |
1209 | struct scan_control *sc, enum lru_list lru) | 1209 | struct scan_control *sc, enum lru_list lru) |
1210 | { | 1210 | { |
1211 | LIST_HEAD(page_list); | 1211 | LIST_HEAD(page_list); |
@@ -1216,9 +1216,8 @@ shrink_inactive_list(unsigned long nr_to_scan, struct mem_cgroup_zone *mz, | |||
1216 | unsigned long nr_writeback = 0; | 1216 | unsigned long nr_writeback = 0; |
1217 | isolate_mode_t isolate_mode = 0; | 1217 | isolate_mode_t isolate_mode = 0; |
1218 | int file = is_file_lru(lru); | 1218 | int file = is_file_lru(lru); |
1219 | struct zone *zone = mz->zone; | 1219 | struct zone *zone = lruvec_zone(lruvec); |
1220 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(mz); | 1220 | struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat; |
1221 | struct lruvec *lruvec = mem_cgroup_zone_lruvec(zone, mz->mem_cgroup); | ||
1222 | 1221 | ||
1223 | while (unlikely(too_many_isolated(zone, file, sc))) { | 1222 | while (unlikely(too_many_isolated(zone, file, sc))) { |
1224 | congestion_wait(BLK_RW_ASYNC, HZ/10); | 1223 | congestion_wait(BLK_RW_ASYNC, HZ/10); |
@@ -1373,7 +1372,7 @@ static void move_active_pages_to_lru(struct zone *zone, | |||
1373 | } | 1372 | } |
1374 | 1373 | ||
1375 | static void shrink_active_list(unsigned long nr_to_scan, | 1374 | static void shrink_active_list(unsigned long nr_to_scan, |
1376 | struct mem_cgroup_zone *mz, | 1375 | struct lruvec *lruvec, |
1377 | struct scan_control *sc, | 1376 | struct scan_control *sc, |
1378 | enum lru_list lru) | 1377 | enum lru_list lru) |
1379 | { | 1378 | { |
@@ -1384,12 +1383,11 @@ static void shrink_active_list(unsigned long nr_to_scan, | |||
1384 | LIST_HEAD(l_active); | 1383 | LIST_HEAD(l_active); |
1385 | LIST_HEAD(l_inactive); | 1384 | LIST_HEAD(l_inactive); |
1386 | struct page *page; | 1385 | struct page *page; |
1387 | struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(mz); | 1386 | struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat; |
1388 | unsigned long nr_rotated = 0; | 1387 | unsigned long nr_rotated = 0; |
1389 | isolate_mode_t isolate_mode = 0; | 1388 | isolate_mode_t isolate_mode = 0; |
1390 | int file = is_file_lru(lru); | 1389 | int file = is_file_lru(lru); |
1391 | struct zone *zone = mz->zone; | 1390 | struct zone *zone = lruvec_zone(lruvec); |
1392 | struct lruvec *lruvec = mem_cgroup_zone_lruvec(zone, mz->mem_cgroup); | ||
1393 | 1391 | ||
1394 | lru_add_drain(); | 1392 | lru_add_drain(); |
1395 | 1393 | ||
@@ -1555,21 +1553,17 @@ static int inactive_list_is_low(struct lruvec *lruvec, int file) | |||
1555 | } | 1553 | } |
1556 | 1554 | ||
1557 | static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan, | 1555 | static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan, |
1558 | struct mem_cgroup_zone *mz, | 1556 | struct lruvec *lruvec, struct scan_control *sc) |
1559 | struct scan_control *sc) | ||
1560 | { | 1557 | { |
1561 | int file = is_file_lru(lru); | 1558 | int file = is_file_lru(lru); |
1562 | 1559 | ||
1563 | if (is_active_lru(lru)) { | 1560 | if (is_active_lru(lru)) { |
1564 | struct lruvec *lruvec = mem_cgroup_zone_lruvec(mz->zone, | ||
1565 | mz->mem_cgroup); | ||
1566 | |||
1567 | if (inactive_list_is_low(lruvec, file)) | 1561 | if (inactive_list_is_low(lruvec, file)) |
1568 | shrink_active_list(nr_to_scan, mz, sc, lru); | 1562 | shrink_active_list(nr_to_scan, lruvec, sc, lru); |
1569 | return 0; | 1563 | return 0; |
1570 | } | 1564 | } |
1571 | 1565 | ||
1572 | return shrink_inactive_list(nr_to_scan, mz, sc, lru); | 1566 | return shrink_inactive_list(nr_to_scan, lruvec, sc, lru); |
1573 | } | 1567 | } |
1574 | 1568 | ||
1575 | static int vmscan_swappiness(struct scan_control *sc) | 1569 | static int vmscan_swappiness(struct scan_control *sc) |
@@ -1812,7 +1806,7 @@ restart: | |||
1812 | nr[lru] -= nr_to_scan; | 1806 | nr[lru] -= nr_to_scan; |
1813 | 1807 | ||
1814 | nr_reclaimed += shrink_list(lru, nr_to_scan, | 1808 | nr_reclaimed += shrink_list(lru, nr_to_scan, |
1815 | mz, sc); | 1809 | lruvec, sc); |
1816 | } | 1810 | } |
1817 | } | 1811 | } |
1818 | /* | 1812 | /* |
@@ -1835,7 +1829,7 @@ restart: | |||
1835 | * rebalance the anon lru active/inactive ratio. | 1829 | * rebalance the anon lru active/inactive ratio. |
1836 | */ | 1830 | */ |
1837 | if (inactive_anon_is_low(lruvec)) | 1831 | if (inactive_anon_is_low(lruvec)) |
1838 | shrink_active_list(SWAP_CLUSTER_MAX, mz, | 1832 | shrink_active_list(SWAP_CLUSTER_MAX, lruvec, |
1839 | sc, LRU_ACTIVE_ANON); | 1833 | sc, LRU_ACTIVE_ANON); |
1840 | 1834 | ||
1841 | /* reclaim/compaction might need reclaim to continue */ | 1835 | /* reclaim/compaction might need reclaim to continue */ |
@@ -2268,13 +2262,9 @@ static void age_active_anon(struct zone *zone, struct scan_control *sc) | |||
2268 | memcg = mem_cgroup_iter(NULL, NULL, NULL); | 2262 | memcg = mem_cgroup_iter(NULL, NULL, NULL); |
2269 | do { | 2263 | do { |
2270 | struct lruvec *lruvec = mem_cgroup_zone_lruvec(zone, memcg); | 2264 | struct lruvec *lruvec = mem_cgroup_zone_lruvec(zone, memcg); |
2271 | struct mem_cgroup_zone mz = { | ||
2272 | .mem_cgroup = memcg, | ||
2273 | .zone = zone, | ||
2274 | }; | ||
2275 | 2265 | ||
2276 | if (inactive_anon_is_low(lruvec)) | 2266 | if (inactive_anon_is_low(lruvec)) |
2277 | shrink_active_list(SWAP_CLUSTER_MAX, &mz, | 2267 | shrink_active_list(SWAP_CLUSTER_MAX, lruvec, |
2278 | sc, LRU_ACTIVE_ANON); | 2268 | sc, LRU_ACTIVE_ANON); |
2279 | 2269 | ||
2280 | memcg = mem_cgroup_iter(NULL, memcg, NULL); | 2270 | memcg = mem_cgroup_iter(NULL, memcg, NULL); |