Internships/ProjectIdeas/FUSEUringCmd
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 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. 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.
Links:
- QEMU FUSE export code
- libfuse branch with FUSE-over-io_uring support
- Overview of low-level FUSE-over-io_uring interface (handled by libfuse, but good background info)
Details:
- Project size: 350 hours
- Skill level: intermediate
- Language: C
- Mentors: Kevin Wolf (kwolf@redhat.com), Stefan Hajnoczi (stefanha@redhat.com)