Re: [PATCH v3 0/8] Create large folios in iomap buffered write path

Wang Yugui
2023-06-21T12:03:36Z

Hi,

> Commit ebb7fb1557b1 limited the length of ioend chains to 4096 entries
> to improve worst-case latency. Unfortunately, this had the effect of
> limiting the performance of:
>
> fio -name write-bandwidth -rw=write -bs=1024Ki -size=32Gi -runtime=30 \
> -iodepth 1 -ioengine sync -zero_buffers=1 -direct=0 -end_fsync=1 \
> -numjobs=4 -directory=/mnt/test
>
> The problem ends up being lock contention on the i_pages spinlock as we
> clear the writeback bit on each folio (and propagate that up through
> the tree). By using larger folios, we decrease the number of folios
> to be processed by a factor of 256 for this benchmark, eliminating the
> lock contention.
>
> It's also the right thing to do. This is a project that has been on
> the back burner for years, it just hasn't been important enough to do
> before now.
>
> I think it's probably best if this goes through the iomap tree since
> the changes outside iomap are either to the page cache or they're
> trivial.
>
> v3:
> - Fix the handling of compound highmem pages in copy_page_from_iter_atomic()
> - Rename fgp_t to fgf_t
> - Clarify some wording in the documentation

This v3 patches broken linux 6.4-rc7.

fstests(btrfs/007 and more) will fail with the v3 patches .
but it works well without the v3 patches.

Best Regards
Wang Yugui (wangyugui@e16-tech.com)
2023/06/21

> v2:
> - Fix misplaced semicolon
> - Rename fgp_order to fgp_set_order
> - Rename FGP_ORDER to FGP_GET_ORDER
> - Add fgp_t
> - Update the documentation for ->release_folio
> - Fix iomap_invalidate_folio()
> - Update iomap_release_folio()
>
> Matthew Wilcox (Oracle) (8):
> iov_iter: Handle compound highmem pages in
> copy_page_from_iter_atomic()
> iomap: Remove large folio handling in iomap_invalidate_folio()
> doc: Correct the description of ->release_folio
> iomap: Remove unnecessary test from iomap_release_folio()
> filemap: Add fgf_t typedef
> filemap: Allow __filemap_get_folio to allocate large folios
> iomap: Create large folios in the buffered write path
> iomap: Copy larger chunks from userspace
>
> Documentation/filesystems/locking.rst | 15 ++++--
> fs/btrfs/file.c | 6 +--
> fs/f2fs/compress.c | 2 +-
> fs/f2fs/f2fs.h | 2 +-
> fs/gfs2/bmap.c | 2 +-
> fs/iomap/buffered-io.c | 43 ++++++++--------
> include/linux/iomap.h | 2 +-
> include/linux/pagemap.h | 71 ++++++++++++++++++++++-----
> lib/iov_iter.c | 43 ++++++++++------
> mm/filemap.c | 61 ++++++++++++-----------
> mm/folio-compat.c | 2 +-
> mm/readahead.c | 13 -----
> 12 files changed, 159 insertions(+), 103 deletions(-)
>
> --
> 2.39.2