mm: keep separate anon and file statistics on page reclaim activity
authorJohannes Weiner <hannes@cmpxchg.org>
Wed, 3 Jun 2020 23:02:34 +0000 (16:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Jun 2020 03:09:48 +0000 (20:09 -0700)
Having statistics on pages scanned and pages reclaimed for both anon and
file pages makes it easier to evaluate changes to LRU balancing.

While at it, clean up the stat-keeping mess for isolation, putback,
reclaim stats etc.  a bit: first the physical LRU operation (isolation and
putback), followed by vmstats, reclaim_stats, and then vm events.

Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Rik van Riel <riel@surriel.com>
Link: http://lkml.kernel.org/r/20200520232525.798933-3-hannes@cmpxchg.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/vm_event_item.h
mm/vmscan.c
mm/vmstat.c

index ffef0f2..24fc7c3 100644 (file)
@@ -35,6 +35,10 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
                PGSCAN_KSWAPD,
                PGSCAN_DIRECT,
                PGSCAN_DIRECT_THROTTLE,
+               PGSCAN_ANON,
+               PGSCAN_FILE,
+               PGSTEAL_ANON,
+               PGSTEAL_FILE,
 #ifdef CONFIG_NUMA
                PGSCAN_ZONE_RECLAIM_FAILED,
 #endif
index 779edd0..1fa2417 100644 (file)
@@ -1913,7 +1913,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
        unsigned int nr_reclaimed = 0;
        unsigned long nr_taken;
        struct reclaim_stat stat;
-       int file = is_file_lru(lru);
+       bool file = is_file_lru(lru);
        enum vm_event_item item;
        struct pglist_data *pgdat = lruvec_pgdat(lruvec);
        struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat;
@@ -1941,11 +1941,12 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
 
        __mod_node_page_state(pgdat, NR_ISOLATED_ANON + file, nr_taken);
        reclaim_stat->recent_scanned[file] += nr_taken;
-
        item = current_is_kswapd() ? PGSCAN_KSWAPD : PGSCAN_DIRECT;
        if (!cgroup_reclaim(sc))
                __count_vm_events(item, nr_scanned);
        __count_memcg_events(lruvec_memcg(lruvec), item, nr_scanned);
+       __count_vm_events(PGSCAN_ANON + file, nr_scanned);
+
        spin_unlock_irq(&pgdat->lru_lock);
 
        if (nr_taken == 0)
@@ -1956,16 +1957,16 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
 
        spin_lock_irq(&pgdat->lru_lock);
 
+       move_pages_to_lru(lruvec, &page_list);
+
+       __mod_node_page_state(pgdat, NR_ISOLATED_ANON + file, -nr_taken);
+       reclaim_stat->recent_rotated[0] += stat.nr_activate[0];
+       reclaim_stat->recent_rotated[1] += stat.nr_activate[1];
        item = current_is_kswapd() ? PGSTEAL_KSWAPD : PGSTEAL_DIRECT;
        if (!cgroup_reclaim(sc))
                __count_vm_events(item, nr_reclaimed);
        __count_memcg_events(lruvec_memcg(lruvec), item, nr_reclaimed);
-       reclaim_stat->recent_rotated[0] += stat.nr_activate[0];
-       reclaim_stat->recent_rotated[1] += stat.nr_activate[1];
-
-       move_pages_to_lru(lruvec, &page_list);
-
-       __mod_node_page_state(pgdat, NR_ISOLATED_ANON + file, -nr_taken);
+       __count_vm_events(PGSTEAL_ANON + file, nr_reclaimed);
 
        spin_unlock_irq(&pgdat->lru_lock);
 
index 068706a..e55eda3 100644 (file)
@@ -1203,6 +1203,10 @@ const char * const vmstat_text[] = {
        "pgscan_kswapd",
        "pgscan_direct",
        "pgscan_direct_throttle",
+       "pgscan_anon",
+       "pgscan_file",
+       "pgsteal_anon",
+       "pgsteal_file",
 
 #ifdef CONFIG_NUMA
        "zone_reclaim_failed",