Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mm: return -ENOMEM for page-table allocation failure in insert_pages()
@ 2026-07-30  7:13 Avi Weiss
  2026-07-30  7:42 ` Lorenzo Stoakes (ARM)
  0 siblings, 1 reply; 5+ messages in thread
From: Avi Weiss @ 2026-07-30  7:13 UTC (permalink / raw)
  To: Andrew Morton
  Cc: David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Soheil Hassas Yeganeh, Arjun Roy, Eric Dumazet, linux-mm,
	linux-kernel, Avi Weiss

walk_to_pmd() returns NULL only when p4d_alloc(), pud_alloc(), or
pmd_alloc() fails. These are page-table allocation failures, but
insert_pages() currently reports them as -EFAULT.

Return -ENOMEM instead, consistent with the subsequent pte_alloc()
failure and with the single-page insert_page() path, which reports
failure of the same page-table allocation chain as -ENOMEM.

Address and range validation failures in vm_insert_pages() continue to
return -EFAULT. Keep the later -EFAULT return for
pte_offset_map_lock(), which is not an allocation failure.

Fixes: 8cd3984d81d5 ("mm/memory.c: add vm_insert_pages()")
Signed-off-by: Avi Weiss <thnkslprpt@gmail.com>
---
 mm/memory.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/memory.c b/mm/memory.c
index ff338c2abe92..d8eddca8e251 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2436,7 +2436,7 @@ static int insert_pages(struct vm_area_struct *vma, unsigned long addr,
 	unsigned long pages_to_write_in_pmd;
 	int ret;
 more:
-	ret = -EFAULT;
+	ret = -ENOMEM;
 	pmd = walk_to_pmd(mm, addr);
 	if (!pmd)
 		goto out;
-- 
2.43.0



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

* Re: [PATCH] mm: return -ENOMEM for page-table allocation failure in insert_pages()
  2026-07-30  7:13 [PATCH] mm: return -ENOMEM for page-table allocation failure in insert_pages() Avi Weiss
@ 2026-07-30  7:42 ` Lorenzo Stoakes (ARM)
  2026-07-30  7:43   ` Lorenzo Stoakes (ARM)
  2026-07-30  8:27   ` David Hildenbrand (Arm)
  0 siblings, 2 replies; 5+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-07-30  7:42 UTC (permalink / raw)
  To: Avi Weiss
  Cc: Andrew Morton, David Hildenbrand, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Soheil Hassas Yeganeh, Arjun Roy, Eric Dumazet, linux-mm,
	linux-kernel

On Thu, Jul 30, 2026 at 10:13:23AM +0300, Avi Weiss wrote:
> walk_to_pmd() returns NULL only when p4d_alloc(), pud_alloc(), or
> pmd_alloc() fails. These are page-table allocation failures, but
> insert_pages() currently reports them as -EFAULT.
>
> Return -ENOMEM instead, consistent with the subsequent pte_alloc()
> failure and with the single-page insert_page() path, which reports
> failure of the same page-table allocation chain as -ENOMEM.
>
> Address and range validation failures in vm_insert_pages() continue to
> return -EFAULT. Keep the later -EFAULT return for
> pte_offset_map_lock(), which is not an allocation failure.
>
> Fixes: 8cd3984d81d5 ("mm/memory.c: add vm_insert_pages()")

Hmm :)

This isn't really a fix. Anybody relying on this returning -ENOMEM
vs. -EFAULT here is in a state of sin anyway (unless you can point to
specific users who are broken).

Drop the tag.

> Signed-off-by: Avi Weiss <thnkslprpt@gmail.com>

This is correct, walk

