[PATCH RFC 0/1] block/export: FUSE-over-io_uring Support for QEMU FUSE Exports

Brian Song posted 1 patch 4 months ago
Failed in applying to current master (apply log)
block/export/fuse.c                  | 423 +++++++++++++++++++++++++--
docs/tools/qemu-storage-daemon.rst   |  10 +-
qapi/block-export.json               |   6 +-
storage-daemon/qemu-storage-daemon.c |   1 +
util/fdmon-io_uring.c                |   5 +-
5 files changed, 420 insertions(+), 25 deletions(-)
[PATCH RFC 0/1] block/export: FUSE-over-io_uring Support for QEMU FUSE Exports
Posted by Brian Song 4 months ago
This RFC patch represents an initial implementation of the FUSE-over- 
io_uring Exports idea proposed for Google Summer of Code (2025) under 
the QEMU community:
https://wiki.qemu.org/Google_Summer_of_Code_2025#FUSE-over-io_uring_exports

The implementation approach is primarily borrowed from how libfuse 
interacts with the kernel.

FUSE-over-io_uring (https://docs.kernel.org/next/filesystems/fuse-io- 
uring.html) has been officially merged into the Linux kernel. The idea 
is to replace the traditional /dev/fuse based communication with a more 
efficient io_uring-based approach. In this model, userspace registers 
io_uring SQEs via the FUSE_IO_URING_CMD_REGISTER opcode, and then waits 
for the kernel to forward FUSE requests as CQEs. These are processed by 
the FUSE exports implementation in userspace and then committed back to 
the kernel using FUSE_IO_URING_CMD_COMMIT_AND_FETCH.

To enable this feature in qemu-export-daemon, simply add the uring=on 
option to the export configuration.

As this patch is still in the RFC stage, it currently supports **only 
single thread**. Due to protocol requirements in FUSE-over-io_uring,
the number of FUSE threads must match the number of CPUs. Therefore,
this initial version only works on single-core VMs (i.e., QEMU started
with -smp 1) or single core machine.

Brian Song (1):
  block/export: FUSE-over-io_uring Support for QEMU FUSE Exports

 block/export/fuse.c                  | 423 +++++++++++++++++++++++++--
 docs/tools/qemu-storage-daemon.rst   |  10 +-
 qapi/block-export.json               |   6 +-
 storage-daemon/qemu-storage-daemon.c |   1 +
 util/fdmon-io_uring.c                |   5 +-
 5 files changed, 420 insertions(+), 25 deletions(-)

-- 
2.50.1
Re: [PATCH RFC 0/1] block/export: FUSE-over-io_uring Support for QEMU FUSE Exports
Posted by Stefan Hajnoczi 3 months, 3 weeks ago
On Wed, Jul 16, 2025 at 02:38:23PM -0400, Brian Song wrote:
> This RFC patch represents an initial implementation of the FUSE-over- 
> io_uring Exports idea proposed for Google Summer of Code (2025) under 
> the QEMU community:
> https://wiki.qemu.org/Google_Summer_of_Code_2025#FUSE-over-io_uring_exports
> 
> The implementation approach is primarily borrowed from how libfuse 
> interacts with the kernel.
> 
> FUSE-over-io_uring (https://docs.kernel.org/next/filesystems/fuse-io- 
> uring.html) has been officially merged into the Linux kernel. The idea 
> is to replace the traditional /dev/fuse based communication with a more 
> efficient io_uring-based approach. In this model, userspace registers 
> io_uring SQEs via the FUSE_IO_URING_CMD_REGISTER opcode, and then waits 
> for the kernel to forward FUSE requests as CQEs. These are processed by 
> the FUSE exports implementation in userspace and then committed back to 
> the kernel using FUSE_IO_URING_CMD_COMMIT_AND_FETCH.
> 
> To enable this feature in qemu-export-daemon, simply add the uring=on 
> option to the export configuration.

For consistency with the --blockdev file,aio=io_uring option, please
name it "io_uring=on" instead of "uring=on".

> 
> As this patch is still in the RFC stage, it currently supports **only 
> single thread**. Due to protocol requirements in FUSE-over-io_uring,
> the number of FUSE threads must match the number of CPUs. Therefore,
> this initial version only works on single-core VMs (i.e., QEMU started
> with -smp 1) or single core machine.
> 
> Brian Song (1):
>   block/export: FUSE-over-io_uring Support for QEMU FUSE Exports
> 
>  block/export/fuse.c                  | 423 +++++++++++++++++++++++++--
>  docs/tools/qemu-storage-daemon.rst   |  10 +-
>  qapi/block-export.json               |   6 +-
>  storage-daemon/qemu-storage-daemon.c |   1 +
>  util/fdmon-io_uring.c                |   5 +-
>  5 files changed, 420 insertions(+), 25 deletions(-)
> 
> -- 
> 2.50.1
> 
Re: [PATCH RFC 0/1] block/export: FUSE-over-io_uring Support for QEMU FUSE Exports
Posted by Brian Song 3 months, 3 weeks ago
On 7/20/25 12:13 PM, Stefan Hajnoczi wrote:
> On Wed, Jul 16, 2025 at 02:38:23PM -0400, Brian Song wrote:
>> This RFC patch represents an initial implementation of the FUSE-over-
>> io_uring Exports idea proposed for Google Summer of Code (2025) under
>> the QEMU community:
>> https://wiki.qemu.org/Google_Summer_of_Code_2025#FUSE-over-io_uring_exports
>>
>> The implementation approach is primarily borrowed from how libfuse
>> interacts with the kernel.
>>
>> FUSE-over-io_uring (https://docs.kernel.org/next/filesystems/fuse-io-
>> uring.html) has been officially merged into the Linux kernel. The idea
>> is to replace the traditional /dev/fuse based communication with a more
>> efficient io_uring-based approach. In this model, userspace registers
>> io_uring SQEs via the FUSE_IO_URING_CMD_REGISTER opcode, and then waits
>> for the kernel to forward FUSE requests as CQEs. These are processed by
>> the FUSE exports implementation in userspace and then committed back to
>> the kernel using FUSE_IO_URING_CMD_COMMIT_AND_FETCH.
>>
>> To enable this feature in qemu-export-daemon, simply add the uring=on
>> option to the export configuration.
>
> For consistency with the --blockdev file,aio=io_uring option, please
> name it "io_uring=on" instead of "uring=on".
>

