[PATCH v4 0/5] Rust io_uring command abstraction for miscdevice

Sidong Yang
2026-04-08T14:00:42Z

This series introduces Rust abstractions for io_uring commands
(`IORING_OP_URING_CMD`) and wires them up to the miscdevice framework,
allowing Rust drivers to handle io_uring passthrough commands.

The series is structured as follows:

1. Add io_uring C headers to Rust bindings.
2. Zero-init pdu in io_uring_cmd_prep() to avoid UB from stale data.
3. Core io_uring Rust abstractions (IoUringCmd, QueuedIoUringCmd,
IoUringSqe, UringCmdAction type-state pattern).
4. MiscDevice trait extension with uring_cmd callback.
5. Sample demonstrating async uring_cmd handling via workqueue.

The sample completes asynchronously using a workqueue rather than
`io_uring_cmd_complete_in_task()`. The latter is primarily needed
when completion originates from IRQ/softirq context (e.g. NVMe),
whereas workqueue workers already run in process context and can
safely call `io_uring_cmd_done()` directly. A Rust binding for
`complete_in_task` can be added in a follow-up series.

Copy-based `read_pdu()`/`write_pdu()` are kept instead of returning
`&T`/`&mut T` references because the PDU is a `[u8; 32]` byte array
whose alignment may not satisfy `T`'s requirements.

Changes since v3:
- read_pdu(): replaced MaybeUninit + copy_nonoverlapping(c_void) with
read_unaligned (Caleb, Benno).
- write_pdu(): fixed c_void cast to u8 in copy_nonoverlapping (Benno).
- IoUringSqe::opcode(): use read_volatile for SQE field access (Caleb).
- IoUringSqe::cmd_data(): removed unnecessary runtime opcode check;
safety is guaranteed by construction since IoUringSqe can only be
obtained from IoUringCmd::sqe() inside a uring_cmd callback (Caleb).
- Removed unused mut in sample WorkItem::run() (compiler warning).

Changes since v2:
- Adopted type-state pattern for IoUringCmd (IoUringCmd -> QueuedIoUringCmd)
to enforce correct completion flow at compile time.
- UringCmdAction enum with Complete/Queued variants prevents returning
Queued without holding a QueuedIoUringCmd handle.
- Fixed error code handling (use proper kernel error types).
- Suppressed unused result warning with `let _ = ...enqueue(work)`.

Sidong Yang (5):
rust: bindings: add io_uring headers in bindings_helper.h
io_uring/cmd: zero-init pdu in io_uring_cmd_prep() to avoid UB
rust: io_uring: introduce rust abstraction for io-uring cmd
rust: miscdevice: Add `uring_cmd` support
samples: rust: Add `uring_cmd` example to `rust_misc_device`

io_uring/uring_cmd.c | 1 +
rust/bindings/bindings_helper.h | 2 +
rust/helpers/helpers.c | 1 +
rust/helpers/io_uring.c | 9 +
rust/kernel/io_uring.rs | 457 +++++++++++++++++++++++++++++++
rust/kernel/lib.rs | 1 +
rust/kernel/miscdevice.rs | 79 ++++++
samples/rust/rust_misc_device.rs | 53 +++-
8 files changed, 602 insertions(+), 1 deletion(-)
create mode 100644 rust/helpers/io_uring.c
create mode 100644 rust/kernel/io_uring.rs

--
2.43.0