diff options
author | Konstantin Khlebnikov <khlebnikov@openvz.org> | 2012-05-29 18:07:00 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 19:22:26 -0400 |
commit | c56d5c7dfeb5cc754e17fa3d423086a3c551c219 (patch) | |
tree | 4c89ad9692dbd3a2e0eaf96de0162a5d3066925e /mm | |
parent | 074291fea8bcedeabf295360e2ddd9bbb5830b4a (diff) |
mm/vmscan: push lruvec pointer into inactive_list_is_low()
Switch mem_cgroup_inactive_anon_is_low() to lruvec pointers,
mem_cgroup_get_lruvec_size() is more effective than
mem_cgroup_zone_nr_lru_pages()
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')
-rw-r--r-- | mm/memcontrol.c | 20 | ||||
-rw-r--r-- | mm/vmscan.c | 40 |
2 files changed, 28 insertions, 32 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a68db296ada6..9d1764630dff 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1208,19 +1208,15 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg) | |||
1208 | return ret; | 1208 | return ret; |
1209 | } | 1209 | } |
1210 | 1210 | ||
1211 | int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg, struct zone *zone) | 1211 | int mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec) |
1212 | { | 1212 | { |
1213 | unsigned long inactive_ratio; | 1213 | unsigned long inactive_ratio; |
1214 | int nid = zone_to_nid(zone); | ||
1215 | int zid = zone_idx(zone); | ||
1216 | unsigned long inactive; | 1214 | unsigned long inactive; |
1217 | unsigned long active; | 1215 | unsigned long active; |
1218 | unsigned long gb; | 1216 | unsigned long gb; |
1219 | 1217 | ||
1220 | inactive = mem_cgroup_zone_nr_lru_pages(memcg, nid, zid, | 1218 | inactive = mem_cgroup_get_lruvec_size(lruvec, LRU_INACTIVE_ANON); |
1221 | BIT(LRU_INACTIVE_ANON)); | 1219 | active = mem_cgroup_get_lruvec_size(lruvec, LRU_ACTIVE_ANON); |
1222 | active = mem_cgroup_zone_nr_lru_pages(memcg, nid, zid, | ||
1223 | BIT(LRU_ACTIVE_ANON)); | ||
1224 | 1220 | ||
1225 | gb = (inactive + active) >> (30 - PAGE_SHIFT); | 1221 | gb = (inactive + active) >> (30 - PAGE_SHIFT); |
1226 | if (gb) | 1222 | if (gb) |
@@ -1231,17 +1227,13 @@ int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg, struct zone *zone) | |||
1231 | return inactive * inactive_ratio < active; | 1227 | return inactive * inactive_ratio < active; |
1232 | } | 1228 | } |
1233 | 1229 | ||
1234 | int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg, struct zone *zone) | 1230 | int mem_cgroup_inactive_file_is_low(struct lruvec *lruvec) |
1235 | { | 1231 | { |
1236 | unsigned long active; | 1232 | unsigned long active; |
1237 | unsigned long inactive; | 1233 | unsigned long inactive; |
1238 | int zid = zone_idx(zone); | ||
1239 | int nid = zone_to_nid(zone); | ||
1240 | 1234 | ||
1241 | inactive = mem_cgroup_zone_nr_lru_pages(memcg, nid, zid, | 1235 | inactive = mem_cgroup_get_lruvec_size(lruvec, LRU_INACTIVE_FILE); |
1242 | BIT(LRU_INACTIVE_FILE)); | 1236 | active = mem_cgroup_get_lruvec_size(lruvec, LRU_ACTIVE_FILE); |
1243 | active = mem_cgroup_zone_nr_lru_pages(memcg, nid, zid, | ||
1244 | BIT(LRU_ACTIVE_FILE)); | ||
1245 | 1237 | ||
1246 | return (active > inactive); | 1238 | return (active > inactive); |
1247 | } | 1239 | } |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 5318faa6a251..79e2ead21c57 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1488,13 +1488,12 @@ static int inactive_anon_is_low_global(struct zone *zone) | |||
1488 | 1488 | ||
1489 | /** | 1489 | /** |
1490 | * inactive_anon_is_low - check if anonymous pages need to be deactivated | 1490 | * inactive_anon_is_low - check if anonymous pages need to be deactivated |
1491 | * @zone: zone to check | 1491 | * @lruvec: LRU vector to check |
1492 | * @sc: scan control of this context | ||
1493 | * | 1492 | * |
1494 | * Returns true if the zone does not have enough inactive anon pages, | 1493 | * Returns true if the zone does not have enough inactive anon pages, |
1495 | * meaning some active anon pages need to be deactivated. | 1494 | * meaning some active anon pages need to be deactivated. |
1496 | */ | 1495 | */ |
1497 | static int inactive_anon_is_low(struct mem_cgroup_zone *mz) | 1496 | static int inactive_anon_is_low(struct lruvec *lruvec) |
1498 | { | 1497 | { |
1499 | /* | 1498 | /* |
1500 | * If we don't have swap space, anonymous page deactivation | 1499 | * If we don't have swap space, anonymous page deactivation |
@@ -1504,13 +1503,12 @@ static int inactive_anon_is_low(struct mem_cgroup_zone *mz) | |||
1504 | return 0; | 1503 | return 0; |
1505 | 1504 | ||
1506 | if (!mem_cgroup_disabled()) | 1505 | if (!mem_cgroup_disabled()) |
1507 | return mem_cgroup_inactive_anon_is_low(mz->mem_cgroup, | 1506 | return mem_cgroup_inactive_anon_is_low(lruvec); |
1508 | mz->zone); | ||
1509 | 1507 | ||
1510 | return inactive_anon_is_low_global(mz->zone); | 1508 | return inactive_anon_is_low_global(lruvec_zone(lruvec)); |
1511 | } | 1509 | } |
1512 | #else | 1510 | #else |
1513 | static inline int inactive_anon_is_low(struct mem_cgroup_zone *mz) | 1511 | static inline int inactive_anon_is_low(struct lruvec *lruvec) |
1514 | { | 1512 | { |
1515 | return 0; | 1513 | return 0; |
1516 | } | 1514 | } |
@@ -1528,7 +1526,7 @@ static int inactive_file_is_low_global(struct zone *zone) | |||
1528 | 1526 | ||
1529 | /** | 1527 | /** |
1530 | * inactive_file_is_low - check if file pages need to be deactivated | 1528 | * inactive_file_is_low - check if file pages need to be deactivated |
1531 | * @mz: memory cgroup and zone to check | 1529 | * @lruvec: LRU vector to check |
1532 | * | 1530 | * |
1533 | * When the system is doing streaming IO, memory pressure here | 1531 | * When the system is doing streaming IO, memory pressure here |
1534 | * ensures that active file pages get deactivated, until more | 1532 | * ensures that active file pages get deactivated, until more |
@@ -1540,21 +1538,20 @@ static int inactive_file_is_low_global(struct zone *zone) | |||
1540 | * This uses a different ratio than the anonymous pages, because | 1538 | * This uses a different ratio than the anonymous pages, because |
1541 | * the page cache uses a use-once replacement algorithm. | 1539 | * the page cache uses a use-once replacement algorithm. |
1542 | */ | 1540 | */ |
1543 | static int inactive_file_is_low(struct mem_cgroup_zone *mz) | 1541 | static int inactive_file_is_low(struct lruvec *lruvec) |
1544 | { | 1542 | { |
1545 | if (!mem_cgroup_disabled()) | 1543 | if (!mem_cgroup_disabled()) |
1546 | return mem_cgroup_inactive_file_is_low(mz->mem_cgroup, | 1544 | return mem_cgroup_inactive_file_is_low(lruvec); |
1547 | mz->zone); | ||
1548 | 1545 | ||
1549 | return inactive_file_is_low_global(mz->zone); | 1546 | return inactive_file_is_low_global(lruvec_zone(lruvec)); |
1550 | } | 1547 | } |
1551 | 1548 | ||
1552 | static int inactive_list_is_low(struct mem_cgroup_zone *mz, int file) | 1549 | static int inactive_list_is_low(struct lruvec *lruvec, int file) |
1553 | { | 1550 | { |
1554 | if (file) | 1551 | if (file) |
1555 | return inactive_file_is_low(mz); | 1552 | return inactive_file_is_low(lruvec); |
1556 | else | 1553 | else |
1557 | return inactive_anon_is_low(mz); | 1554 | return inactive_anon_is_low(lruvec); |
1558 | } | 1555 | } |
1559 | 1556 | ||
1560 | static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan, | 1557 | static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan, |
@@ -1564,7 +1561,10 @@ static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan, | |||
1564 | int file = is_file_lru(lru); | 1561 | int file = is_file_lru(lru); |
1565 | 1562 | ||
1566 | if (is_active_lru(lru)) { | 1563 | if (is_active_lru(lru)) { |
1567 | if (inactive_list_is_low(mz, file)) | 1564 | struct lruvec *lruvec = mem_cgroup_zone_lruvec(mz->zone, |
1565 | mz->mem_cgroup); | ||
1566 | |||
1567 | if (inactive_list_is_low(lruvec, file)) | ||
1568 | shrink_active_list(nr_to_scan, mz, sc, lru); | 1568 | shrink_active_list(nr_to_scan, mz, sc, lru); |
1569 | return 0; | 1569 | return 0; |
1570 | } | 1570 | } |
@@ -1793,6 +1793,9 @@ static void shrink_mem_cgroup_zone(struct mem_cgroup_zone *mz, | |||
1793 | unsigned long nr_reclaimed, nr_scanned; | 1793 | unsigned long nr_reclaimed, nr_scanned; |
1794 | unsigned long nr_to_reclaim = sc->nr_to_reclaim; | 1794 | unsigned long nr_to_reclaim = sc->nr_to_reclaim; |
1795 | struct blk_plug plug; | 1795 | struct blk_plug plug; |
1796 | struct lruvec *lruvec; | ||
1797 | |||
1798 | lruvec = mem_cgroup_zone_lruvec(mz->zone, mz->mem_cgroup); | ||
1796 | 1799 | ||
1797 | restart: | 1800 | restart: |
1798 | nr_reclaimed = 0; | 1801 | nr_reclaimed = 0; |
@@ -1831,7 +1834,7 @@ restart: | |||
1831 | * Even if we did not try to evict anon pages at all, we want to | 1834 | * Even if we did not try to evict anon pages at all, we want to |
1832 | * rebalance the anon lru active/inactive ratio. | 1835 | * rebalance the anon lru active/inactive ratio. |
1833 | */ | 1836 | */ |
1834 | if (inactive_anon_is_low(mz)) | 1837 | if (inactive_anon_is_low(lruvec)) |
1835 | shrink_active_list(SWAP_CLUSTER_MAX, mz, | 1838 | shrink_active_list(SWAP_CLUSTER_MAX, mz, |
1836 | sc, LRU_ACTIVE_ANON); | 1839 | sc, LRU_ACTIVE_ANON); |
1837 | 1840 | ||
@@ -2264,12 +2267,13 @@ static void age_active_anon(struct zone *zone, struct scan_control *sc) | |||
2264 | 2267 | ||
2265 | memcg = mem_cgroup_iter(NULL, NULL, NULL); | 2268 | memcg = mem_cgroup_iter(NULL, NULL, NULL); |
2266 | do { | 2269 | do { |
2270 | struct lruvec *lruvec = mem_cgroup_zone_lruvec(zone, memcg); | ||
2267 | struct mem_cgroup_zone mz = { | 2271 | struct mem_cgroup_zone mz = { |
2268 | .mem_cgroup = memcg, | 2272 | .mem_cgroup = memcg, |
2269 | .zone = zone, | 2273 | .zone = zone, |
2270 | }; | 2274 | }; |
2271 | 2275 | ||
2272 | if (inactive_anon_is_low(&mz)) | 2276 | if (inactive_anon_is_low(lruvec)) |
2273 | shrink_active_list(SWAP_CLUSTER_MAX, &mz, | 2277 | shrink_active_list(SWAP_CLUSTER_MAX, &mz, |
2274 | sc, LRU_ACTIVE_ANON); | 2278 | sc, LRU_ACTIVE_ANON); |
2275 | 2279 | ||