mm/vmstat: move pgdemote_* to per-node stats
authorLi Zhijian <lizhijian@fujitsu.com>
Fri, 3 Nov 2023 03:14:50 +0000 (11:14 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 11 Dec 2023 00:51:31 +0000 (16:51 -0800)
Demotion will migrate pages across nodes.  Previously, only the global
demotion statistics were accounted for.  Changed them to per-node
statistics, making it easier to observe where demotion occurs on each
node.

This will help to identify which nodes are under pressure.

This patch also make pgdemote_* behind CONFIG_NUMA_BALANCING, since
demotion is not available for !CONFIG_NUMA_BALANCING

With this patch, here is a sample where node0 node1 are DRAM,
node3 is PMEM:
Global stats:
$ grep demote /proc/vmstat
pgdemote_kswapd 254288
pgdemote_direct 113497
pgdemote_khugepaged 0

Per-node stats:
$ grep demote /sys/devices/system/node/node0/vmstat # demotion source
pgdemote_kswapd 68454
pgdemote_direct 83431
pgdemote_khugepaged 0
$ grep demote /sys/devices/system/node/node1/vmstat # demotion source
pgdemote_kswapd 185834
pgdemote_direct 30066
pgdemote_khugepaged 0
$ grep demote /sys/devices/system/node/node3/vmstat # demotion target
pgdemote_kswapd 0
pgdemote_direct 0
pgdemote_khugepaged 0

Link: https://lkml.kernel.org/r/20231103031450.1456523-1-lizhijian@fujitsu.com
Signed-off-by: Li Zhijian <lizhijian@fujitsu.com>
Acked-by: "Huang, Ying" <ying.huang@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/mmzone.h
include/linux/vm_event_item.h
mm/vmscan.c
mm/vmstat.c

index 3c25226..14faffa 100644 (file)
@@ -206,6 +206,10 @@ enum node_stat_item {
 #ifdef CONFIG_NUMA_BALANCING
        PGPROMOTE_SUCCESS,      /* promote successfully */
        PGPROMOTE_CANDIDATE,    /* candidate pages to promote */
+       /* PGDEMOTE_*: pages demoted */
+       PGDEMOTE_KSWAPD,
+       PGDEMOTE_DIRECT,
+       PGDEMOTE_KHUGEPAGED,
 #endif
        NR_VM_NODE_STAT_ITEMS
 };
index 8abfa12..d1b8475 100644 (file)
@@ -41,9 +41,6 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
                PGSTEAL_KSWAPD,
                PGSTEAL_DIRECT,
                PGSTEAL_KHUGEPAGED,
-               PGDEMOTE_KSWAPD,
-               PGDEMOTE_DIRECT,
-               PGDEMOTE_KHUGEPAGED,
                PGSCAN_KSWAPD,
                PGSCAN_DIRECT,
                PGSCAN_KHUGEPAGED,
index 506f822..5dc581c 100644 (file)
@@ -409,12 +409,14 @@ void drop_slab(void)
 
 static int reclaimer_offset(void)
 {
+#ifdef CONFIG_NUMA_BALANCING
        BUILD_BUG_ON(PGSTEAL_DIRECT - PGSTEAL_KSWAPD !=
                        PGDEMOTE_DIRECT - PGDEMOTE_KSWAPD);
-       BUILD_BUG_ON(PGSTEAL_DIRECT - PGSTEAL_KSWAPD !=
-                       PGSCAN_DIRECT - PGSCAN_KSWAPD);
        BUILD_BUG_ON(PGSTEAL_KHUGEPAGED - PGSTEAL_KSWAPD !=
                        PGDEMOTE_KHUGEPAGED - PGDEMOTE_KSWAPD);
+#endif
+       BUILD_BUG_ON(PGSTEAL_DIRECT - PGSTEAL_KSWAPD !=
+                       PGSCAN_DIRECT - PGSCAN_KSWAPD);
        BUILD_BUG_ON(PGSTEAL_KHUGEPAGED - PGSTEAL_KSWAPD !=
                        PGSCAN_KHUGEPAGED - PGSCAN_KSWAPD);
 
@@ -976,8 +978,10 @@ static unsigned int demote_folio_list(struct list_head *demote_folios,
        migrate_pages(demote_folios, alloc_demote_folio, NULL,
                      (unsigned long)&mtc, MIGRATE_ASYNC, MR_DEMOTION,
                      &nr_succeeded);
-
-       __count_vm_events(PGDEMOTE_KSWAPD + reclaimer_offset(), nr_succeeded);
+#ifdef CONFIG_NUMA_BALANCING
+       mod_node_page_state(pgdat, PGDEMOTE_KSWAPD + reclaimer_offset(),
+                           nr_succeeded);
+#endif
 
        return nr_succeeded;
 }
index 359460d..afa5a38 100644 (file)
@@ -1248,6 +1248,9 @@ const char * const vmstat_text[] = {
 #ifdef CONFIG_NUMA_BALANCING
        "pgpromote_success",
        "pgpromote_candidate",
+       "pgdemote_kswapd",
+       "pgdemote_direct",
+       "pgdemote_khugepaged",
 #endif
 
        /* enum writeback_stat_item counters */
@@ -1279,9 +1282,6 @@ const char * const vmstat_text[] = {
        "pgsteal_kswapd",
        "pgsteal_direct",
        "pgsteal_khugepaged",
-       "pgdemote_kswapd",
-       "pgdemote_direct",
-       "pgdemote_khugepaged",
        "pgscan_kswapd",
        "pgscan_direct",
        "pgscan_khugepaged",