From: Yury Norov <ynorov@nvidia.com>
To: lirongqing <lirongqing@baidu.com>
Cc: Yury Norov <yury.norov@gmail.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
linux-mm@kvack.org
Subject: Re: [PATCH v2] nodemask: reduce bitmap width to nr_node_ids in __nodemask_pr_numnodes()
Date: Tue, 14 Jul 2026 09:10:30 -0400 [thread overview]
Message-ID: <alY1Rm7n8DmEzqAd@yury> (raw)
In-Reply-To: <20260713075104.2196-1-lirongqing@baidu.com>
On Mon, Jul 13, 2026 at 03:51:04PM +0800, lirongqing wrote:
> From: Li RongQing <lirongqing@baidu.com>
>
> __nodemask_pr_numnodes() currently returns MAX_NUMNODES as the field
> width for '%*pb[l]' nodemask printing. MAX_NUMNODES is a compile-time
> upper bound and can be much larger than the runtime node id range,
> resulting in excessive zero padding in bitmap-form output.
>
> For example, /proc/<pid>/status prints Mems_allowed with '%*pb' using
> the nodemask_pr_args() helper. On systems built with MAX_NUMNODES=1024
> but booted with a much smaller possible-node range, this produces:
>
> Mems_allowed: 00000000,00000000,...,00000003
>
> Switch to nr_node_ids, matching the behavior of cpumask_pr_args() which
> uses nr_cpu_ids. This reduces the output width from MAX_NUMNODES bits
> to the runtime node id range:
>
> Mems_allowed: 3
>
> Visible impact on in-tree users:
> - Bitmap format ('%*pb') users:
> * /proc/<pid>/status Mems_allowed (format changes as shown above)
OK, let me take it for testing. If no complains from users, it's a
nice cleanup.
> - List format ('%*pbl') users, output is unchanged, as list formatter
> only prints set bit ranges:
> * /sys/devices/system/node/{possible,online,has_normal_memory, ...}
> * NVMe multipath sysfs numa_nodes
> * memory tier sysfs nodelist
> * cpuset cgroup mems and effective_mems files
> * /proc/<pid>/status Mems_allowed_list
> * mempolicy strings in /proc/<pid>/numa_maps
> * SLUB debugfs output
> * Kernel log messages printing nodemasks
>
> Move nr_node_ids and nr_online_nodes declarations earlier in the file
> to allow __nodemask_pr_numnodes() to use nr_node_ids.
>
> Cc: Yury Norov <yury.norov@gmail.com>
> Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: linux-mm@kvack.org
> Signed-off-by: Li RongQing <lirongqing@baidu.com>
> ---
> Changes from v1:
> - List the unaffected '%*pbl' users explicitly, noting that their
> visible output is unchanged since the list formatter only prints
> set bit ranges regardless of field width.
> - Move the nr_node_ids and nr_online_nodes declarations earlier
>
> include/linux/nodemask.h | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h
> index b842aa5..607373b 100644
> --- a/include/linux/nodemask.h
> +++ b/include/linux/nodemask.h
> @@ -95,6 +95,14 @@
>
> extern nodemask_t _unused_nodemask_arg_;
>
> +#if MAX_NUMNODES > 1
> +extern unsigned int nr_node_ids;
> +extern unsigned int nr_online_nodes;
> +#else
> +#define nr_node_ids 1U
> +#define nr_online_nodes 1U
> +#endif
> +
> /**
> * nodemask_pr_args - printf args to output a nodemask
> * @maskp: nodemask to be printed
> @@ -105,7 +113,7 @@ extern nodemask_t _unused_nodemask_arg_;
> __nodemask_pr_bits(maskp)
> static __always_inline unsigned int __nodemask_pr_numnodes(const nodemask_t *m)
> {
> - return m ? MAX_NUMNODES : 0;
> + return m ? nr_node_ids : 0;
> }
> static __always_inline const unsigned long *__nodemask_pr_bits(const nodemask_t *m)
> {
> @@ -438,9 +446,6 @@ static __always_inline unsigned int next_memory_node(int nid)
> return next_node(nid, node_states[N_MEMORY]);
> }
>
> -extern unsigned int nr_node_ids;
> -extern unsigned int nr_online_nodes;
> -
> static __always_inline void node_set_online(int nid)
> {
> node_set_state(nid, N_ONLINE);
> @@ -480,8 +485,6 @@ static __always_inline int num_node_state(enum node_states state)
> #define first_memory_node 0
> #define next_online_node(nid) (MAX_NUMNODES)
> #define next_memory_node(nid) (MAX_NUMNODES)
> -#define nr_node_ids 1U
> -#define nr_online_nodes 1U
>
> #define node_set_online(node) node_set_state((node), N_ONLINE)
> #define node_set_offline(node) node_clear_state((node), N_ONLINE)
> --
> 2.9.4
prev parent reply other threads:[~2026-07-14 13:10 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-13 7:51 [PATCH v2] nodemask: reduce bitmap width to nr_node_ids in __nodemask_pr_numnodes() lirongqing
2026-07-14 13:10 ` Yury Norov [this message]
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=alY1Rm7n8DmEzqAd@yury \
--to=ynorov@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@rasmusvillemoes.dk \
--cc=lirongqing@baidu.com \
--cc=yury.norov@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.