This moving makes the layout of /proc/zoneinfo more sensible. And there are 4 zones at most currently, it doesn't need to scroll down much to get to the 1st populated zone, even though the 1st populated zone is MOVABLE zone. Node 2, per-node stats nr_inactive_anon 48 nr_active_anon 15454 ... nr_foll_pin_acquired 0 nr_foll_pin_released 0 Node 2, zone DMA pages free 0 min 0 low 0 high 0 spanned 0 present 0 managed 0 Node 2, zone DMA32 pages free 0 min 0 low 0 high 0 spanned 0 present 0 managed 0 Node 2, zone Normal pages free 0 min 0 low 0 high 0 spanned 0 present 0 managed 0 Node 2, zone Movable pages free 196346 min 3540 ... managed 262144 Signed-off-by: Baoquan He <bhe@xxxxxxxxxx> --- mm/vmstat.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mm/vmstat.c b/mm/vmstat.c index 6fd1407f4632..4bbf9be786da 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1567,13 +1567,6 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat, { int i; seq_printf(m, "Node %d, zone %8s", pgdat->node_id, zone->name); - if (is_zone_first_populated(pgdat, zone)) { - seq_printf(m, "\n per-node stats"); - for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++) { - seq_printf(m, "\n %-12s %lu", node_stat_name(i), - node_page_state(pgdat, i)); - } - } seq_printf(m, "\n pages free %lu" "\n min %lu" @@ -1648,7 +1641,18 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat, */ static int zoneinfo_show(struct seq_file *m, void *arg) { + int i; pg_data_t *pgdat = (pg_data_t *)arg; + + if (node_state(pgdat->node_id, N_MEMORY)) { + seq_printf(m, "Node %d, per-node stats", pgdat->node_id); + for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++) { + seq_printf(m, "\n %-12s %lu", node_stat_name(i), + node_page_state(pgdat, i)); + } + seq_putc(m, '\n'); + } + walk_zones_in_node(m, pgdat, false, false, zoneinfo_show_print); return 0; } -- 2.17.2