|
@@ -242,6 +242,16 @@ unsigned long lruvec_lru_size(struct lruvec *lruvec, enum lru_list lru)
|
|
|
return node_page_state(lruvec_pgdat(lruvec), NR_LRU_BASE + lru);
|
|
|
}
|
|
|
|
|
|
+unsigned long lruvec_zone_lru_size(struct lruvec *lruvec, enum lru_list lru,
|
|
|
+ int zone_idx)
|
|
|
+{
|
|
|
+ if (!mem_cgroup_disabled())
|
|
|
+ return mem_cgroup_get_zone_lru_size(lruvec, lru, zone_idx);
|
|
|
+
|
|
|
+ return zone_page_state(&lruvec_pgdat(lruvec)->node_zones[zone_idx],
|
|
|
+ NR_ZONE_LRU_BASE + lru);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Add a shrinker callback to be called from the vm.
|
|
|
*/
|
|
@@ -1382,8 +1392,7 @@ int __isolate_lru_page(struct page *page, isolate_mode_t mode)
|
|
|
* be complete before mem_cgroup_update_lru_size due to a santity check.
|
|
|
*/
|
|
|
static __always_inline void update_lru_sizes(struct lruvec *lruvec,
|
|
|
- enum lru_list lru, unsigned long *nr_zone_taken,
|
|
|
- unsigned long nr_taken)
|
|
|
+ enum lru_list lru, unsigned long *nr_zone_taken)
|
|
|
{
|
|
|
int zid;
|
|
|
|
|
@@ -1392,11 +1401,11 @@ static __always_inline void update_lru_sizes(struct lruvec *lruvec,
|
|
|
continue;
|
|
|
|
|
|
__update_lru_size(lruvec, lru, zid, -nr_zone_taken[zid]);
|
|
|
- }
|
|
|
-
|
|
|
#ifdef CONFIG_MEMCG
|
|
|
- mem_cgroup_update_lru_size(lruvec, lru, -nr_taken);
|
|
|
+ mem_cgroup_update_lru_size(lruvec, lru, zid, -nr_zone_taken[zid]);
|
|
|
#endif
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1501,7 +1510,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
|
|
|
*nr_scanned = scan;
|
|
|
trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan, scan,
|
|
|
nr_taken, mode, is_file_lru(lru));
|
|
|
- update_lru_sizes(lruvec, lru, nr_zone_taken, nr_taken);
|
|
|
+ update_lru_sizes(lruvec, lru, nr_zone_taken);
|
|
|
return nr_taken;
|
|
|
}
|
|
|
|
|
@@ -2047,10 +2056,8 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
|
|
|
if (!managed_zone(zone))
|
|
|
continue;
|
|
|
|
|
|
- inactive_zone = zone_page_state(zone,
|
|
|
- NR_ZONE_LRU_BASE + (file * LRU_FILE));
|
|
|
- active_zone = zone_page_state(zone,
|
|
|
- NR_ZONE_LRU_BASE + (file * LRU_FILE) + LRU_ACTIVE);
|
|
|
+ inactive_zone = lruvec_zone_lru_size(lruvec, file * LRU_FILE, zid);
|
|
|
+ active_zone = lruvec_zone_lru_size(lruvec, (file * LRU_FILE) + LRU_ACTIVE, zid);
|
|
|
|
|
|
inactive -= min(inactive, inactive_zone);
|
|
|
active -= min(active, active_zone);
|