From: sashiko-bot@kernel.org
To: "Gregory Price" <gourry@gourry.net>
Cc: damon@lists.linux.dev, hannes@cmpxchg.org, kvm@vger.kernel.org,
tj@kernel.org, mkoutny@suse.com, linux-cxl@vger.kernel.org,
nvdimm@lists.linux.dev
Subject: Re: [PATCH v5 22/36] mm/mempolicy: add MPOL_F_PRIVATE and zonelist selection
Date: Tue, 21 Jul 2026 19:28:52 +0000 [thread overview]
Message-ID: <20260721192853.255791F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260720193431.3841992-23-gourry@gourry.net>
Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
New issues:
- [High] Private nodes are permanently lost from MPOL_F_STATIC_NODES policies during memory offlining/rebinding.
- [High] Mempolicies targeting private nodes will silently fail to allocate from them due to cpuset restrictions.
- [Medium] Non-atomic clearing of MPOL_F_PRIVATE in pol->flags causes a data race with lockless page allocators.
Pre-existing issues:
- [High] Lockless and unprotected access to pol->nodes in alloc_pages_bulk_interleave can lead to a divide-by-zero crash.
- [High] Unconditional GFP_KERNEL allocation in alloc_pages_bulk_weighted_interleave violates caller's GFP constraints.
--
--- Patch [22]: [PATCH v5 22/36] mm/mempolicy: add MPOL_F_PRIVATE and zonelist selection ---
commit 11224b898bbcf008cfe6641a6cd14bd637edb1d1
Author: Gregory Price <gourry@gourry.net>
mm/mempolicy: add MPOL_F_PRIVATE and zonelist selection
This patch adds MPOL_F_PRIVATE to mempolicy flags to identify policies
containing private nodes, allowing private node memory to be reachable.
It also plumbs zonelist selection into the mempolicy allocator interfaces
using the alloc_flags mechanism.
> diff --git a/mm/mempolicy.c b/mm/mempolicy.c
> index 2b76c57a460c9..90110e9761122 100644
> --- a/mm/mempolicy.c
> +++ b/mm/mempolicy.c
[ ... ]
> @@ -505,22 +509,33 @@ static void mpol_rebind_default(struct mempolicy *pol, const nodemask_t *nodes)
>
> static void mpol_rebind_nodemask(struct mempolicy *pol, const nodemask_t *nodes)
> {
> - nodemask_t tmp;
> + nodemask_t tmp, priv;
> +
> + /* preserve online private nodes to re-add later */
> + nodes_and(priv, pol->nodes, node_states[N_MEMORY_PRIVATE]);
[Severity: High]
Does this evaluate private nodes against pol->nodes instead of
pol->w.user_nodemask?
If a private node targeted by an MPOL_F_STATIC_NODES policy goes offline,
it is removed from pol->nodes. When the node comes back online and
mpol_rebind_nodemask() runs, attempting to restore private nodes from
pol->nodes will find it empty.
Could this result in permanent loss of private nodes from static policies?
> if (pol->flags & MPOL_F_STATIC_NODES)
> nodes_and(tmp, pol->w.user_nodemask, *nodes);
[ ... ]
> - if (nodes_empty(tmp))
> + /* private nodes are identity-mapped during remap, drop them here */
> + nodes_and(tmp, tmp, node_states[N_MEMORY]);
> + if (nodes_empty(tmp) && nodes_empty(priv))
> tmp = *nodes;
>
> - pol->nodes = tmp;
> + /* If any online private nodes remain, add them back */
> + nodes_or(pol->nodes, tmp, priv);
> + /* If no online private nodes remain, strip the private flag */
> + if (nodes_empty(priv))
> + pol->flags &= ~MPOL_F_PRIVATE;
[Severity: Medium]
Does clearing MPOL_F_PRIVATE non-atomically create a data race with lockless
page allocators?
When mpol_alloc_flags() concurrently reads (pol->flags & MPOL_F_PRIVATE)
locklessly in the page allocator fastpath, could this result in torn reads
and trigger KCSAN warnings?
> }
[ ... ]
> @@ -2488,7 +2513,7 @@ static struct page *alloc_pages_mpol(gfp_t gfp, unsigned int order,
> }
> }
>
> - page = __alloc_frozen_pages_noprof(gfp, order, nid, nodemask, ALLOC_DEFAULT);
> + page = __alloc_frozen_pages_noprof(gfp, order, nid, nodemask, aflags);
[Severity: High]
For MPOL_BIND policies, will cpuset_nodemask_valid_mems_allowed() return
false because private nodes are excluded from cpuset.mems, setting nodemask
to NULL?
When a NULL nodemask is passed to the allocator, the fastpath defaults to
cpuset_current_mems_allowed with ALLOC_CPUSET. Since private nodes are
absent from the cpuset, won't __cpuset_zone_allowed() skip the private
nodes regardless of ALLOC_ZONELIST_PRIVATE?
Will mempolicies targeting private nodes silently fail to allocate from them
and fall back to standard nodes?
> if (unlikely(pol->mode == MPOL_INTERLEAVE ||
[ ... ]
> @@ -2597,6 +2622,7 @@ static unsigned long alloc_pages_bulk_interleave(gfp_t gfp,
> struct mempolicy *pol, unsigned long nr_pages,
> struct page **page_array)
> {
> + unsigned int aflags = mpol_alloc_flags(pol);
> int nodes;
> unsigned long nr_pages_per_node;
[Severity: High]
This isn't a bug introduced by this patch, but is it safe to read pol->nodes
locklessly in alloc_pages_bulk_interleave()?
alloc_pages_bulk_interleave() reads the nodemask word-by-word via
nodes_weight(pol->nodes) further down in this function.
Concurrently, mpol_rebind_nodemask() mutates pol->nodes word-by-word via
nodes_or(pol->nodes, tmp, priv).
On systems with >64 nodes, could a torn read result in a weight of 0,
causing a divide-by-zero panic when calculating
nr_pages_per_node = nr_pages / nodes?
[ ... ]
> @@ -2632,6 +2658,7 @@ static unsigned long alloc_pages_bulk_weighted_interleave(gfp_t gfp,
> struct mempolicy *pol, unsigned long nr_pages,
> struct page **page_array)
> {
> + unsigned int aflags = mpol_alloc_flags(pol);
> struct weighted_interleave_state *state;
> struct task_struct *me = current;
[Severity: High]
This is a pre-existing issue, but does alloc_pages_bulk_weighted_interleave()
violate the caller's GFP constraints?
This function can be called via alloc_pages_bulk_mempolicy_noprof() from
vmalloc with restrictive flags like GFP_NOFS or GFP_NOIO. However, it
allocates its weights array unconditionally using
kzalloc(nr_node_ids, GFP_KERNEL) later in the function.
Could this strip the __GFP_FS or __GFP_IO protection and allow the
allocation to recurse into the filesystem or block layer, potentially
causing a deadlock?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260720193431.3841992-1-gourry@gourry.net?part=22
next prev parent reply other threads:[~2026-07-21 19:28 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-20 19:33 [PATCH v5 00/36] Private Memory NUMA Nodes Gregory Price
2026-07-20 19:33 ` [PATCH v5 01/36] mm: refactor find_next_best_node to find_next_best_node_in Gregory Price
2026-07-21 5:46 ` Balbir Singh
2026-07-20 19:33 ` [PATCH v5 02/36] mm/page_alloc: refactor build_node_zonelist() out of build_zonelists() Gregory Price
2026-07-20 19:33 ` [PATCH v5 03/36] mm/page_alloc: let the bulk and folio allocators carry alloc_flags Gregory Price
2026-07-21 18:26 ` sashiko-bot
2026-07-20 19:33 ` [PATCH v5 04/36] numa: introduce N_MEMORY_PRIVATE Gregory Price
2026-07-21 18:18 ` sashiko-bot
2026-07-20 19:33 ` [PATCH v5 05/36] mm: add ZONELIST_PRIVATE(_NOFALLBACK) for N_MEMORY_PRIVATE nodes Gregory Price
2026-07-20 19:34 ` [PATCH v5 06/36] cpuset: exclude private nodes from cpuset.mems (default-open) Gregory Price
2026-07-21 18:22 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 07/36] mm/memory_hotplug: disallow migration-driven private node hotunplug Gregory Price
2026-07-20 19:34 ` [PATCH v5 08/36] mm/mempolicy: skip private node folios when queueing for migration Gregory Price
2026-07-21 18:22 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 09/36] mm/migrate: disallow userland driven migration for private nodes Gregory Price
2026-07-21 18:32 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 10/36] mm/madvise: disallow madvise operations on private node folios Gregory Price
2026-07-21 18:30 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 11/36] mm/compaction: disallow compaction on private nodes Gregory Price
2026-07-21 18:22 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 12/36] mm/page_alloc: clear private node watermarks and system reserves Gregory Price
2026-07-20 19:34 ` [PATCH v5 13/36] mm/mempolicy: disallow NUMA Balancing prot_none on private nodes Gregory Price
2026-07-20 19:34 ` [PATCH v5 14/36] mm/damon: skip private node memory in DAMON migration and pageout Gregory Price
2026-07-21 18:18 ` sashiko-bot
2026-07-21 23:46 ` SJ Park
2026-07-20 19:34 ` [PATCH v5 15/36] mm/ksm: skip KSM for managed-memory folios Gregory Price
2026-07-20 19:34 ` [PATCH v5 16/36] mm/khugepaged: skip private node folios when trying to collapse Gregory Price
2026-07-21 18:36 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 17/36] mm/vmscan: disallow reclaim of private node memory Gregory Price
2026-07-21 18:35 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 18/36] mm/gup: disallow longterm pin of private node folios Gregory Price
2026-07-20 19:34 ` [PATCH v5 19/36] proc: include N_MEMORY_PRIVATE nodes in numa_maps output Gregory Price
2026-07-21 18:30 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 20/36] mm/memcontrol: account private-node memory in per-node stats Gregory Price
2026-07-21 18:33 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 21/36] proc/kcore: include private-node RAM in the kcore RAM map Gregory Price
2026-07-20 20:05 ` Omar Sandoval
2026-07-20 19:34 ` [PATCH v5 22/36] mm/mempolicy: add MPOL_F_PRIVATE and zonelist selection Gregory Price
2026-07-21 19:28 ` sashiko-bot [this message]
2026-07-20 19:34 ` [PATCH v5 23/36] mm/mempolicy: apply policy at the kernel zone for private-node binds Gregory Price
2026-07-21 19:39 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 24/36] mm/mempolicy: add in-kernel MPOL_BIND interfaces for drivers/services Gregory Price
2026-07-21 18:36 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 25/36] mm/memory_hotplug: support N_MEMORY_PRIVATE node hotplug Gregory Price
2026-07-21 18:33 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 26/36] mm: add NODE_PRIVATE_CAP_RECLAIM for opted-in private node reclaim Gregory Price
2026-07-21 20:02 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 27/36] mm: add NODE_PRIVATE_CAP_USER_NUMA for userland numa controls Gregory Price
2026-07-21 20:13 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 28/36] mm: add NODE_PRIVATE_CAP_HOTUNPLUG for opted-in private nodes Gregory Price
2026-07-20 19:34 ` [PATCH v5 29/36] mm: add NODE_PRIVATE_CAP_DEMOTION for private-node tiering demotion Gregory Price
2026-07-21 20:28 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 30/36] mm: add NODE_PRIVATE_CAP_NUMA_BALANCING for private-node NUMA balancing Gregory Price
2026-07-20 19:34 ` [PATCH v5 31/36] mm: add NODE_PRIVATE_CAP_LTPIN for private node folio pinning Gregory Price
2026-07-20 19:34 ` [PATCH v5 32/36] mm/khugepaged: base private node collapse eligiblity on actor/cap bits Gregory Price
2026-07-21 20:49 ` sashiko-bot
2026-07-20 19:34 ` [PATCH v5 33/36] Documentation/mm: describe private (N_MEMORY_PRIVATE) memory nodes Gregory Price
2026-07-20 19:34 ` [PATCH v5 34/36] mm/mempolicy: add mpol_set_shared_policy_range() Gregory Price
2026-07-20 19:34 ` [PATCH v5 35/36] KVM: guest_memfd: bind backing memory to a NUMA node at creation Gregory Price
2026-07-21 21:11 ` sashiko-bot
2026-07-21 3:46 ` [PATCH v5 00/36] Private Memory NUMA Nodes Balbir Singh
2026-07-21 18:16 ` Gregory Price
2026-07-21 13:26 ` Zenghui Yu
2026-07-21 17:18 ` Gregory Price
2026-07-21 18:06 ` [PATCH v5 36/36] KVM: selftests: add a guest_memfd FLAG_BIND_NODE test Gregory Price
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=20260721192853.255791F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=damon@lists.linux.dev \
--cc=gourry@gourry.net \
--cc=hannes@cmpxchg.org \
--cc=kvm@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=mkoutny@suse.com \
--cc=nvdimm@lists.linux.dev \
--cc=sashiko-reviews@lists.linux.dev \
--cc=tj@kernel.org \
/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.