mm: vmscan: fix force-scanning small targets without swap
Without swap, anonymous pages are not scanned. As such, they should not
count when considering force-scanning a small target if there is no swap.
Otherwise, targets are not force-scanned even when their effective scan
number is zero and the other conditions--kswapd/memcg--apply.
This fixes 246e87a939
("memcg: fix get_scan_count() for small
targets").
[akpm@linux-foundation.org: fix comment]
Signed-off-by: Johannes Weiner <jweiner@redhat.com>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: Michal Hocko <mhocko@suse.cz>
Cc: Ying Han <yinghan@google.com>
Cc: Balbir Singh <bsingharora@gmail.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Acked-by: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d4c32f355c
commit
a4d3e9e763
27
mm/vmscan.c
27
mm/vmscan.c
|
@ -1808,23 +1808,15 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
|
|||
u64 fraction[2], denominator;
|
||||
enum lru_list l;
|
||||
int noswap = 0;
|
||||
int force_scan = 0;
|
||||
bool force_scan = false;
|
||||
unsigned long nr_force_scan[2];
|
||||
|
||||
|
||||
anon = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_ANON) +
|
||||
zone_nr_lru_pages(zone, sc, LRU_INACTIVE_ANON);
|
||||
file = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_FILE) +
|
||||
zone_nr_lru_pages(zone, sc, LRU_INACTIVE_FILE);
|
||||
|
||||
if (((anon + file) >> priority) < SWAP_CLUSTER_MAX) {
|
||||
/* kswapd does zone balancing and need to scan this zone */
|
||||
if (scanning_global_lru(sc) && current_is_kswapd())
|
||||
force_scan = 1;
|
||||
/* memcg may have small limit and need to avoid priority drop */
|
||||
if (!scanning_global_lru(sc))
|
||||
force_scan = 1;
|
||||
}
|
||||
/* kswapd does zone balancing and needs to scan this zone */
|
||||
if (scanning_global_lru(sc) && current_is_kswapd())
|
||||
force_scan = true;
|
||||
/* memcg may have small limit and need to avoid priority drop */
|
||||
if (!scanning_global_lru(sc))
|
||||
force_scan = true;
|
||||
|
||||
/* If we have no swap space, do not bother scanning anon pages. */
|
||||
if (!sc->may_swap || (nr_swap_pages <= 0)) {
|
||||
|
@ -1837,6 +1829,11 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
|
|||
goto out;
|
||||
}
|
||||
|
||||
anon = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_ANON) +
|
||||
zone_nr_lru_pages(zone, sc, LRU_INACTIVE_ANON);
|
||||
file = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_FILE) +
|
||||
zone_nr_lru_pages(zone, sc, LRU_INACTIVE_FILE);
|
||||
|
||||
if (scanning_global_lru(sc)) {
|
||||
free = zone_page_state(zone, NR_FREE_PAGES);
|
||||
/* If we have very few page cache pages,
|
||||
|
|
Loading…
Reference in a new issue