* [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT
@ 2025-02-24 14:37 Raphael S. Carvalho
2025-02-24 14:45 ` Christoph Hellwig
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Raphael S. Carvalho @ 2025-02-24 14:37 UTC (permalink / raw)
To: linux-kernel, linux-xfs, linux-mm, linux-fsdevel
Cc: djwong, Dave Chinner, hch, willy, Raphael S. Carvalho
original report:
https://lore.kernel.org/all/CAKhLTr1UL3ePTpYjXOx2AJfNk8Ku2EdcEfu+CH1sf3Asr=B-Dw@mail.gmail.com/T/
When doing buffered writes with FGP_NOWAIT, under memory pressure, the system
returned ENOMEM despite there being plenty of available memory, to be reclaimed
from page cache. The user space used io_uring interface, which in turn submits
I/O with FGP_NOWAIT (the fast path).
retsnoop pointed to iomap_get_folio:
00:34:16.180612 -> 00:34:16.180651 TID/PID 253786/253721
(reactor-1/combined_tests):
entry_SYSCALL_64_after_hwframe+0x76
do_syscall_64+0x82
__do_sys_io_uring_enter+0x265
io_submit_sqes+0x209
io_issue_sqe+0x5b
io_write+0xdd
xfs_file_buffered_write+0x84
iomap_file_buffered_write+0x1a6
32us [-ENOMEM] iomap_write_begin+0x408
iter=&{.inode=0xffff8c67aa031138,.len=4096,.flags=33,.iomap={.addr=0xffffffffffffffff,.length=4096,.type=1,.flags=3,.bdev=0x…
pos=0 len=4096 foliop=0xffffb32c296b7b80
! 4us [-ENOMEM] iomap_get_folio
iter=&{.inode=0xffff8c67aa031138,.len=4096,.flags=33,.iomap={.addr=0xffffffffffffffff,.length=4096,.type=1,.flags=3,.bdev=0x…
pos=0 len=4096
This is likely a regression caused by 66dabbb65d67 ("mm: return an ERR_PTR
from __filemap_get_folio"), which moved error handling from
io_map_get_folio() to __filemap_get_folio(), but broke FGP_NOWAIT handling, so
ENOMEM is being escaped to user space. Had it correctly returned -EAGAIN with
NOWAIT, either io_uring or user space itself would be able to retry the
request.
It's not enough to patch io_uring since the iomap interface is the one
responsible for it, and pwritev2(RWF_NOWAIT) and AIO interfaces must return
the proper error too.
The patch was tested with scylladb test suite (its original reproducer), and
the tests all pass now when memory is pressured.
Fixes: 66dabbb65d67 ("mm: return an ERR_PTR from __filemap_get_folio")
Signed-off-by: Raphael S. Carvalho <raphaelsc@scylladb.com>
---
v3: make comment more descriptive as per hch's suggestion.
---
mm/filemap.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/mm/filemap.c b/mm/filemap.c
index 804d7365680c..3e75dced0fd9 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1986,8 +1986,19 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index,
if (err == -EEXIST)
goto repeat;
- if (err)
+ if (err) {
+ /*
+ * When NOWAIT I/O fails to allocate folios this could
+ * be due to a nonblocking memory allocation and not
+ * because the system actually is out of memory.
+ * Return -EAGAIN so that there caller retries in a
+ * blocking fashion instead of propagating -ENOMEM
+ * to the application.
+ */
+ if ((fgp_flags & FGP_NOWAIT) && err == -ENOMEM)
+ err = -EAGAIN;
return ERR_PTR(err);
+ }
/*
* filemap_add_folio locks the page, and for mmap
* we expect an unlocked page.
--
2.48.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT
2025-02-24 14:37 [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT Raphael S. Carvalho
@ 2025-02-24 14:45 ` Christoph Hellwig
2025-02-24 15:34 ` Matthew Wilcox
2025-02-25 20:25 ` Dave Chinner
2 siblings, 0 replies; 4+ messages in thread
From: Christoph Hellwig @ 2025-02-24 14:45 UTC (permalink / raw)
To: Raphael S. Carvalho
Cc: linux-kernel, linux-xfs, linux-mm, linux-fsdevel, djwong,
Dave Chinner, hch, willy
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT
2025-02-24 14:37 [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT Raphael S. Carvalho
2025-02-24 14:45 ` Christoph Hellwig
@ 2025-02-24 15:34 ` Matthew Wilcox
2025-02-25 20:25 ` Dave Chinner
2 siblings, 0 replies; 4+ messages in thread
From: Matthew Wilcox @ 2025-02-24 15:34 UTC (permalink / raw)
To: Raphael S. Carvalho
Cc: linux-kernel, linux-xfs, linux-mm, linux-fsdevel, djwong,
Dave Chinner, hch
On Mon, Feb 24, 2025 at 11:37:00AM -0300, Raphael S. Carvalho wrote:
Don't send out replacement patches this quickly. NAK.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT
2025-02-24 14:37 [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT Raphael S. Carvalho
2025-02-24 14:45 ` Christoph Hellwig
2025-02-24 15:34 ` Matthew Wilcox
@ 2025-02-25 20:25 ` Dave Chinner
2 siblings, 0 replies; 4+ messages in thread
From: Dave Chinner @ 2025-02-25 20:25 UTC (permalink / raw)
To: Raphael S. Carvalho
Cc: linux-kernel, linux-xfs, linux-mm, linux-fsdevel, djwong, hch, willy
On Mon, Feb 24, 2025 at 11:37:00AM -0300, Raphael S. Carvalho wrote:
> original report:
> https://lore.kernel.org/all/CAKhLTr1UL3ePTpYjXOx2AJfNk8Ku2EdcEfu+CH1sf3Asr=B-Dw@mail.gmail.com/T/
>
> When doing buffered writes with FGP_NOWAIT, under memory pressure, the system
> returned ENOMEM despite there being plenty of available memory, to be reclaimed
> from page cache. The user space used io_uring interface, which in turn submits
> I/O with FGP_NOWAIT (the fast path).
....
>
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 804d7365680c..3e75dced0fd9 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -1986,8 +1986,19 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index,
>
> if (err == -EEXIST)
> goto repeat;
> - if (err)
> + if (err) {
> + /*
> + * When NOWAIT I/O fails to allocate folios this could
> + * be due to a nonblocking memory allocation and not
> + * because the system actually is out of memory.
> + * Return -EAGAIN so that there caller retries in a
> + * blocking fashion instead of propagating -ENOMEM
> + * to the application.
> + */
> + if ((fgp_flags & FGP_NOWAIT) && err == -ENOMEM)
> + err = -EAGAIN;
> return ERR_PTR(err);
> + }
> /*
> * filemap_add_folio locks the page, and for mmap
> * we expect an unlocked page.
Looks good to me.
Reviewed-by: Dave Chinner <dchinner@redhat.com>
--
Dave Chinner
david@fromorbit.com
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-02-25 20:25 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-02-24 14:37 [PATCH v3] mm: Fix error handling in __filemap_get_folio() with FGP_NOWAIT Raphael S. Carvalho
2025-02-24 14:45 ` Christoph Hellwig
2025-02-24 15:34 ` Matthew Wilcox
2025-02-25 20:25 ` Dave Chinner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox