+++ /dev/null
-From b2bd8598195f1b2a72130592125ac6b4218988a2 Mon Sep 17 00:00:00 2001
-From: David Rientjes <rientjes@google.com>
-Date: Wed, 3 May 2017 14:52:59 -0700
-Subject: mm, vmstat: print non-populated zones in zoneinfo
-
-From: David Rientjes <rientjes@google.com>
-
-commit b2bd8598195f1b2a72130592125ac6b4218988a2 upstream.
-
-Initscripts can use the information (protection levels) from
-/proc/zoneinfo to configure vm.lowmem_reserve_ratio at boot.
-
-vm.lowmem_reserve_ratio is an array of ratios for each configured zone
-on the system. If a zone is not populated on an arch, /proc/zoneinfo
-suppresses its output.
-
-This results in there not being a 1:1 mapping between the set of zones
-emitted by /proc/zoneinfo and the zones configured by
-vm.lowmem_reserve_ratio.
-
-This patch shows statistics for non-populated zones in /proc/zoneinfo.
-The zones exist and hold a spot in the vm.lowmem_reserve_ratio array.
-Without this patch, it is not possible to determine which index in the
-array controls which zone if one or more zones on the system are not
-populated.
-
-Remaining users of walk_zones_in_node() are unchanged. Files such as
-/proc/pagetypeinfo require certain zone data to be initialized properly
-for display, which is not done for unpopulated zones.
-
-Link: http://lkml.kernel.org/r/alpine.DEB.2.10.1703031451310.98023@chino.kir.corp.google.com
-Signed-off-by: David Rientjes <rientjes@google.com>
-Reviewed-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
-Cc: Vlastimil Babka <vbabka@suse.cz>
-Cc: Mel Gorman <mgorman@techsingularity.net>
-Cc: Johannes Weiner <hannes@cmpxchg.org>
-Cc: Michal Hocko <mhocko@kernel.org>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-Cc: Jisheng Zhang <Jisheng.Zhang@synaptics.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- mm/vmstat.c | 27 +++++++++++++++++----------
- 1 file changed, 17 insertions(+), 10 deletions(-)
-
---- a/mm/vmstat.c
-+++ b/mm/vmstat.c
-@@ -1120,8 +1120,12 @@ static void frag_stop(struct seq_file *m
- {
- }
-
--/* Walk all the zones in a node and print using a callback */
-+/*
-+ * Walk zones in a node and print using a callback.
-+ * If @assert_populated is true, only use callback for zones that are populated.
-+ */
- static void walk_zones_in_node(struct seq_file *m, pg_data_t *pgdat,
-+ bool assert_populated,
- void (*print)(struct seq_file *m, pg_data_t *, struct zone *))
- {
- struct zone *zone;
-@@ -1129,7 +1133,7 @@ static void walk_zones_in_node(struct se
- unsigned long flags;
-
- for (zone = node_zones; zone - node_zones < MAX_NR_ZONES; ++zone) {
-- if (!populated_zone(zone))
-+ if (assert_populated && !populated_zone(zone))
- continue;
-
- spin_lock_irqsave(&zone->lock, flags);
-@@ -1157,7 +1161,7 @@ static void frag_show_print(struct seq_f
- static int frag_show(struct seq_file *m, void *arg)
- {
- pg_data_t *pgdat = (pg_data_t *)arg;
-- walk_zones_in_node(m, pgdat, frag_show_print);
-+ walk_zones_in_node(m, pgdat, true, frag_show_print);
- return 0;
- }
-
-@@ -1198,7 +1202,7 @@ static int pagetypeinfo_showfree(struct
- seq_printf(m, "%6d ", order);
- seq_putc(m, '\n');
-
-- walk_zones_in_node(m, pgdat, pagetypeinfo_showfree_print);
-+ walk_zones_in_node(m, pgdat, true, pagetypeinfo_showfree_print);
-
- return 0;
- }
-@@ -1250,7 +1254,7 @@ static int pagetypeinfo_showblockcount(s
- for (mtype = 0; mtype < MIGRATE_TYPES; mtype++)
- seq_printf(m, "%12s ", migratetype_names[mtype]);
- seq_putc(m, '\n');
-- walk_zones_in_node(m, pgdat, pagetypeinfo_showblockcount_print);
-+ walk_zones_in_node(m, pgdat, true, pagetypeinfo_showblockcount_print);
-
- return 0;
- }
-@@ -1276,7 +1280,7 @@ static void pagetypeinfo_showmixedcount(
- seq_printf(m, "%12s ", migratetype_names[mtype]);
- seq_putc(m, '\n');
-
-- walk_zones_in_node(m, pgdat, pagetypeinfo_showmixedcount_print);
-+ walk_zones_in_node(m, pgdat, true, pagetypeinfo_showmixedcount_print);
- #endif /* CONFIG_PAGE_OWNER */
- }
-
-@@ -1432,12 +1436,15 @@ static void zoneinfo_show_print(struct s
- }
-
- /*
-- * Output information about zones in @pgdat.
-+ * Output information about zones in @pgdat. All zones are printed regardless
-+ * of whether they are populated or not: lowmem_reserve_ratio operates on the
-+ * set of all zones and userspace would not be aware of such zones if they are
-+ * suppressed here (zoneinfo displays the effect of lowmem_reserve_ratio).
- */
- static int zoneinfo_show(struct seq_file *m, void *arg)
- {
- pg_data_t *pgdat = (pg_data_t *)arg;
-- walk_zones_in_node(m, pgdat, zoneinfo_show_print);
-+ walk_zones_in_node(m, pgdat, false, zoneinfo_show_print);
- return 0;
- }
-
-@@ -1865,7 +1872,7 @@ static int unusable_show(struct seq_file
- if (!node_state(pgdat->node_id, N_MEMORY))
- return 0;
-
-- walk_zones_in_node(m, pgdat, unusable_show_print);
-+ walk_zones_in_node(m, pgdat, true, unusable_show_print);
-
- return 0;
- }
-@@ -1917,7 +1924,7 @@ static int extfrag_show(struct seq_file
- {
- pg_data_t *pgdat = (pg_data_t *)arg;
-
-- walk_zones_in_node(m, pgdat, extfrag_show_print);
-+ walk_zones_in_node(m, pgdat, true, extfrag_show_print);
-
- return 0;
- }