It seems we are not allowed to use '_' here.

In file included from ../storage-daemon/qapi/qapi-schema.json:57:

../storage-daemon/qapi/../../qapi/block-export.json: In struct
'BlockExportOptionsFuse':

../storage-daemon/qapi/../../qapi/block-export.json:191: name of 'data'
member '*io_uring' must not use uppercase or '_'


>>
>> As this patch is still in the RFC stage, it currently supports **only
>> single thread**. Due to protocol requirements in FUSE-over-io_uring,
>> the number of FUSE threads must match the number of CPUs. Therefore,
>> this initial version only works on single-core VMs (i.e., QEMU started
>> with -smp 1) or single core machine.
>>
>> Brian Song (1):
>>    block/export: FUSE-over-io_uring Support for QEMU FUSE Exports
>>
>>   block/export/fuse.c                  | 423 +++++++++++++++++++++++++--
>>   docs/tools/qemu-storage-daemon.rst   |  10 +-
>>   qapi/block-export.json               |   6 +-
>>   storage-daemon/qemu-storage-daemon.c |   1 +
>>   util/fdmon-io_uring.c                |   5 +-
>>   5 files changed, 420 insertions(+), 25 deletions(-)
>>
>> --
>> 2.50.1
>>
Re: [PATCH RFC 0/1] block/export: FUSE-over-io_uring Support for QEMU FUSE Exports
Posted by Stefan Hajnoczi 3 months, 3 weeks ago
On Tue, Jul 22, 2025 at 08:00:00AM -0400, Brian Song wrote:
> On 7/20/25 12:13 PM, Stefan Hajnoczi wrote:
> > On Wed, Jul 16, 2025 at 02:38:23PM -0400, Brian Song wrote:
> >> This RFC patch represents an initial implementation of the FUSE-over-
> >> io_uring Exports idea proposed for Google Summer of Code (2025) under
> >> the QEMU community:
> >> https://wiki.qemu.org/Google_Summer_of_Code_2025#FUSE-over-io_uring_exports
> >>
> >> The implementation approach is primarily borrowed from how libfuse
> >> interacts with the kernel.
> >>
> >> FUSE-over-io_uring (https://docs.kernel.org/next/filesystems/fuse-io-
> >> uring.html) has been officially merged into the Linux kernel. The idea
> >> is to replace the traditional /dev/fuse based communication with a more
> >> efficient io_uring-based approach. In this model, userspace registers
> >> io_uring SQEs via the FUSE_IO_URING_CMD_REGISTER opcode, and then waits
> >> for the kernel to forward FUSE requests as CQEs. These are processed by
> >> the FUSE exports implementation in userspace and then committed back to
> >> the kernel using FUSE_IO_URING_CMD_COMMIT_AND_FETCH.
> >>
> >> To enable this feature in qemu-export-daemon, simply add the uring=on
> >> option to the export configuration.
> >
> > For consistency with the --blockdev file,aio=io_uring option, please
> > name it "io_uring=on" instead of "uring=on".
> >
> 
> It seems we are not allowed to use '_' here.
> 
> In file included from ../storage-daemon/qapi/qapi-schema.json:57:
> 
> ../storage-daemon/qapi/../../qapi/block-export.json: In struct
> 'BlockExportOptionsFuse':
> 
> ../storage-daemon/qapi/../../qapi/block-export.json:191: name of 'data'
> member '*io_uring' must not use uppercase or '_'

Then "-" is fine, but please use "io<separator>uring" so it is as close
as possible (not "uring", "iouring", etc).

Thanks,
Stefan

> 
> 
> >>
> >> As this patch is still in the RFC stage, it currently supports **only
> >> single thread**. Due to protocol requirements in FUSE-over-io_uring,
> >> the number of FUSE threads must match the number of CPUs. Therefore,
> >> this initial version only works on single-core VMs (i.e., QEMU started
> >> with -smp 1) or single core machine.
> >>
> >> Brian Song (1):
> >>    block/export: FUSE-over-io_uring Support for QEMU FUSE Exports
> >>
> >>   block/export/fuse.c                  | 423 +++++++++++++++++++++++++--
> >>   docs/tools/qemu-storage-daemon.rst   |  10 +-
> >>   qapi/block-export.json               |   6 +-
> >>   storage-daemon/qemu-storage-daemon.c |   1 +
> >>   util/fdmon-io_uring.c                |   5 +-
> >>   5 files changed, 420 insertions(+), 25 deletions(-)
> >>
> >> --
> >> 2.50.1
> >>
>