Re: [RFC PATCH 4/4] ublk_drv: support splice based read/write zero copy
From: Bernd Schubert
Date: Thu Nov 03 2022 - 18:29:17 EST
On 11/3/22 09:50, Ming Lei wrote:
Pass ublk block IO request pages to kernel backend IO handling code via
pipe, and request page copy can be avoided. So far, the existed
pipe/splice mechanism works for handling write request only.
The initial idea of using splice for zero copy is from Miklos and Stefan.
Read request's zero copy requires pipe's change to allow one read end to
produce buffers for another read end to consume. The added SPLICE_F_READ_TO_READ
flag is for supporting this feature.
READ is handled by sending IORING_OP_SPLICE with SPLICE_F_DIRECT |
SPLICE_F_READ_TO_READ. WRITE is handled by sending IORING_OP_SPLICE with
SPLICE_F_DIRECT. Kernel internal pipe is used for simplifying userspace,
meantime potential info leak could be avoided.
Sorry to ask, do you have an ublk branch that gives an example how to
use this?
I still have several things to fix in my branches, but I got basic fuse
uring with copies working. Adding back splice would be next after
posting rfc patches. My initial assumption was that I needed to
duplicate everything splice does into the fuse .uring_cmd handler -
obviously there is a better way with your patches.
This week I have a few days off, by end of next week or the week after I
might have patches in an rfc state (one thing I'm going to ask about is
how do I know what is the next CQE in the kernel handler - ublk does
this with tags through mq, but I don't understand yet where the tag is
increased and what the relation between tag and right CQE order is).
This got modeled a bit after ublk, but then diverged a bit.
https://github.com/aakefbs/linux/tree/fuse-uring
https://github.com/aakefbs/libfuse/tree/uring
(Again, the branches are not ready by any means for review yet).
Thanks,
Bernd