> ---
>  mm/memory.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/mm/memory.c b/mm/memory.c
> index ff338c2abe92..d8eddca8e251 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -2436,7 +2436,7 @@ static int insert_pages(struct vm_area_struct *vma, unsigned long addr,
>  	unsigned long pages_to_write_in_pmd;
>  	int ret;
>  more:
> -	ret = -EFAULT;
> +	ret = -ENOMEM;
>  	pmd = walk_to_pmd(mm, addr);

walk_to_pmd() is horribly named, it's allocating... populate_to_pmd() would
be better can you rename it?

>  	if (!pmd)
>  		goto out;

Looking down:

	pages_to_write_in_pmd = min_t(unsigned long,
		remaining_pages_total, PTRS_PER_PTE - pte_index(addr));

	/* Allocate the PTE if necessary; takes PMD lock once only. */
	ret = -ENOMEM; <------------------------------ set it again?
	if (pte_alloc(mm, pmd))
		goto out;

The way this function is written is horrible in general, I hate 'preset default
return value' as a pattern.

So could you instead change it so the ret is set at the point of error, and
while you're at it rename ret to err, e.g.:

	int err = 0;

	...

	pmd = populate_to_pmd(mm, addr);
	if (!pmd) {
		err = -ENOMEM;
		goto out;
	}

etc.

Also ignoring pte_alloc()'s error code (which will be -ENOMEM anyway) and
setting manually is stupid further down so:

-	ret = -ENOMEM;
-	if (pte_alloc(mm, pmd))
-		goto out;
+	err = pte_alloc(mm, pmd);
+	if (err)
+		goto out;

Obviously:

		for (pte = start_pte; pte_idx < batch_size; ++pte, ++pte_idx) {
			int err = insert_page_in_batch_locked(vma, pte,
				addr, pages[curr_page_idx], prot);

->

		for (pte = start_pte; pte_idx < batch_size; ++pte, ++pte_idx) {
			err = ...

Remove horrible ret = err and ret = 0 assignment later.

All this would improve it a lot thanks! :)

> --
> 2.43.0
>

Cheers, Lorenzo


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

* Re: [PATCH] mm: return -ENOMEM for page-table allocation failure in insert_pages()
  2026-07-30  7:42 ` Lorenzo Stoakes (ARM)
@ 2026-07-30  7:43   ` Lorenzo Stoakes (ARM)
  2026-07-30  8:27   ` David Hildenbrand (Arm)
  1 sibling, 0 replies; 5+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-07-30  7:43 UTC (permalink / raw)
  To: Avi Weiss
  Cc: Andrew Morton, David Hildenbrand, Liam R. Howlett,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Soheil Hassas Yeganeh, Arjun Roy, Eric Dumazet, linux-mm,
	linux-kernel

On Thu, Jul 30, 2026 at 08:42:55AM +0100, Lorenzo Stoakes (ARM) wrote:
> On Thu, Jul 30, 2026 at 10:13:23AM +0300, Avi Weiss wrote:
> > walk_to_pmd() returns NULL only when p4d_alloc(), pud_alloc(), or
> > pmd_alloc() fails. These are page-table allocation failures, but
> > insert_pages() currently reports them as -EFAULT.
> >
> > Return -ENOMEM instead, consistent with the subsequent pte_alloc()
> > failure and with the single-page insert_page() path, which reports
> > failure of the same page-table allocation chain as -ENOMEM.
> >
> > Address and range validation failures in vm_insert_pages() continue to
> > return -EFAULT. Keep the later -EFAULT return for
> > pte_offset_map_lock(), which is not an allocation failure.
> >
> > Fixes: 8cd3984d81d5 ("mm/memory.c: add vm_insert_pages()")
>
> Hmm :)
>
> This isn't really a fix. Anybody relying on this returning -ENOMEM
> vs. -EFAULT here is in a state of sin anyway (unless you can point to
> specific users who are broken).
>
> Drop the tag.
>
> > Signed-off-by: Avi Weiss <thnkslprpt@gmail.com>
>
> This is correct, walk

Ugh incomplete thought :)

->

This is correct, the 'walk' can only fail due to failure to allocate.

Anyway I gave you a bunch of stuff to do here, respin once you've addressed all
that.

Cheers, Lorenzo


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

* Re: [PATCH] mm: return -ENOMEM for page-table allocation failure in insert_pages()
  2026-07-30  7:42 ` Lorenzo Stoakes (ARM)
  2026-07-30  7:43   ` Lorenzo Stoakes (ARM)
@ 2026-07-30  8:27   ` David Hildenbrand (Arm)
  2026-07-30  8:36     ` Lorenzo Stoakes (ARM)
  1 sibling, 1 reply; 5+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-30  8:27 UTC (permalink / raw)
  To: Lorenzo Stoakes (ARM), Avi Weiss
  Cc: Andrew Morton, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
	Suren Baghdasaryan, Michal Hocko, Soheil Hassas Yeganeh,
	Arjun Roy, Eric Dumazet, linux-mm, linux-kernel

On 7/30/26 09:42, Lorenzo Stoakes (ARM) wrote:
> On Thu, Jul 30, 2026 at 10:13:23AM +0300, Avi Weiss wrote:
>> walk_to_pmd() returns NULL only when p4d_alloc(), pud_alloc(), or
>> pmd_alloc() fails. These are page-table allocation failures, but
>> insert_pages() currently reports them as -EFAULT.
>>
>> Return -ENOMEM instead, consistent with the subsequent pte_alloc()
>> failure and with the single-page insert_page() path, which reports
>> failure of the same page-table allocation chain as -ENOMEM.
>>
>> Address and range validation failures in vm_insert_pages() continue to
>> return -EFAULT. Keep the later -EFAULT return for
>> pte_offset_map_lock(), which is not an allocation failure.
>>
>> Fixes: 8cd3984d81d5 ("mm/memory.c: add vm_insert_pages()")
> 
> Hmm :)
> 
> This isn't really a fix. Anybody relying on this returning -ENOMEM
> vs. -EFAULT here is in a state of sin anyway (unless you can point to
> specific users who are broken).

Agreed, I am missing the problem here?

-- 
Cheers,

David


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

* Re: [PATCH] mm: return -ENOMEM for page-table allocation failure in insert_pages()
  2026-07-30  8:27   ` David Hildenbrand (Arm)
@ 2026-07-30  8:36     ` Lorenzo Stoakes (ARM)
  0 siblings, 0 replies; 5+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-07-30  8:36 UTC (permalink / raw)
  To: David Hildenbrand (Arm)
  Cc: Avi Weiss, Andrew Morton, Liam R. Howlett, Vlastimil Babka,
	Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Soheil Hassas Yeganeh, Arjun Roy, Eric Dumazet, linux-mm,
	linux-kernel

On Thu, Jul 30, 2026 at 10:27:20AM +0200, David Hildenbrand (Arm) wrote:
> On 7/30/26 09:42, Lorenzo Stoakes (ARM) wrote:
> > On Thu, Jul 30, 2026 at 10:13:23AM +0300, Avi Weiss wrote:
> >> walk_to_pmd() returns NULL only when p4d_alloc(), pud_alloc(), or
> >> pmd_alloc() fails. These are page-table allocation failures, but
> >> insert_pages() currently reports them as -EFAULT.
> >>
> >> Return -ENOMEM instead, consistent with the subsequent pte_alloc()
> >> failure and with the single-page insert_page() path, which reports
> >> failure of the same page-table allocation chain as -ENOMEM.
> >>
> >> Address and range validation failures in vm_insert_pages() continue to
> >> return -EFAULT. Keep the later -EFAULT return for
> >> pte_offset_map_lock(), which is not an allocation failure.
> >>
> >> Fixes: 8cd3984d81d5 ("mm/memory.c: add vm_insert_pages()")
> >
> > Hmm :)
> >
> > This isn't really a fix. Anybody relying on this returning -ENOMEM
> > vs. -EFAULT here is in a state of sin anyway (unless you can point to
> > specific users who are broken).
>
> Agreed, I am missing the problem here?

Seems just a cleanup, I gave Avi some ideas ;) this function could do with
it.

>
> --
> Cheers,
>
> David

Cheers, Lorenzo


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

end of thread, other threads:[~2026-07-30  8:36 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-30  7:13 [PATCH] mm: return -ENOMEM for page-table allocation failure in insert_pages() Avi Weiss
2026-07-30  7:42 ` Lorenzo Stoakes (ARM)
2026-07-30  7:43   ` Lorenzo Stoakes (ARM)
2026-07-30  8:27   ` David Hildenbrand (Arm)
2026-07-30  8:36     ` Lorenzo Stoakes (ARM)

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