Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] mm/hugetlb: Fix null nodemask in alloc_fresh_hugetlb_folio
@ 2026-07-05 17:51 Sourav Panda
  2026-07-05 19:04 ` Andrew Morton
  2026-07-06  6:17 ` Muchun Song
  0 siblings, 2 replies; 4+ messages in thread
From: Sourav Panda @ 2026-07-05 17:51 UTC (permalink / raw)
  To: muchun.song, osalvador, akpm
  Cc: david, surenb, fvdl, gthelen, souravpanda, linux-mm, linux-kernel

alloc_buddy_hugetlb_folio_with_mpol() can pass a NULL nodemask to
alloc_fresh_hugetlb_folio() as a fallback to allocate from all
nodes. If order is gigantic, alloc_fresh_hugetlb_folio() propagates
the NULL nodemask down to hugetlb_cma_alloc_frozen_folio() which blindly
dereferences it in for_each_node_mask(), leading to a null pointer
dereference.

Similarly, if the CMA allocation fails, the fallback
alloc_contig_frozen_pages() is also called with a NULL nodemask,
which may cause issues.

Fix this by explicitly checking if nodemask is NULL in
alloc_fresh_hugetlb_folio() and defaulting to
cpuset_current_mems_allowed. This ensures that both the CMA and
contiguous allocators receive a valid nodemask safely using a seqcount
loop to prevent torn reads.

From a userspace perspective, this bug allows an unprivileged user to
crash the kernel (trigger a panic) by requesting a gigantic hugepage
allocation with MPOL_PREFERRED_MANY on a system where CMA is only
configured on a subset of NUMA nodes.

This can be reproduced by booting a VM with two NUMA nodes, restricting
CMA to Node 1 (e.g., hugetlb_cma=1:1G default_hugepagesz=1G hugepagesz=1G
hugepages=0), and running a program that allocates a 1GB hugepage area
without reserving, restricts allocation to Node 0 using mbind() with
MPOL_PREFERRED_MANY, and triggers a page fault:

  void *ptr = mmap(NULL, 1UL << 30, PROT_READ | PROT_WRITE,
                   MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB |
                   MAP_HUGE_1GB | MAP_NORESERVE, -1, 0);
  unsigned long nodemask = 1; /* Node 0 */
  mbind(ptr, 1UL << 30, MPOL_PREFERRED_MANY, &nodemask,
        sizeof(nodemask) * 8, 0);
  memset(ptr, 0, 1UL << 30); /* Trigger fault */

This results in a NULL pointer dereference:

  BUG: kernel NULL pointer dereference, address: 0000000000000000
  #PF: supervisor read access in kernel mode
  #PF: error_code(0x0000) - not-present page
  Oops: Oops: 0000 [#1] SMP NOPTI
  RIP: 0010:hugetlb_cma_alloc_frozen_folio+0x75/0x120
  Call Trace:
   <TASK>
   only_alloc_fresh_hugetlb_folio.isra.0+0x2c/0x160
   alloc_surplus_hugetlb_folio+0x6d/0x100
   alloc_hugetlb_folio+0x3c5/0x660
   hugetlb_no_page+0x3d9/0x650

Additionally, this patch adds a missing node_isset(nid, *nodemask) check
in hugetlb_cma_alloc_frozen_folio() to ensure the initial node allocation
attempt respects the memory policy.

Fixes: eb02f14c4a2b ("mm/hugetlb: allow overcommitting gigantic hugepages")
Cc: stable@vger.kernel.org
Signed-off-by: Sourav Panda <souravpanda@google.com>
---
Changes in v3:
- Condensed the reproducer and QEMU setup from v1 discussion into a readable summary per Andrew Morton.
- Safely read cpuset_current_mems_allowed using a seqcount loop to prevent torn reads.
- v2: https://lore.kernel.org/linux-mm/20260704174930.2885785-1-souravpanda@google.com/
- v1: https://lore.kernel.org/linux-mm/20260702215713.627941-1-souravpanda@google.com/
 mm/hugetlb.c     | 12 ++++++++++++
 mm/hugetlb_cma.c |  2 +-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 571212b80835..ee67ea29c003 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1864,6 +1864,18 @@ static struct folio *alloc_fresh_hugetlb_folio(struct hstate *h,
 		gfp_t gfp_mask, int nid, nodemask_t *nmask)
 {
 	struct folio *folio;
+	nodemask_t local_node_mask;
+
+	if (!nmask) {
+		unsigned int cpuset_mems_cookie;
+
+		do {
+			cpuset_mems_cookie = read_mems_allowed_begin();
+			local_node_mask = cpuset_current_mems_allowed;
+		} while (read_mems_allowed_retry(cpuset_mems_cookie));
+
+		nmask = &local_node_mask;
+	}
 
 	folio = only_alloc_fresh_hugetlb_folio(h, gfp_mask, nid, nmask, NULL);
 	if (folio)
diff --git a/mm/hugetlb_cma.c b/mm/hugetlb_cma.c
index 39344d6c78d8..79dbd0baafa3 100644
--- a/mm/hugetlb_cma.c
+++ b/mm/hugetlb_cma.c
@@ -34,7 +34,7 @@ struct folio *hugetlb_cma_alloc_frozen_folio(int order, gfp_t gfp_mask,
 	if (!hugetlb_cma_size)
 		return NULL;
 
-	if (hugetlb_cma[nid])
+	if (hugetlb_cma[nid] && node_isset(nid, *nodemask))
 		page = cma_alloc_frozen_compound(hugetlb_cma[nid], order);
 
 	if (!page && !(gfp_mask & __GFP_THISNODE)) {
-- 
2.55.0.rc0.799.gd6f94ed593-goog



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3] mm/hugetlb: Fix null nodemask in alloc_fresh_hugetlb_folio
  2026-07-05 17:51 [PATCH v3] mm/hugetlb: Fix null nodemask in alloc_fresh_hugetlb_folio Sourav Panda
@ 2026-07-05 19:04 ` Andrew Morton
  2026-07-06  6:17 ` Muchun Song
  1 sibling, 0 replies; 4+ messages in thread
From: Andrew Morton @ 2026-07-05 19:04 UTC (permalink / raw)
  To: Sourav Panda
  Cc: muchun.song, osalvador, david, surenb, fvdl, gthelen, linux-mm,
	linux-kernel

On Sun,  5 Jul 2026 17:51:19 +0000 Sourav Panda <souravpanda@google.com> wrote:

> alloc_buddy_hugetlb_folio_with_mpol() can pass a NULL nodemask to
> alloc_fresh_hugetlb_folio() as a fallback to allocate from all
> nodes. If order is gigantic, alloc_fresh_hugetlb_folio() propagates
> the NULL nodemask down to hugetlb_cma_alloc_frozen_folio() which blindly
> dereferences it in for_each_node_mask(), leading to a null pointer
> dereference.
> 
> Similarly, if the CMA allocation fails, the fallback
> alloc_contig_frozen_pages() is also called with a NULL nodemask,
> which may cause issues.
> 
> Fix this by explicitly checking if nodemask is NULL in
> alloc_fresh_hugetlb_folio() and defaulting to
> cpuset_current_mems_allowed. This ensures that both the CMA and
> contiguous allocators receive a valid nodemask safely using a seqcount
> loop to prevent torn reads.
> 
> From a userspace perspective, this bug allows an unprivileged user to
> crash the kernel (trigger a panic) by requesting a gigantic hugepage
> allocation with MPOL_PREFERRED_MANY on a system where CMA is only
> configured on a subset of NUMA nodes.

ow.

> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -1864,6 +1864,18 @@ static struct folio *alloc_fresh_hugetlb_folio(struct hstate *h,
>  		gfp_t gfp_mask, int nid, nodemask_t *nmask)
>  {
>  	struct folio *folio;
> +	nodemask_t local_node_mask;
> +
> +	if (!nmask) {
> +		unsigned int cpuset_mems_cookie;
> +
> +		do {
> +			cpuset_mems_cookie = read_mems_allowed_begin();
> +			local_node_mask = cpuset_current_mems_allowed;
> +		} while (read_mems_allowed_retry(cpuset_mems_cookie));
> +
> +		nmask = &local_node_mask;
> +	}

For my edification, is there anything which prevents
cpuset_current_mems_allowed from changing after it has been read?  So
we end up with a folio on an inappropriate node?  Or does that not
really matter much.


cpuset_current_mems_allowed is a nasty thing.  It looks like a simple
global variable, but appearances can be deceptive:

#ifdef ...
#define cpuset_current_mems_allowed (current->mems_allowed)
#else
#define cpuset_current_mems_allowed (node_states[N_MEMORY])
#endif


Thanks, I'll queue this for a bit of testing and shall await reviewer
input.



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v3] mm/hugetlb: Fix null nodemask in alloc_fresh_hugetlb_folio
  2026-07-05 17:51 [PATCH v3] mm/hugetlb: Fix null nodemask in alloc_fresh_hugetlb_folio Sourav Panda
  2026-07-05 19:04 ` Andrew Morton
@ 2026-07-06  6:17 ` Muchun Song
  2026-07-06  6:55   ` Sourav Panda
  1 sibling, 1 reply; 4+ messages in thread
From: Muchun Song @ 2026-07-06  6:17 UTC (permalink / raw)
  To: Sourav Panda
  Cc: osalvador, akpm, david, surenb, fvdl, gthelen, linux-mm,
	linux-kernel, Vlastimil Babka, Suren Baghdasaryan, Michal Hocko,
	Brendan Jackman, Johannes Weiner, Zi Yan



> On Jul 6, 2026, at 01:51, Sourav Panda <souravpanda@google.com> wrote:
> 
> alloc_buddy_hugetlb_folio_with_mpol() can pass a NULL nodemask to
> alloc_fresh_hugetlb_folio() as a fallback to allocate from all
> nodes. If order is gigantic, alloc_fresh_hugetlb_folio() propagates
> the NULL nodemask down to hugetlb_cma_alloc_frozen_folio() which blindly
> dereferences it in for_each_node_mask(), leading to a null pointer
> dereference.
> 
> Similarly, if the CMA allocation fails, the fallback
> alloc_contig_frozen_pages() is also called with a NULL nodemask,
> which may cause issues.
> 
> Fix this by explicitly checking if nodemask is NULL in
> alloc_fresh_hugetlb_folio() and defaulting to
> cpuset_current_mems_allowed. This ensures that both the CMA and
> contiguous allocators receive a valid nodemask safely using a seqcount
> loop to prevent torn reads.
> 
> From a userspace perspective, this bug allows an unprivileged user to
> crash the kernel (trigger a panic) by requesting a gigantic hugepage
> allocation with MPOL_PREFERRED_MANY on a system where CMA is only
> configured on a subset of NUMA nodes.
> 
> This can be reproduced by booting a VM with two NUMA nodes, restricting
> CMA to Node 1 (e.g., hugetlb_cma=1:1G default_hugepagesz=1G hugepagesz=1G
> hugepages=0), and running a program that allocates a 1GB hugepage area
> without reserving, restricts allocation to Node 0 using mbind() with
> MPOL_PREFERRED_MANY, and triggers a page fault:
> 
>  void *ptr = mmap(NULL, 1UL << 30, PROT_READ | PROT_WRITE,
>                   MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB |
>                   MAP_HUGE_1GB | MAP_NORESERVE, -1, 0);
>  unsigned long nodemask = 1; /* Node 0 */
>  mbind(ptr, 1UL << 30, MPOL_PREFERRED_MANY, &nodemask,
>        sizeof(nodemask) * 8, 0);
>  memset(ptr, 0, 1UL << 30); /* Trigger fault */
> 
> This results in a NULL pointer dereference:
> 
>  BUG: kernel NULL pointer dereference, address: 0000000000000000
>  #PF: supervisor read access in kernel mode
>  #PF: error_code(0x0000) - not-present page
>  Oops: Oops: 0000 [#1] SMP NOPTI
>  RIP: 0010:hugetlb_cma_alloc_frozen_folio+0x75/0x120
>  Call Trace:
>   <TASK>
>   only_alloc_fresh_hugetlb_folio.isra.0+0x2c/0x160
>   alloc_surplus_hugetlb_folio+0x6d/0x100
>   alloc_hugetlb_folio+0x3c5/0x660
>   hugetlb_no_page+0x3d9/0x650
> 
> Additionally, this patch adds a missing node_isset(nid, *nodemask) check
> in hugetlb_cma_alloc_frozen_folio() to ensure the initial node allocation
> attempt respects the memory policy.
> 
> Fixes: eb02f14c4a2b ("mm/hugetlb: allow overcommitting gigantic hugepages")
> Cc: stable@vger.kernel.org
> Signed-off-by: Sourav Panda <souravpanda@google.com>
> ---
> Changes in v3:
> - Condensed the reproducer and QEMU setup from v1 discussion into a readable summary per Andrew Morton.
> - Safely read cpuset_current_mems_allowed using a seqcount loop to prevent torn reads.
> - v2: https://lore.kernel.org/linux-mm/20260704174930.2885785-1-souravpanda@google.com/
> - v1: https://lore.kernel.org/linux-mm/20260702215713.627941-1-souravpanda@google.com/
> mm/hugetlb.c     | 12 ++++++++++++
> mm/hugetlb_cma.c |  2 +-
> 2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> index 571212b80835..ee67ea29c003 100644
> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -1864,6 +1864,18 @@ static struct folio *alloc_fresh_hugetlb_folio(struct hstate *h,
> gfp_t gfp_mask, int nid, nodemask_t *nmask)
> {
> 	struct folio *folio;
> + 	nodemask_t local_node_mask;
> +
> + 	if (!nmask) {
> + 		unsigned int cpuset_mems_cookie;
> +
> + 		do {
> + 			cpuset_mems_cookie = read_mems_allowed_begin();
> + 			local_node_mask = cpuset_current_mems_allowed;
> + 		} while (read_mems_allowed_retry(cpuset_mems_cookie));
> +
> + 		nmask = &local_node_mask;
> + 	}

As Andrew pointed it out, it is not helpful to prevent any false-positive
allocation failures. We need something like the following:

  seq = read_mems_allowed_begin();

  alloc_nodemask = nodemask;
  if (cpusets_enabled() && !alloc_nodemask)
        alloc_nodemask = &cpuset_current_mems_allowed;

  for_each_node_mask(node, alloc_nodemask) {
        if (cpusets_enabled() && nodemask &&
            !cpuset_zone_allowed(zone, gfp_mask))
                continue;

        ...
  }

  if (!page && read_mems_allowed_retry(seq))
        goto retry;


After further consideration, I believe we only need to fix
alloc_gigantic_frozen_folio(), as alloc_buddy_frozen_folio() already
handles the NULL nodemask properly via prepare_alloc_pages().

To address the issue in alloc_gigantic_frozen_folio(), we have two
potential options:

- Option 1: Fix it directly within alloc_gigantic_frozen_folio().
  This would centrally cover both of its underlying allocation paths:
  hugetlb_cma_alloc_frozen_folio() and alloc_contig_frozen_pages().

- Option 2: Fix hugetlb_cma_alloc_frozen_folio() and alloc_contig_frozen_pages()
  separately. The rationale here is that since the buddy allocator
  already handles this case internally, and alloc_contig_frozen_pages()
  is also a low-level allocator, it would be better to keep their behaviors
  consistent.

Both approaches are viable from my perspective. I'm CCing more MM maintainers
and reviewers to gather your insights and decide on the best path forward.

Muchun,
Thanks.

> 
> 	folio = only_alloc_fresh_hugetlb_folio(h, gfp_mask, nid, nmask, NULL);
> 	if (folio)
> diff --git a/mm/hugetlb_cma.c b/mm/hugetlb_cma.c
> index 39344d6c78d8..79dbd0baafa3 100644
> --- a/mm/hugetlb_cma.c
> +++ b/mm/hugetlb_cma.c
> @@ -34,7 +34,7 @@ struct folio *hugetlb_cma_alloc_frozen_folio(int order, gfp_t gfp_mask,
> 	if (!hugetlb_cma_size)
> 		return NULL;
> 
> - 	if (hugetlb_cma[nid])
> + 	if (hugetlb_cma[nid] && node_isset(nid, *nodemask))
> 		page = cma_alloc_frozen_compound(hugetlb_cma[nid], order);
> 
> 	if (!page && !(gfp_mask & __GFP_THISNODE)) {
> -- 
> 2.55.0.rc0.799.gd6f94ed593-goog
> 



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v3] mm/hugetlb: Fix null nodemask in alloc_fresh_hugetlb_folio
  2026-07-06  6:17 ` Muchun Song
@ 2026-07-06  6:55   ` Sourav Panda
  0 siblings, 0 replies; 4+ messages in thread
From: Sourav Panda @ 2026-07-06  6:55 UTC (permalink / raw)
  To: Muchun Song
  Cc: osalvador, akpm, david, fvdl, gthelen, linux-mm, linux-kernel,
	Vlastimil Babka, Suren Baghdasaryan, Michal Hocko,
	Brendan Jackman, Johannes Weiner, Zi Yan

On Sun, Jul 5, 2026 at 11:18 PM Muchun Song <muchun.song@linux.dev> wrote:
>
>
>
> > On Jul 6, 2026, at 01:51, Sourav Panda <souravpanda@google.com> wrote:
> >
> > alloc_buddy_hugetlb_folio_with_mpol() can pass a NULL nodemask to
> > alloc_fresh_hugetlb_folio() as a fallback to allocate from all
> > nodes. If order is gigantic, alloc_fresh_hugetlb_folio() propagates
> > the NULL nodemask down to hugetlb_cma_alloc_frozen_folio() which blindly
> > dereferences it in for_each_node_mask(), leading to a null pointer
> > dereference.
> >
> > Similarly, if the CMA allocation fails, the fallback
> > alloc_contig_frozen_pages() is also called with a NULL nodemask,
> > which may cause issues.
> >
> > Fix this by explicitly checking if nodemask is NULL in
> > alloc_fresh_hugetlb_folio() and defaulting to
> > cpuset_current_mems_allowed. This ensures that both the CMA and
> > contiguous allocators receive a valid nodemask safely using a seqcount
> > loop to prevent torn reads.
> >
> > From a userspace perspective, this bug allows an unprivileged user to
> > crash the kernel (trigger a panic) by requesting a gigantic hugepage
> > allocation with MPOL_PREFERRED_MANY on a system where CMA is only
> > configured on a subset of NUMA nodes.
> >
> > This can be reproduced by booting a VM with two NUMA nodes, restricting
> > CMA to Node 1 (e.g., hugetlb_cma=1:1G default_hugepagesz=1G hugepagesz=1G
> > hugepages=0), and running a program that allocates a 1GB hugepage area
> > without reserving, restricts allocation to Node 0 using mbind() with
> > MPOL_PREFERRED_MANY, and triggers a page fault:
> >
> >  void *ptr = mmap(NULL, 1UL << 30, PROT_READ | PROT_WRITE,
> >                   MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB |
> >                   MAP_HUGE_1GB | MAP_NORESERVE, -1, 0);
> >  unsigned long nodemask = 1; /* Node 0 */
> >  mbind(ptr, 1UL << 30, MPOL_PREFERRED_MANY, &nodemask,
> >        sizeof(nodemask) * 8, 0);
> >  memset(ptr, 0, 1UL << 30); /* Trigger fault */
> >
> > This results in a NULL pointer dereference:
> >
> >  BUG: kernel NULL pointer dereference, address: 0000000000000000
> >  #PF: supervisor read access in kernel mode
> >  #PF: error_code(0x0000) - not-present page
> >  Oops: Oops: 0000 [#1] SMP NOPTI
> >  RIP: 0010:hugetlb_cma_alloc_frozen_folio+0x75/0x120
> >  Call Trace:
> >   <TASK>
> >   only_alloc_fresh_hugetlb_folio.isra.0+0x2c/0x160
> >   alloc_surplus_hugetlb_folio+0x6d/0x100
> >   alloc_hugetlb_folio+0x3c5/0x660
> >   hugetlb_no_page+0x3d9/0x650
> >
> > Additionally, this patch adds a missing node_isset(nid, *nodemask) check
> > in hugetlb_cma_alloc_frozen_folio() to ensure the initial node allocation
> > attempt respects the memory policy.
> >
> > Fixes: eb02f14c4a2b ("mm/hugetlb: allow overcommitting gigantic hugepages")
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Sourav Panda <souravpanda@google.com>
> > ---
> > Changes in v3:
> > - Condensed the reproducer and QEMU setup from v1 discussion into a readable summary per Andrew Morton.
> > - Safely read cpuset_current_mems_allowed using a seqcount loop to prevent torn reads.
> > - v2: https://lore.kernel.org/linux-mm/20260704174930.2885785-1-souravpanda@google.com/
> > - v1: https://lore.kernel.org/linux-mm/20260702215713.627941-1-souravpanda@google.com/
> > mm/hugetlb.c     | 12 ++++++++++++
> > mm/hugetlb_cma.c |  2 +-
> > 2 files changed, 13 insertions(+), 1 deletion(-)
> >
> > diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> > index 571212b80835..ee67ea29c003 100644
> > --- a/mm/hugetlb.c
> > +++ b/mm/hugetlb.c
> > @@ -1864,6 +1864,18 @@ static struct folio *alloc_fresh_hugetlb_folio(struct hstate *h,
> > gfp_t gfp_mask, int nid, nodemask_t *nmask)
> > {
> >       struct folio *folio;
> > +     nodemask_t local_node_mask;
> > +
> > +     if (!nmask) {
> > +             unsigned int cpuset_mems_cookie;
> > +
> > +             do {
> > +                     cpuset_mems_cookie = read_mems_allowed_begin();
> > +                     local_node_mask = cpuset_current_mems_allowed;
> > +             } while (read_mems_allowed_retry(cpuset_mems_cookie));
> > +
> > +             nmask = &local_node_mask;
> > +     }
>
> As Andrew pointed it out, it is not helpful to prevent any false-positive
> allocation failures. We need something like the following:
>
>   seq = read_mems_allowed_begin();
>
>   alloc_nodemask = nodemask;
>   if (cpusets_enabled() && !alloc_nodemask)
>         alloc_nodemask = &cpuset_current_mems_allowed;
>
>   for_each_node_mask(node, alloc_nodemask) {
>         if (cpusets_enabled() && nodemask &&
>             !cpuset_zone_allowed(zone, gfp_mask))
>                 continue;
>
>         ...
>   }
>
>   if (!page && read_mems_allowed_retry(seq))
>         goto retry;
>
>
> After further consideration, I believe we only need to fix
> alloc_gigantic_frozen_folio(), as alloc_buddy_frozen_folio() already
> handles the NULL nodemask properly via prepare_alloc_pages().
>
> To address the issue in alloc_gigantic_frozen_folio(), we have two
> potential options:
>
> - Option 1: Fix it directly within alloc_gigantic_frozen_folio().
>   This would centrally cover both of its underlying allocation paths:
>   hugetlb_cma_alloc_frozen_folio() and alloc_contig_frozen_pages().
>
> - Option 2: Fix hugetlb_cma_alloc_frozen_folio() and alloc_contig_frozen_pages()
>   separately. The rationale here is that since the buddy allocator
>   already handles this case internally, and alloc_contig_frozen_pages()
>   is also a low-level allocator, it would be better to keep their behaviors
>   consistent.
>
> Both approaches are viable from my perspective. I'm CCing more MM maintainers
> and reviewers to gather your insights and decide on the best path forward.
>
> Muchun,
> Thanks.

Gotcha! Thanks Andrew and Muchun!

I shall wait for the decision and then send the subsequent version :)

With regards,
Sourav Panda

>
> >
> >       folio = only_alloc_fresh_hugetlb_folio(h, gfp_mask, nid, nmask, NULL);
> >       if (folio)
> > diff --git a/mm/hugetlb_cma.c b/mm/hugetlb_cma.c
> > index 39344d6c78d8..79dbd0baafa3 100644
> > --- a/mm/hugetlb_cma.c
> > +++ b/mm/hugetlb_cma.c
> > @@ -34,7 +34,7 @@ struct folio *hugetlb_cma_alloc_frozen_folio(int order, gfp_t gfp_mask,
> >       if (!hugetlb_cma_size)
> >               return NULL;
> >
> > -     if (hugetlb_cma[nid])
> > +     if (hugetlb_cma[nid] && node_isset(nid, *nodemask))
> >               page = cma_alloc_frozen_compound(hugetlb_cma[nid], order);
> >
> >       if (!page && !(gfp_mask & __GFP_THISNODE)) {
> > --
> > 2.55.0.rc0.799.gd6f94ed593-goog
> >
>


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-07-06  6:55 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-05 17:51 [PATCH v3] mm/hugetlb: Fix null nodemask in alloc_fresh_hugetlb_folio Sourav Panda
2026-07-05 19:04 ` Andrew Morton
2026-07-06  6:17 ` Muchun Song
2026-07-06  6:55   ` Sourav Panda

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox