mm, vmscan: consider isolated pages in zone_reclaimable_pages
authorMichal Hocko <mhocko@suse.com>
Thu, 14 Jan 2016 23:19:47 +0000 (15:19 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 15 Jan 2016 00:00:49 +0000 (16:00 -0800)
zone_reclaimable_pages counts how many pages are reclaimable in the
given zone.  This currently includes all pages on file lrus and anon
lrus if there is an available swap storage.  We do not consider
NR_ISOLATED_{ANON,FILE} counters though which is not correct because
these counters reflect temporarily isolated pages which are still
reclaimable because they either get back to their LRU or get freed
either by the page reclaim or page migration.

The number of these pages might be sufficiently high to confuse users of
zone_reclaimable_pages (e.g.  mbind can migrate large ranges of memory
at once).

Signed-off-by: Michal Hocko <mhocko@suse.com>
Suggested-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Mel Gorman <mgorman@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/vmscan.c

index 1dab3a3ddcd392368f7f3e3942dc346cb76c8a3e..1bbfd623630ebdc8966e0617ceaeef6a1fe969f9 100644 (file)
@@ -197,11 +197,13 @@ static unsigned long zone_reclaimable_pages(struct zone *zone)
        unsigned long nr;
 
        nr = zone_page_state(zone, NR_ACTIVE_FILE) +
-            zone_page_state(zone, NR_INACTIVE_FILE);
+            zone_page_state(zone, NR_INACTIVE_FILE) +
+            zone_page_state(zone, NR_ISOLATED_FILE);
 
        if (get_nr_swap_pages() > 0)
                nr += zone_page_state(zone, NR_ACTIVE_ANON) +
-                     zone_page_state(zone, NR_INACTIVE_ANON);
+                     zone_page_state(zone, NR_INACTIVE_ANON) +
+                     zone_page_state(zone, NR_ISOLATED_ANON);
 
        return nr;
 }