Commit a4d3e9e7 authored by Johannes Weiner's avatar Johannes Weiner Committed by Linus Torvalds

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 246e87a9 ("memcg: fix get_scan_count() for small
targets").

[akpm@linux-foundation.org: fix comment]
Signed-off-by: default avatarJohannes Weiner <jweiner@redhat.com>
Acked-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: default avatarMichal 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: default avatarMel Gorman <mel@csn.ul.ie>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d4c32f35
...@@ -1808,23 +1808,15 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc, ...@@ -1808,23 +1808,15 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
u64 fraction[2], denominator; u64 fraction[2], denominator;
enum lru_list l; enum lru_list l;
int noswap = 0; int noswap = 0;
int force_scan = 0; bool force_scan = false;
unsigned long nr_force_scan[2]; unsigned long nr_force_scan[2];
/* kswapd does zone balancing and needs to scan this zone */
anon = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_ANON) + if (scanning_global_lru(sc) && current_is_kswapd())
zone_nr_lru_pages(zone, sc, LRU_INACTIVE_ANON); force_scan = true;
file = zone_nr_lru_pages(zone, sc, LRU_ACTIVE_FILE) + /* memcg may have small limit and need to avoid priority drop */
zone_nr_lru_pages(zone, sc, LRU_INACTIVE_FILE); if (!scanning_global_lru(sc))
force_scan = true;
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;
}
/* If we have no swap space, do not bother scanning anon pages. */ /* If we have no swap space, do not bother scanning anon pages. */
if (!sc->may_swap || (nr_swap_pages <= 0)) { if (!sc->may_swap || (nr_swap_pages <= 0)) {
...@@ -1837,6 +1829,11 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc, ...@@ -1837,6 +1829,11 @@ static void get_scan_count(struct zone *zone, struct scan_control *sc,
goto out; 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)) { if (scanning_global_lru(sc)) {
free = zone_page_state(zone, NR_FREE_PAGES); free = zone_page_state(zone, NR_FREE_PAGES);
/* If we have very few page cache pages, /* If we have very few page cache pages,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment