From: Zhang Yi <yi.zhang@xxxxxxxxxx> Hello! Since almost all of the code paths in ext4 have already been converted to use folios, there isn't much additional work required to support large folios. This series completes the remaining work and enables large folios for regular files on ext4, with the exception of fsverity, fscrypt, and data=journal mode. This series is based on 6.12, primarily modifies the block offset and length calculations within a single folio in the buffer write, buffer read, zero range, writeback, and move extents paths to support large folios, without further code refactoring or optimization. Please note that this series conflicts with the online journal data mode conversion on active inodes, this may requires further discussion, please refer to the last patch for details. Unlike my other series[1], which enables large folios by converting the buffered I/O path from the classic buffer_head to iomap, this large folio support solution requires fewer modifications and has fewer limitations at the moment. We can enable it by default and use it until ext4 switches to iomap. This series have passed kvm-xfstests in auto mode several times, every thing looks fine, any comments are welcome. About performance: I used the same test script from my IOMAP series (need to drop the mount opts parameter MOUNT_OPT) [2], run fio tests on the same machine with Intel Xeon Gold 6240 CPU with 400GB system ram, 200GB ramdisk and 4TB nvme ssd disk. Both compared with the base and the IOMAP + large folio changes. == buffer read == base iomap+large folio base+large folio type bs IOPS BW(M/s) IOPS BW(M/s) IOPS BW(M/s) ---------------------------------------------------------------- hole 4K | 576k 2253 | 762k 2975(+32%) | 747k 2918(+29%) hole 64K | 48.7k 3043 | 77.8k 4860(+60%) | 76.3k 4767(+57%) hole 1M | 2960 2960 | 4942 4942(+67%) | 4737 4738(+60%) ramdisk 4K | 443k 1732 | 530k 2069(+19%) | 494k 1930(+11%) ramdisk 64K | 34.5k 2156 | 45.6k 2850(+32%) | 41.3k 2584(+20%) ramdisk 1M | 2093 2093 | 2841 2841(+36%) | 2585 2586(+24%) nvme 4K | 339k 1323 | 364k 1425(+8%) | 344k 1341(+1%) nvme 64K | 23.6k 1471 | 25.2k 1574(+7%) | 25.4k 1586(+8%) nvme 1M | 2012 2012 | 2153 2153(+7%) | 2122 2122(+5%) == buffer write == O: Overwrite; S: Sync; W: Writeback base iomap+large folio base+large folio type O S W bs IOPS BW IOPS BW(M/s) IOPS BW(M/s) ---------------------------------------------------------------------- cache N N N 4K | 417k 1631 | 440k 1719 (+5%) | 423k 1655 (+2%) cache N N N 64K | 33.4k 2088 | 81.5k 5092 (+144%) | 59.1k 3690 (+77%) cache N N N 1M | 2143 2143 | 5716 5716 (+167%) | 3901 3901 (+82%) cache Y N N 4K | 449k 1755 | 469k 1834 (+5%) | 452k 1767 (+1%) cache Y N N 64K | 36.6k 2290 | 82.3k 5142 (+125%) | 67.2k 4200 (+83%) cache Y N N 1M | 2352 2352 | 5577 5577 (+137% | 4275 4276 (+82%) ramdisk N N Y 4K | 365k 1424 | 354k 1384 (-3%) | 372k 1449 (+2%) ramdisk N N Y 64K | 31.2k 1950 | 74.2k 4640 (+138%) | 56.4k 3528 (+81%) ramdisk N N Y 1M | 1968 1968 | 5201 5201 (+164%) | 3814 3814 (+94%) ramdisk N Y N 4K | 9984 39 | 12.9k 51 (+29%) | 9871 39 (-1%) ramdisk N Y N 64K | 5936 371 | 8960 560 (+51%) | 6320 395 (+6%) ramdisk N Y N 1M | 1050 1050 | 1835 1835 (+75%) | 1656 1657 (+58%) ramdisk Y N Y 4K | 411k 1609 | 443k 1731 (+8%) | 441k 1723 (+7%) ramdisk Y N Y 64K | 34.1k 2134 | 77.5k 4844 (+127%) | 66.4k 4151 (+95%) ramdisk Y N Y 1M | 2248 2248 | 5372 5372 (+139%) | 4209 4210 (+87%) ramdisk Y Y N 4K | 182k 711 | 186k 730 (+3%) | 182k 711 (0%) ramdisk Y Y N 64K | 18.7k 1170 | 34.7k 2171 (+86%) | 31.5k 1969 (+68%) ramdisk Y Y N 1M | 1229 1229 | 2269 2269 (+85%) | 1943 1944 (+58%) nvme N N Y 4K | 373k 1458 | 387k 1512 (+4%) | 399k 1559 (+7%) nvme N N Y 64K | 29.2k 1827 | 70.9k 4431 (+143%) | 54.3k 3390 (+86%) nvme N N Y 1M | 1835 1835 | 4919 4919 (+168%) | 3658 3658 (+99%) nvme N Y N 4K | 11.7k 46 | 11.7k 46 (0%) | 11.5k 45 (-1%) nvme N Y N 64K | 6453 403 | 8661 541 (+34%) | 7520 470 (+17%) nvme N Y N 1M | 649 649 | 1351 1351 (+108%) | 885 886 (+37%) nvme Y N Y 4K | 372k 1456 | 433k 1693 (+16%) | 419k 1637 (+12%) nvme Y N Y 64K | 33.0k 2064 | 74.7k 4669 (+126%) | 64.1k 4010 (+94%) nvme Y N Y 1M | 2131 2131 | 5273 5273 (+147%) | 4259 4260 (+100%) nvme Y Y N 4K | 56.7k 222 | 56.4k 220 (-1%) | 59.4k 232 (+5%) nvme Y Y N 64K | 13.4k 840 | 19.4k 1214 (+45%) | 18.5k 1156 (+38%) nvme Y Y N 1M | 714 714 | 1504 1504 (+111%) | 1319 1320 (+85%) [1] https://lore.kernel.org/linux-ext4/20241022111059.2566137-1-yi.zhang@xxxxxxxxxxxxxxx/ [2] https://lore.kernel.org/linux-ext4/3c01efe6-007a-4422-ad79-0bad3af281b1@xxxxxxxxxxxxxxx/ Thanks, Yi. Zhang Yi (9): fs: make block_read_full_folio() support large folio ext4: make ext4_mpage_readpages() support large folios ext4: make regular file's buffered write path support large folios ext4: make __ext4_block_zero_page_range() support large folio ext4/jbd2: convert jbd2_journal_blocks_per_page() to support large folio ext4: correct the journal credits calculations of allocating blocks ext4: make the writeback path support large folios ext4: make online defragmentation support large folios ext4: enable large folio for regular file fs/buffer.c | 34 ++++++++++---------- fs/ext4/ext4.h | 1 + fs/ext4/ext4_jbd2.c | 3 +- fs/ext4/ext4_jbd2.h | 4 +-- fs/ext4/extents.c | 5 +-- fs/ext4/ialloc.c | 3 ++ fs/ext4/inode.c | 72 ++++++++++++++++++++++++++++++------------- fs/ext4/move_extent.c | 11 +++---- fs/ext4/readpage.c | 28 ++++++++++------- fs/jbd2/journal.c | 7 +++-- include/linux/jbd2.h | 2 +- 11 files changed, 105 insertions(+), 65 deletions(-) -- 2.46.1