€•R4Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ-/translations/zh_CN/filesystems/fuse-io-uring”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/zh_TW/filesystems/fuse-io-uring”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/it_IT/filesystems/fuse-io-uring”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ja_JP/filesystems/fuse-io-uring”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ko_KR/filesystems/fuse-io-uring”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/sp_SP/filesystems/fuse-io-uring”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh£sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1h¡hhhžhhŸŒG/var/lib/git/docbuild/linux/Documentation/filesystems/fuse-io-uring.rst”h KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ'FUSE-over-io-uring design documentation”h]”hŒ'FUSE-over-io-uring design documentation”…””}”(hh»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hh¶hžhhŸh³h KubhŒ paragraph”“”)”}”(hŒªThis documentation covers basic details how the fuse kernel/userspace communication through io-uring is configured and works. For generic details about FUSE see fuse.rst.”h]”hŒªThis documentation covers basic details how the fuse kernel/userspace communication through io-uring is configured and works. For generic details about FUSE see fuse.rst.”…””}”(hhËhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhÊ)”}”(hŒ`This document also covers the current interface, which is still in development and might change.”h]”hŒ`This document also covers the current interface, which is still in development and might change.”…””}”(hhÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K hh¶hžhubhµ)”}”(hhh]”(hº)”}”(hŒ Limitations”h]”hŒ Limitations”…””}”(hhêhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hhçhžhhŸh³h KubhÊ)”}”(hŒîAs of now not all requests types are supported through io-uring, userspace is required to also handle requests through /dev/fuse after io-uring setup is complete. Specifically notifications (initiated from the daemon side) and interrupts.”h]”hŒîAs of now not all requests types are supported through io-uring, userspace is required to also handle requests through /dev/fuse after io-uring setup is complete. Specifically notifications (initiated from the daemon side) and interrupts.”…””}”(hhøhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khhçhžhubeh}”(h]”Œ limitations”ah ]”h"]”Œ limitations”ah$]”h&]”uh1h´hh¶hžhhŸh³h Kubhµ)”}”(hhh]”(hº)”}”(hŒFuse io-uring configuration”h]”hŒFuse io-uring configuration”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjhžhhŸh³h KubhÊ)”}”(hŒxFuse kernel requests are queued through the classical /dev/fuse read/write interface - until io-uring setup is complete.”h]”hŒxFuse kernel requests are queued through the classical /dev/fuse read/write interface - until io-uring setup is complete.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KhjhžhubhÊ)”}”(hXIn order to set up fuse-over-io-uring fuse-server (user-space) needs to submit SQEs (opcode = IORING_OP_URING_CMD) to the /dev/fuse connection file descriptor. Initial submit is with the sub command FUSE_URING_REQ_REGISTER, which will just register entries to be available in the kernel.”h]”hXIn order to set up fuse-over-io-uring fuse-server (user-space) needs to submit SQEs (opcode = IORING_OP_URING_CMD) to the /dev/fuse connection file descriptor. Initial submit is with the sub command FUSE_URING_REQ_REGISTER, which will just register entries to be available in the kernel.”…””}”(hj-hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KhjhžhubhÊ)”}”(hX©Once at least one entry per queue is submitted, kernel starts to enqueue to ring queues. Note, every CPU core has its own fuse-io-uring queue. Userspace handles the CQE/fuse-request and submits the result as subcommand FUSE_URING_REQ_COMMIT_AND_FETCH - kernel completes the requests and also marks the entry available again. If there are pending requests waiting the request will be immediately submitted to the daemon again.”h]”hX©Once at least one entry per queue is submitted, kernel starts to enqueue to ring queues. Note, every CPU core has its own fuse-io-uring queue. Userspace handles the CQE/fuse-request and submits the result as subcommand FUSE_URING_REQ_COMMIT_AND_FETCH - kernel completes the requests and also marks the entry available again. If there are pending requests waiting the request will be immediately submitted to the daemon again.”…””}”(hj;hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K!hjhžhubhÊ)”}”(hŒInitial SQE -----------::”h]”hŒInitial SQE -----------:”…””}”(hjIhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K*hjhžhubhŒ literal_block”“”)”}”(hXN| | FUSE filesystem daemon | | | | >io_uring_submit() | | IORING_OP_URING_CMD / | | FUSE_URING_CMD_REGISTER | | [wait cqe] | | >io_uring_wait_cqe() or | | >io_uring_submit_and_wait() | | | >fuse_uring_cmd() | | >fuse_uring_register() |”h]”hXN| | FUSE filesystem daemon | | | | >io_uring_submit() | | IORING_OP_URING_CMD / | | FUSE_URING_CMD_REGISTER | | [wait cqe] | | >io_uring_wait_cqe() or | | >io_uring_submit_and_wait() | | | >fuse_uring_cmd() | | >fuse_uring_register() |”…””}”hjYsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jWhŸh³h K-hjhžhubhÊ)”}”(hŒ7Sending requests with CQEs --------------------------::”h]”hŒ6Sending requests with CQEs --------------------------:”…””}”(hjghžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K:hjhžhubjX)”}”(hX,| | FUSE filesystem daemon | | [waiting for CQEs] | "rm /mnt/fuse/file" | | | | >sys_unlink() | | >fuse_unlink() | | [allocate request] | | >fuse_send_one() | | ... | | >fuse_uring_queue_fuse_req | | [queue request on fg queue] | | >fuse_uring_add_req_to_ring_ent() | | ... | | >fuse_uring_copy_to_ring() | | >io_uring_cmd_done() | | >request_wait_answer() | | [sleep on req->waitq] | | | [receives and handles CQE] | | [submit result and fetch next] | | >io_uring_submit() | | IORING_OP_URING_CMD/ | | FUSE_URING_CMD_COMMIT_AND_FETCH | >fuse_uring_cmd() | | >fuse_uring_commit_fetch() | | >fuse_uring_commit() | | >fuse_uring_copy_from_ring() | | [ copy the result to the fuse req] | | >fuse_uring_req_end() | | >fuse_request_end() | | [wake up req->waitq] | | >fuse_uring_next_fuse_req | | [wait or handle next req] | | | | [req->waitq woken up] | | sys_unlink() | | >fuse_unlink() | | [allocate request] | | >fuse_send_one() | | ... | | >fuse_uring_queue_fuse_req | | [queue request on fg queue] | | >fuse_uring_add_req_to_ring_ent() | | ... | | >fuse_uring_copy_to_ring() | | >io_uring_cmd_done() | | >request_wait_answer() | | [sleep on req->waitq] | | | [receives and handles CQE] | | [submit result and fetch next] | | >io_uring_submit() | | IORING_OP_URING_CMD/ | | FUSE_URING_CMD_COMMIT_AND_FETCH | >fuse_uring_cmd() | | >fuse_uring_commit_fetch() | | >fuse_uring_commit() | | >fuse_uring_copy_from_ring() | | [ copy the result to the fuse req] | | >fuse_uring_req_end() | | >fuse_request_end() | | [wake up req->waitq] | | >fuse_uring_next_fuse_req | | [wait or handle next req] | | | | [req->waitq woken up] | |