Skip to content

Commit

Permalink
mm: vmscan: fix force-scanning small targets without swap
Browse files Browse the repository at this point in the history
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 246e87a ("memcg: fix get_scan_count() for small
targets").

[[email protected]: fix comment]
Signed-off-by: Johannes Weiner <[email protected]>
Acked-by: KAMEZAWA Hiroyuki <[email protected]>
Reviewed-by: Michal Hocko <[email protected]>
Cc: Ying Han <[email protected]>
Cc: Balbir Singh <[email protected]>
Cc: KOSAKI Motohiro <[email protected]>
Cc: Daisuke Nishimura <[email protected]>
Acked-by: Mel Gorman <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Johannes Weiner authored and torvalds committed Sep 15, 2011
1 parent d4c32f3 commit a4d3e9e
Showing 1 changed file with 12 additions and 15 deletions.
27 changes: 12 additions & 15 deletions mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand All @@ -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,
Expand Down

0 comments on commit a4d3e9e

Please sign in to comment.