[PATCH 0/5] block: another block copy offload

Keith Busch
2025-05-21T22:31:28Z

From: Keith Busch <kbusch@kernel.org>

I was never happy with previous block copy offload attempts, so I had to
take a stab at it. And I was recently asked to take a look at this, so
here goes.

Some key implementation differences from previous approaches:

1. Only one bio is needed to describe a copy request, so no plugging
or dispatch tricks required. Like read and write requests, these
can be artbitrarily large and will be split as needed based on the
request_queue's limits. The bio's are mergeable with other copy
commands on adjacent destination sectors.

2. You can describe as many source sectors as you want in a vector in
a single bio. This aligns with the nvme protocol's Copy implementation,
which can be used to efficiently defragment scattered blocks into a
contiguous destination with a single command.

Oh, and the nvme-target support was included with this patchset too, so
there's a purely in-kernel way to test out the code paths if you don't
have otherwise capable hardware. I also used qemu since that nvme device
supports copy offload too.

Keith Busch (5):
block: new sector copy api
block: add support for copy offload
nvme: add support for copy offload
block: add support for vectored copies
nvmet: implement copy support for bdev backed target

block/bio.c | 25 +++++++
block/blk-core.c | 4 ++
block/blk-lib.c | 115 ++++++++++++++++++++++++++++++
block/blk-merge.c | 28 +++++++-
block/blk-sysfs.c | 9 +++
block/blk.h | 17 ++++-
block/ioctl.c | 89 +++++++++++++++++++++++
drivers/nvme/host/core.c | 61 ++++++++++++++++
drivers/nvme/target/io-cmd-bdev.c | 52 ++++++++++++++
include/linux/bio.h | 20 ++++++
include/linux/blk-mq.h | 5 ++
include/linux/blk_types.h | 2 +
include/linux/blkdev.h | 18 +++++
include/linux/bvec.h | 68 +++++++++++++++++-
include/linux/nvme.h | 42 ++++++++++-
include/uapi/linux/fs.h | 17 +++++
16 files changed, 566 insertions(+), 6 deletions(-)

--
2.47.1