#[repr(C)]
#[derive(Default)]
pub struct IoSqringOffsets {
pub head: u32,
pub tail: u32,
pub ring_mask: u32,
pub ring_entries: u32,
pub flags: u32,
pub dropped: u32,
pub array: u32,
pub resv1: u32,
pub resv2: u64,
}
#[repr(C)]
#[derive(Default)]
pub struct IoCqringOffsets {
pub head: u32,
pub tail: u32,
pub ring_mask: u32,
pub ring_entries: u32,
pub overflow: u32,
pub cqes: u32,
pub flags: u32,
pub resv1: u32,
pub resv2: u64,
}
#[repr(C)]
#[derive(Default)]
pub struct IoUringParams {
pub sq_entries: u32,
pub cq_entries: u32,
pub flags: u32,
pub sq_thread_cpu: u32,
pub sq_thread_idle: u32,
pub features: u32,
pub wq_fd: u32,
pub resv: [u32; 3],
pub sq_off: IoSqringOffsets,
pub cq_off: IoCqringOffsets,
}
#[repr(C)]
pub struct IoUringSqe {
pub opcode: u8,
pub flags: u8,
pub ioprio: u16,
pub fd: i32,
pub off: u64,
pub addr: u64,
pub len: u32,
pub rw_flags: u32,
pub user_data: u64,
pub buf_index: u16,
pub personality: u16,
pub splice_fd_in: i32,
pub addr3: u64,
pub __pad2: u64,
}
impl IoUringSqe {
pub fn new(opcode: u8, fd: i32, addr: u64, len: u32, user_data: u64) -> IoUringSqe {
IoUringSqe {
opcode,
flags: 0,
ioprio: 0,
fd,
off: 0,
addr,
len,
rw_flags: 0,
user_data,
buf_index: 0,
personality: 0,
splice_fd_in: 0,
addr3: 0,
__pad2: 0,
}
}
}
#[repr(C)]
#[derive(Default)]
pub struct KernelTimespec {
pub tv_sec: i64,
pub tv_nsec: i64,
}
impl KernelTimespec {
pub fn from_millis(ms: u64) -> KernelTimespec {
KernelTimespec {
tv_sec: (ms / 1000) as i64,
tv_nsec: ((ms % 1000) * 1_000_000) as i64,
}
}
pub fn from_micros(us: u64) -> KernelTimespec {
KernelTimespec {
tv_sec: (us / 1_000_000) as i64,
tv_nsec: ((us % 1_000_000) * 1_000) as i64,
}
}
}
#[repr(C)]
pub struct IoUringBufReg {
pub ring_addr: u64,
pub ring_entries: u32,
pub bgid: u16,
pub pad: u16,
pub resv: [u64; 3],
}
#[repr(C)]
pub struct IoUringFilesUpdate {
pub offset: u32,
pub resv: u32,
pub fds: u64,
}
#[repr(C)]
#[derive(Default)]
pub struct IoUringRsrcUpdate {
pub offset: u32,
pub resv: u32,
pub data: u64,
}
#[repr(C)]
#[derive(Default)]
pub struct IoUringRsrcRegister {
pub nr: u32,
pub flags: u32,
pub resv2: u64,
pub data: u64,
pub tags: u64,
}
pub const IORING_RSRC_REGISTER_SPARSE: u32 = 1 << 0;