This patch makes rust_misc_device handle uring_cmd. Command ops are like
ioctl that set or get values in simple way.
Signed-off-by: Sidong Yang <sidong.yang@furiosa.ai>
---
samples/rust/rust_misc_device.rs | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/samples/rust/rust_misc_device.rs b/samples/rust/rust_misc_device.rs
index c881fd6dbd08..cd0e578231d2 100644
--- a/samples/rust/rust_misc_device.rs
+++ b/samples/rust/rust_misc_device.rs
@@ -101,6 +101,7 @@
c_str,
device::Device,
fs::File,
+ io_uring::IoUringCmd,
ioctl::{_IO, _IOC_SIZE, _IOR, _IOW},
miscdevice::{MiscDevice, MiscDeviceOptions, MiscDeviceRegistration},
new_mutex,
@@ -114,6 +115,9 @@
const RUST_MISC_DEV_GET_VALUE: u32 = _IOR::<i32>('|' as u32, 0x81);
const RUST_MISC_DEV_SET_VALUE: u32 = _IOW::<i32>('|' as u32, 0x82);
+const RUST_MISC_DEV_URING_CMD_SET_VALUE: u32 = 0x83;
+const RUST_MISC_DEV_URING_CMD_GET_VALUE: u32 = 0x84;
+
module! {
type: RustMiscDeviceModule,
name: "rust_misc_device",
@@ -190,6 +194,32 @@ fn ioctl(me: Pin<&RustMiscDevice>, _file: &File, cmd: u32, arg: usize) -> Result
Ok(0)
}
+
+ fn uring_cmd(
+ me: Pin<&RustMiscDevice>,
+ _file: &File,
+ io_uring_cmd: &IoUringCmd,
+ _issue_flags: u32,
+ ) -> Result<isize> {
+ dev_info!(me.dev, "UringCmd Rust Misc Device Sample\n");
+ let cmd = io_uring_cmd.cmd_op();
+ let cmd_data = io_uring_cmd.sqe().cmd_data().as_ptr() as *const usize;
+ let addr = unsafe { *cmd_data };
+
+ match cmd {
+ RUST_MISC_DEV_URING_CMD_SET_VALUE => {
+ me.set_value(UserSlice::new(addr, 8).reader())?;
+ }
+ RUST_MISC_DEV_URING_CMD_GET_VALUE => {
+ me.get_value(UserSlice::new(addr, 8).writer())?;
+ }
+ _ => {
+ dev_err!(me.dev, "-> uring_cmd not recognised: {}\n", cmd);
+ return Err(ENOTTY);
+ }
+ }
+ Ok(0)
+ }
}
#[pinned_drop]
--
2.43.0
On Sat, Jul 19, 2025 at 10:35 AM Sidong Yang <sidong.yang@furiosa.ai> wrote: > > This patch makes rust_misc_device handle uring_cmd. Command ops are like > ioctl that set or get values in simple way. > > Signed-off-by: Sidong Yang <sidong.yang@furiosa.ai> > --- > samples/rust/rust_misc_device.rs | 30 ++++++++++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > diff --git a/samples/rust/rust_misc_device.rs b/samples/rust/rust_misc_device.rs > index c881fd6dbd08..cd0e578231d2 100644 > --- a/samples/rust/rust_misc_device.rs > +++ b/samples/rust/rust_misc_device.rs > @@ -101,6 +101,7 @@ > c_str, > device::Device, > fs::File, > + io_uring::IoUringCmd, > ioctl::{_IO, _IOC_SIZE, _IOR, _IOW}, > miscdevice::{MiscDevice, MiscDeviceOptions, MiscDeviceRegistration}, > new_mutex, > @@ -114,6 +115,9 @@ > const RUST_MISC_DEV_GET_VALUE: u32 = _IOR::<i32>('|' as u32, 0x81); > const RUST_MISC_DEV_SET_VALUE: u32 = _IOW::<i32>('|' as u32, 0x82); > > +const RUST_MISC_DEV_URING_CMD_SET_VALUE: u32 = 0x83; > +const RUST_MISC_DEV_URING_CMD_GET_VALUE: u32 = 0x84; In real uring_cmd() implementations, the cmd_op values are assigned using the _IO* macros, same as for ioctls. But I suppose that's not strictly required for the sample driver. > + > module! { > type: RustMiscDeviceModule, > name: "rust_misc_device", > @@ -190,6 +194,32 @@ fn ioctl(me: Pin<&RustMiscDevice>, _file: &File, cmd: u32, arg: usize) -> Result > > Ok(0) > } > + > + fn uring_cmd( > + me: Pin<&RustMiscDevice>, > + _file: &File, > + io_uring_cmd: &IoUringCmd, > + _issue_flags: u32, > + ) -> Result<isize> { > + dev_info!(me.dev, "UringCmd Rust Misc Device Sample\n"); > + let cmd = io_uring_cmd.cmd_op(); > + let cmd_data = io_uring_cmd.sqe().cmd_data().as_ptr() as *const usize; > + let addr = unsafe { *cmd_data }; The io_uring_sqe is user-mapped memory, so this load needs to be atomic. In C, the uring_cmd() implementation would use READ_ONCE(). Sounds like Rust code is currently using read_volatile() (with a FIXME comment to switch to read_once() once that's available). Best, Caleb > + > + match cmd { > + RUST_MISC_DEV_URING_CMD_SET_VALUE => { > + me.set_value(UserSlice::new(addr, 8).reader())?; > + } > + RUST_MISC_DEV_URING_CMD_GET_VALUE => { > + me.get_value(UserSlice::new(addr, 8).writer())?; > + } > + _ => { > + dev_err!(me.dev, "-> uring_cmd not recognised: {}\n", cmd); > + return Err(ENOTTY); > + } > + } > + Ok(0) > + } > } > > #[pinned_drop] > -- > 2.43.0 > >
On Sun, Jul 20, 2025 at 04:21:00PM -0400, Caleb Sander Mateos wrote: > On Sat, Jul 19, 2025 at 10:35 AM Sidong Yang <sidong.yang@furiosa.ai> wrote: > > > > This patch makes rust_misc_device handle uring_cmd. Command ops are like > > ioctl that set or get values in simple way. > > > > Signed-off-by: Sidong Yang <sidong.yang@furiosa.ai> > > --- > > samples/rust/rust_misc_device.rs | 30 ++++++++++++++++++++++++++++++ > > 1 file changed, 30 insertions(+) > > > > diff --git a/samples/rust/rust_misc_device.rs b/samples/rust/rust_misc_device.rs > > index c881fd6dbd08..cd0e578231d2 100644 > > --- a/samples/rust/rust_misc_device.rs > > +++ b/samples/rust/rust_misc_device.rs > > @@ -101,6 +101,7 @@ > > c_str, > > device::Device, > > fs::File, > > + io_uring::IoUringCmd, > > ioctl::{_IO, _IOC_SIZE, _IOR, _IOW}, > > miscdevice::{MiscDevice, MiscDeviceOptions, MiscDeviceRegistration}, > > new_mutex, > > @@ -114,6 +115,9 @@ > > const RUST_MISC_DEV_GET_VALUE: u32 = _IOR::<i32>('|' as u32, 0x81); > > const RUST_MISC_DEV_SET_VALUE: u32 = _IOW::<i32>('|' as u32, 0x82); > > > > +const RUST_MISC_DEV_URING_CMD_SET_VALUE: u32 = 0x83; > > +const RUST_MISC_DEV_URING_CMD_GET_VALUE: u32 = 0x84; > > In real uring_cmd() implementations, the cmd_op values are assigned > using the _IO* macros, same as for ioctls. But I suppose that's not > strictly required for the sample driver. Okay, I'll use same _IO* pattern with ioctl. > > > + > > module! { > > type: RustMiscDeviceModule, > > name: "rust_misc_device", > > @@ -190,6 +194,32 @@ fn ioctl(me: Pin<&RustMiscDevice>, _file: &File, cmd: u32, arg: usize) -> Result > > > > Ok(0) > > } > > + > > + fn uring_cmd( > > + me: Pin<&RustMiscDevice>, > > + _file: &File, > > + io_uring_cmd: &IoUringCmd, > > + _issue_flags: u32, > > + ) -> Result<isize> { > > + dev_info!(me.dev, "UringCmd Rust Misc Device Sample\n"); > > + let cmd = io_uring_cmd.cmd_op(); > > + let cmd_data = io_uring_cmd.sqe().cmd_data().as_ptr() as *const usize; > > + let addr = unsafe { *cmd_data }; > > The io_uring_sqe is user-mapped memory, so this load needs to be > atomic. In C, the uring_cmd() implementation would use READ_ONCE(). > Sounds like Rust code is currently using read_volatile() (with a FIXME > comment to switch to read_once() once that's available). Yes, I've missed this. read_volatile with comment would be good. Thanks, Sidong > > Best, > Caleb > > > + > > + match cmd { > > + RUST_MISC_DEV_URING_CMD_SET_VALUE => { > > + me.set_value(UserSlice::new(addr, 8).reader())?; > > + } > > + RUST_MISC_DEV_URING_CMD_GET_VALUE => { > > + me.get_value(UserSlice::new(addr, 8).writer())?; > > + } > > + _ => { > > + dev_err!(me.dev, "-> uring_cmd not recognised: {}\n", cmd); > > + return Err(ENOTTY); > > + } > > + } > > + Ok(0) > > + } > > } > > > > #[pinned_drop] > > -- > > 2.43.0 > > > >
© 2016 - 2025 Red Hat, Inc.