On Mon, Jun 12, 2023 at 09:58:54PM -0700, Christoph Hellwig wrote: > On Mon, Jun 12, 2023 at 09:39:10PM +0100, Matthew Wilcox (Oracle) wrote: > > If we have a large folio, we can copy in larger chunks than PAGE_SIZE. > > Start at the maximum page cache size and shrink by half every time we > > hit the "we are short on memory" problem. > > > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > > --- > > fs/iomap/buffered-io.c | 22 +++++++++++++--------- > > 1 file changed, 13 insertions(+), 9 deletions(-) > > > > diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c > > index a5d62c9640cf..818dc350ffc5 100644 > > --- a/fs/iomap/buffered-io.c > > +++ b/fs/iomap/buffered-io.c > > @@ -768,6 +768,7 @@ static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len, > > static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i) > > { > > loff_t length = iomap_length(iter); > > + size_t chunk = PAGE_SIZE << MAX_PAGECACHE_ORDER; > > This could overflow if the chunk size ends up bigger than 4GB, but > I guess that's mostly theoretical. I don't think it can ... we currently restrict it to PMD_SIZE if THP are enabled and order-8 if they're not. I could add a MAX_PAGECACHE_SIZE if needed, but PAGE_SIZE is 'unsigned long' on most if not all platforms, so it's always the same size as size_t. We definitely can't create folios larger than size_t, so MAX_PAGECACHE_ORDER is never going to be defined such that PAGE_SIZE << MAX_PAGECACHE_ORDER cannot fit in size_t. The largest I can see it going would be on something like PowerPC with its 16GB page size, and there we definitely have 1UL << PAGE_SHIFT. > > - copied = copy_page_from_iter_atomic(page, offset, bytes, i); > > + copied = copy_page_from_iter_atomic(&folio->page, offset, bytes, i); > > Would be nice t avoid the overly long line here The plan is to turn that into: copied = copy_folio_from_iter_atomic(folio, offset, bytes, i); in the fairly near future. > Otherwise looks good: > > Reviewed-by: Christoph Hellwig <hch@xxxxxx> Thanks!