1 //! linux_raw syscalls supporting `rustix::io_uring`.
2 //!
3 //! # Safety
4 //!
5 //! See the `rustix::backend::syscalls` module documentation for details.
6 #![allow(unsafe_code, clippy::undocumented_unsafe_blocks)]
7
8 use crate::backend::conv::{by_mut, c_uint, pass_usize, ret_c_uint, ret_owned_fd};
9 use crate::fd::{BorrowedFd, OwnedFd};
10 use crate::io;
11 use crate::io_uring::{io_uring_params, IoringEnterFlags, IoringRegisterOp};
12 use core::ffi::c_void;
13
14 #[inline]
io_uring_setup(entries: u32, params: &mut io_uring_params) -> io::Result<OwnedFd>15 pub(crate) fn io_uring_setup(entries: u32, params: &mut io_uring_params) -> io::Result<OwnedFd> {
16 unsafe {
17 ret_owned_fd(syscall!(
18 __NR_io_uring_setup,
19 c_uint(entries),
20 by_mut(params)
21 ))
22 }
23 }
24
25 #[inline]
io_uring_register( fd: BorrowedFd<'_>, opcode: IoringRegisterOp, arg: *const c_void, nr_args: u32, ) -> io::Result<u32>26 pub(crate) unsafe fn io_uring_register(
27 fd: BorrowedFd<'_>,
28 opcode: IoringRegisterOp,
29 arg: *const c_void,
30 nr_args: u32,
31 ) -> io::Result<u32> {
32 ret_c_uint(syscall_readonly!(
33 __NR_io_uring_register,
34 fd,
35 c_uint(opcode as u32),
36 arg,
37 c_uint(nr_args)
38 ))
39 }
40
41 #[inline]
io_uring_enter( fd: BorrowedFd<'_>, to_submit: u32, min_complete: u32, flags: IoringEnterFlags, arg: *const c_void, size: usize, ) -> io::Result<u32>42 pub(crate) unsafe fn io_uring_enter(
43 fd: BorrowedFd<'_>,
44 to_submit: u32,
45 min_complete: u32,
46 flags: IoringEnterFlags,
47 arg: *const c_void,
48 size: usize,
49 ) -> io::Result<u32> {
50 // This is not `_readonly` because `io_uring_enter` waits for I/O to
51 // complete, and I/O could involve writing to memory buffers, which
52 // could be a side effect depended on by the caller.
53 ret_c_uint(syscall!(
54 __NR_io_uring_enter,
55 fd,
56 c_uint(to_submit),
57 c_uint(min_complete),
58 flags,
59 arg,
60 pass_usize(size)
61 ))
62 }
63