
With Linux 7.3, IOmap has finished its conversion to an iterator model with moving to a single iomap_next() callback. With the change rather than every iteration seeing an indirect call, the compiler can turn it into a direct and therefore inlineable call.
This IOmap pull ends up also overcoming a bottleneck for small I/O on PCIe Gen5 NVMe SSD storage .
For end users what is exciting is the end result, as noted in the pull request for the EXT4 performance impact:
"This also adds a simple direct I/O path for small reads. On Gen5 NVMe the __iomap_dio_rw() dominates 4K random reads. The same single-core io_uring poll mode workload reaches ~3.2M IOPS against the raw block device but only ~1.92M through ext4 or XFS.
...
That takes ext4 from 1.92M to 2.19M IOPS in the original workload. fio shows around:
* 4% at libaio queue depths of 64 and up
* around 5% for io_uring
* up to 10% for io_uring poll mode at depth 256
on both ext4 and xfs."
Only those numbers were shown for EXT4 and XFS though this IOmap update has also been updated for Btrfs, EXT2, EROFS, F2FS, GFS2, HPFS, FUSE, exFAT, ZoneFS, NTFS, and NTFS3 file-systems.
Those interested in the work can see the details within this pull request that was merged yesterday as one of the early pulls in the Linux 7.3 cycle.