|
@@ -1124,8 +1124,12 @@ static void frag_stop(struct seq_file *m, void *arg)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
-/* 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;
|
|
@@ -1133,7 +1137,7 @@ static void walk_zones_in_node(struct seq_file *m, pg_data_t *pgdat,
|
|
|
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);
|
|
@@ -1161,7 +1165,7 @@ static void frag_show_print(struct seq_file *m, pg_data_t *pgdat,
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -1202,7 +1206,7 @@ static int pagetypeinfo_showfree(struct seq_file *m, void *arg)
|
|
|
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;
|
|
|
}
|
|
@@ -1254,7 +1258,7 @@ static int pagetypeinfo_showblockcount(struct seq_file *m, void *arg)
|
|
|
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;
|
|
|
}
|
|
@@ -1280,7 +1284,7 @@ static void pagetypeinfo_showmixedcount(struct seq_file *m, pg_data_t *pgdat)
|
|
|
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 */
|
|
|
}
|
|
|
|
|
@@ -1430,12 +1434,15 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * 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;
|
|
|
}
|
|
|
|
|
@@ -1841,7 +1848,7 @@ static int unusable_show(struct seq_file *m, void *arg)
|
|
|
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;
|
|
|
}
|
|
@@ -1893,7 +1900,7 @@ static int extfrag_show(struct seq_file *m, void *arg)
|
|
|
{
|
|
|
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;
|
|
|
}
|