linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michal Hocko <mhocko@kernel.org>
To: David Rientjes <rientjes@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Anshuman Khandual <khandual@linux.vnet.ibm.com>,
	Vlastimil Babka <vbabka@suse.cz>,
	Mel Gorman <mgorman@techsingularity.net>,
	Johannes Weiner <hannes@cmpxchg.org>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [patch v2] mm, vmstat: print non-populated zones in zoneinfo
Date: Wed, 8 Mar 2017 15:42:00 +0100	[thread overview]
Message-ID: <20170308144159.GD11034@dhcp22.suse.cz> (raw)
In-Reply-To: <alpine.DEB.2.10.1703031451310.98023@chino.kir.corp.google.com>

On Fri 03-03-17 14:53:07, David Rientjes wrote:
> 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.

Does it really make sense to print any counters of that zone though?
Your follow up patch just suggests that we don't want some but what
about others?

I can see how skipping empty zones completely can be clumsy but wouldn't
it be sufficient to just provide

Node $NUM, zone $NAME
(unpopulated)

instead?

> 
> Signed-off-by: David Rientjes <rientjes@google.com>
> ---
>  v2: - s/bool populated/b assert_populated/ per Anshuman
>      - add comment to zoneinfo_show() to describe why we care
> 
>  mm/vmstat.c | 27 +++++++++++++++++----------
>  1 file changed, 17 insertions(+), 10 deletions(-)
> 
> diff --git a/mm/vmstat.c b/mm/vmstat.c
> --- a/mm/vmstat.c
> +++ b/mm/vmstat.c
> @@ -1121,8 +1121,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;
> @@ -1130,7 +1134,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);
> @@ -1158,7 +1162,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;
>  }
>  
> @@ -1199,7 +1203,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;
>  }
> @@ -1251,7 +1255,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;
>  }
> @@ -1277,7 +1281,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 */
>  }
>  
> @@ -1429,12 +1433,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;
>  }
>  
> @@ -1853,7 +1860,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;
>  }
> @@ -1905,7 +1912,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;
>  }
> 
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

-- 
Michal Hocko
SUSE Labs

  parent reply	other threads:[~2017-03-08 14:53 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-02 23:26 [patch] mm, zoneinfo: print non-populated zones David Rientjes
2017-03-03 13:35 ` Anshuman Khandual
2017-03-03 22:46   ` David Rientjes
2017-03-03 22:53     ` [patch v2] mm, vmstat: print non-populated zones in zoneinfo David Rientjes
2017-03-04  8:21       ` Anshuman Khandual
2017-03-06 22:03       ` [patch -mm] mm, vmstat: suppress pcp stats for unpopulated " David Rientjes
2017-03-06 22:11         ` Andrew Morton
2017-03-08 14:42       ` Michal Hocko [this message]
2017-03-17  8:57         ` [patch v2] mm, vmstat: print non-populated " Michal Hocko
2017-03-17 21:21           ` David Rientjes
2017-05-03 23:41       ` [PATCH] mm, vmstat: Remove spurious WARN() during zoneinfo print Reza Arbab

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170308144159.GD11034@dhcp22.suse.cz \
    --to=mhocko@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=hannes@cmpxchg.org \
    --cc=khandual@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    --cc=rientjes@google.com \
    --cc=vbabka@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).