[PATCH 0/4] io_uring: add IORING_OP_READ[WRITE]_SPLICE_BUF

Ming Lei
2023-02-10T15:33:32Z

Hello,

Add two OPs which buffer is retrieved via kernel splice for supporting
fuse/ublk zero copy.

The 1st patch enhances direct pipe & splice for moving pages in kernel,
so that the two added OPs won't be misused, and avoid potential security
hole.

The 2nd patch allows splice_direct_to_actor() caller to ignore signal
if the actor won't block and can be done in bound time.

The 3rd patch add the two OPs.

The 4th patch implements ublk's ->splice_read() for supporting
zero copy.

ublksrv(userspace):

https://github.com/ming1/ubdsrv/commits/io_uring_splice_buf

So far, only loop/null target implements zero copy in above branch:

ublk add -t loop -f $file -z
ublk add -t none -z

Basic FS/IO function is verified, mount/kernel building & fio
works fine, and big chunk IO(BS: 64k/512k) performance gets improved
obviously.

Any comment is welcome!

Ming Lei (4):
fs/splice: enhance direct pipe & splice for moving pages in kernel
fs/splice: allow to ignore signal in __splice_from_pipe
io_uring: add IORING_OP_READ[WRITE]_SPLICE_BUF
ublk_drv: support splice based read/write zero copy

drivers/block/ublk_drv.c | 169 +++++++++++++++++++++++++++++++--
fs/splice.c | 19 +++-
include/linux/pipe_fs_i.h | 10 ++
include/linux/splice.h | 23 +++++
include/uapi/linux/io_uring.h | 2 +
include/uapi/linux/ublk_cmd.h | 31 +++++-
io_uring/opdef.c | 37 ++++++++
io_uring/rw.c | 174 +++++++++++++++++++++++++++++++++-
io_uring/rw.h | 1 +
9 files changed, 456 insertions(+), 10 deletions(-)

--
2.31.1