Internships/ProjectIdeas/FUSEUringCmd: Difference between revisions

From QEMU
(Created page with "== FUSE-over-io_uring == '''Summary:''' Extend QEMU's FUSE export type with FUSE-over-io_uring support FUSE-over-io_uring is a new high-performance interface for Filesystem in Userspace (FUSE) servers. The FUSE kernel code has added uring_cmd support so that FUSE servers can send and receive data directly over io_uring instead of reading/writing from/to the FUSE device. This reduces the number of system calls, as well as allowing for batching and polling, so that CPU o...")
 
Line 1: Line 1:
== FUSE-over-io_uring ==
== FUSE-over-io_uring exports ==


'''Summary:''' Extend QEMU's FUSE export type with FUSE-over-io_uring support
'''Expected outcome:''' Extend QEMU's FUSE export type with FUSE-over-io_uring support


FUSE-over-io_uring is a new high-performance interface for Filesystem in Userspace (FUSE) servers. The FUSE kernel code has added uring_cmd support so that FUSE servers can send and receive data directly over io_uring instead of reading/writing from/to the FUSE device. This reduces the number of system calls, as well as allowing for batching and polling, so that CPU overhead should be reduced.
FUSE-over-io_uring is a new high-performance interface for Filesystem in Userspace (FUSE) servers. The FUSE kernel code has added uring_cmd support so that FUSE servers can send and receive data directly over io_uring instead of reading/writing from/to the FUSE device. This reduces the number of system calls, as well as allowing for batching and polling, so that CPU overhead should be reduced.
Line 7: Line 7:
QEMU's FUSE export type presents a file containing the contents of a disk image. This is a convenient way of using tools like fdisk(1) or dd(1) on a non-raw disk image file, like qcow2, that these tools would otherwise not be able to operate on. The current FUSE export implementation uses libfuse's FUSE device file descriptor handling APIs (fuse_session_fd(), fuse_session_receive_buf(), etc) to read(2)/write(2) in the traditional way.
QEMU's FUSE export type presents a file containing the contents of a disk image. This is a convenient way of using tools like fdisk(1) or dd(1) on a non-raw disk image file, like qcow2, that these tools would otherwise not be able to operate on. The current FUSE export implementation uses libfuse's FUSE device file descriptor handling APIs (fuse_session_fd(), fuse_session_receive_buf(), etc) to read(2)/write(2) in the traditional way.


Your task is to add FUSE-over-io_uring support as an alternative mode on systems where FUSE-over-io_uring is available. This will involve not just using new libfuse APIs for processing I/O requests via io_uring, but also modifying the QEMU FUSE export code to support multiple in-flight requests and request processing in multiple IOThreads. An I/O benchmark like fio(1) can be used to measure the performance effects of your new FUSE-over-io_uring implementation.
Your task is to add FUSE-over-io_uring support as an alternative mode on systems where FUSE-over-io_uring is available.
 
'''Tasks:'''
* Integrate libfuse's FUSE-over-io_uring mode into the QEMU FUSE export
* Add support for multiple in-flight requests
* Benchmark with and without FUSE-over-io_uring using the fio(1) tool
* Add support support multiple IOThreads


'''Links:'''
'''Links:'''

Revision as of 14:28, 10 February 2025

FUSE-over-io_uring exports

Expected outcome: Extend QEMU's FUSE export type with FUSE-over-io_uring support

FUSE-over-io_uring is a new high-performance interface for Filesystem in Userspace (FUSE) servers. The FUSE kernel code has added uring_cmd support so that FUSE servers can send and receive data directly over io_uring instead of reading/writing from/to the FUSE device. This reduces the number of system calls, as well as allowing for batching and polling, so that CPU overhead should be reduced.

QEMU's FUSE export type presents a file containing the contents of a disk image. This is a convenient way of using tools like fdisk(1) or dd(1) on a non-raw disk image file, like qcow2, that these tools would otherwise not be able to operate on. The current FUSE export implementation uses libfuse's FUSE device file descriptor handling APIs (fuse_session_fd(), fuse_session_receive_buf(), etc) to read(2)/write(2) in the traditional way.

Your task is to add FUSE-over-io_uring support as an alternative mode on systems where FUSE-over-io_uring is available.

Tasks:

  • Integrate libfuse's FUSE-over-io_uring mode into the QEMU FUSE export
  • Add support for multiple in-flight requests
  • Benchmark with and without FUSE-over-io_uring using the fio(1) tool
  • Add support support multiple IOThreads

Links:

Details:

  • Project size: 350 hours
  • Skill level: intermediate
  • Language: C
  • Mentors: Kevin Wolf (kwolf@redhat.com), Stefan Hajnoczi (stefanha@redhat.com)