Brian Song <hibrians...@gmail.com> writes: > This work provides an initial implementation of fuse-over-io_uring > support for QEMU export. According to the fuse-over-io_uring protocol > specification, the userspace side must create the same number of queues > as the number of CPUs (nr_cpu), just like the kernel. Currently, each > queue contains only a single SQE entry, which is used to validate the > correctness of the fuse-over-io_uring functionality. > > All FUSE read and write operations interact with the kernel via io > vectors embedded in the SQE entry during submission and CQE fetching. > The req_header and op_payload members of each entry are included as > parts of the io vector: req_header carries the FUSE operation header, > and op_payload carries the data payload, such as file attributes in a > getattr reply, file content in a read reply, or file content being > written to the FUSE client in a write operation. > > At present, multi-threading support is still incomplete. In addition, > handling connection termination and managing the "drained" state of a > FUSE block export in QEMU remain as pending work. > > Suggested-by: Kevin Wolf <kw...@redhat.com> > Suggested-by: Stefan Hajnoczi <stefa...@redhat.com> > Signed-off-by: Brian Song <hibrians...@gmail.com>
[...] > diff --git a/docs/tools/qemu-storage-daemon.rst > b/docs/tools/qemu-storage-daemon.rst > index 35ab2d7807..4ec0648e95 100644 > --- a/docs/tools/qemu-storage-daemon.rst > +++ b/docs/tools/qemu-storage-daemon.rst > @@ -78,7 +78,7 @@ Standard options: > .. option:: --export > [type=]nbd,id=<id>,node-name=<node-name>[,name=<export-name>][,writable=on|off][,bitmap=<name>] > --export > [type=]vhost-user-blk,id=<id>,node-name=<node-name>,addr.type=unix,addr.path=<socket-path>[,writable=on|off][,logical-block-size=<block-size>][,num-queues=<num-queues>] > --export > [type=]vhost-user-blk,id=<id>,node-name=<node-name>,addr.type=fd,addr.str=<fd>[,writable=on|off][,logical-block-size=<block-size>][,num-queues=<num-queues>] > - --export > [type=]fuse,id=<id>,node-name=<node-name>,mountpoint=<file>[,growable=on|off][,writable=on|off][,allow-other=on|off|auto] > + --export > [type=]fuse,id=<id>,node-name=<node-name>,mountpoint=<file>[,growable=on|off][,writable=on|off][,allow-other=on|off|auto][,uring=on|off] > --export > [type=]vduse-blk,id=<id>,node-name=<node-name>,name=<vduse-name>[,writable=on|off][,num-queues=<num-queues>][,queue-size=<queue-size>][,logical-block-size=<block-size>][,serial=<serial-number>] > > is a block export definition. ``node-name`` is the block node that should > be > @@ -111,7 +111,13 @@ Standard options: > that enabling this option as a non-root user requires enabling the > user_allow_other option in the global fuse.conf configuration file. > Setting > ``allow-other`` to auto (the default) will try enabling this option, and on > - error fall back to disabling it. > + error fall back to disabling it. Once ``uring`` is enabled > + (off by default), the initialization of FUSE-over-io_uring-related settings > + will be performed in the FUSE_INIT request handler. This setup bypasses > + the traditional /dev/fuse communication mechanism and instead uses io_uring > + for handling FUSE operations. > + > + Drop the additional blank lines, please. This is user-facing documentation. Do users care about "the FUSE_INIT request handler"? > > The ``vduse-blk`` export type takes a ``name`` (must be unique across the > host) > to create the VDUSE device. > diff --git a/qapi/block-export.json b/qapi/block-export.json > index 9ae703ad01..7d14f3f1ba 100644 > --- a/qapi/block-export.json > +++ b/qapi/block-export.json > @@ -184,12 +184,16 @@ > # mount the export with allow_other, and if that fails, try again > # without. (since 6.1; default: auto) > # > +# @uring: If we enable uring option, it will enable FUSE over io_uring > +# feature for QEMU FUSE export. (default: false) > +# Missing (since 10.2). Please format just like everywhere else: # @uring: If we enable uring option, it will enable FUSE over # io_uring feature for QEMU FUSE export. (default: false) Kernel documentation calls the thing "FUSE-over-io-uring": https://docs.kernel.org/filesystems/fuse-io-uring.html The text feels awkward. Here's my attempt: # @uring: Use FUSE-over-io-uring. (since 10.2; default: false) > # Since: 6.0 > ## > { 'struct': 'BlockExportOptionsFuse', > 'data': { 'mountpoint': 'str', > '*growable': 'bool', > - '*allow-other': 'FuseExportAllowOther' }, > + '*allow-other': 'FuseExportAllowOther', > + '*uring': 'bool' }, > 'if': 'CONFIG_FUSE' } > > ## [...]