Hi all,
this series adds support to generate and verify integrity information
(aka T10 PI) in the file system, instead of the automatic below the
covers support that is currently used.
There two reasons for this:
a) to increase the protection enveloped. Right now this is just a
minor step from the bottom of the block layer to the file system,
but it is required to support io_uring integrity data passthrough in
the file system similar to the currently existing support for block
devices, which will follow next. It also allows the file system to
directly see the integrity error and act upon in, e.g. when using
RAID either integrated (as in btrfs) or by supporting reading
redundant copies through the block layer.
b) to make the PI processing more efficient. This is primarily a
concern for reads, where the block layer auto PI has to schedule a
work item for each bio, and the file system them has to do it again
for bounce buffering. Additionally the current iomap post-I/O
workqueue handling is a lot more efficient by supporting merging and
avoiding workqueue scheduling storms.
The implementation is based on refactoring the existing block layer PI
code to be reusable for this use case, and then adding relatively small
wrappers for the file system use case. These are then used in iomap
to implement the semantics, and wired up in XFS with a small amount of
glue code.
Compared to the baseline (iomap-bounce branch), this does not change
performance for writes, but increases read performance up to 15% for 4k
I/O, with the benefit decreasing with larger I/O sizes as even the
baseline maxes out the device quickly on my older enterprise SSD.
Anuj gupta also measured a large decrease in QD1 latency on an
Intel optane device for small I/O sizes, but also an increase for
very large ones.
The series is based on the for-7.0/block-stable-pages in Jens's tee.
Git tree:
git://git.infradead.org/users/hch/misc.git iomap-pi
Gitweb:
https://git.infradead.org/?p=users/hch/misc.git;a=shortlog;h=refs/heads/iomap-pi
Changes since v1:
- document usage of BI_ACT_*
- return the action from fs_bio_integrity_alloc and use it in
fs_bio_integrity_generation to be safe from misuse
- use the newly added BIO_MAX_SIZE
- rename bio_read_ops to xfs_bio_read_ops
- fix commit message and comment typos
Diffstat:
block/Makefile | 2
block/bio-integrity-auto.c | 80 +++---------------------
block/bio-integrity-fs.c | 81 +++++++++++++++++++++++++
block/bio-integrity.c | 64 +++++++++++++++++++
block/bio.c | 17 +++--
block/blk-mq.c | 6 +
block/blk-settings.c | 13 ----
block/blk.h | 6 +
block/t10-pi.c | 12 +--
drivers/nvdimm/btt.c | 6 +
fs/fuse/file.c | 5 -
fs/iomap/bio.c | 135 ++++++++++++++++++++++++++++--------------
fs/iomap/buffered-io.c | 8 +-
fs/iomap/direct-io.c | 15 ++++
fs/iomap/internal.h | 14 ++++
fs/iomap/ioend.c | 28 +++++++-
fs/xfs/xfs_aops.c | 49 ++++++++++++++-
fs/xfs/xfs_iomap.c | 9 +-
include/linux/bio-integrity.h | 12 ++-
include/linux/bio.h | 2
include/linux/blk-integrity.h | 28 +++++++-
include/linux/blkdev.h | 34 ++++++++--
include/linux/iomap.h | 20 +++++-
23 files changed, 465 insertions(+), 181 deletions(-)