diff options
Diffstat (limited to 'mm/vmscan.c')
| -rw-r--r-- | mm/vmscan.c | 27 | 
1 files changed, 17 insertions, 10 deletions
| diff --git a/mm/vmscan.c b/mm/vmscan.c index 6aa5b01d3e75..532a2a750952 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -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); |