io_uring_mmap 0.1.0

io_uring mmap
Documentation
#![no_std]
#![allow(clippy::missing_safety_doc)]

use core::ffi::c_void;
use core::ptr::null_mut;

use io_uring_header::{
    io_uring_cqe, io_uring_params, io_uring_sqe, IORING_FEAT_SINGLE_MMAP, IORING_OFF_SQES,
    IORING_OFF_SQ_RING,
};
use map_err::{map_ptr, map_val};
use szof::szty;

const PROT_READ: i32 = 0x1;
const PROT_WRITE: i32 = 0x2;
const MAP_SHARED: i32 = 0x1;
const MAP_POPULATE: i32 = 0x8000;

pub unsafe fn mmap_sq_cq(fd: i32, params: &io_uring_params) -> Result<(*mut c_void, usize), i32> {
    if params.features & IORING_FEAT_SINGLE_MMAP == 0 {
        return Err(-38);
    }
    let sq_len = params.sq_off.array as usize + (params.sq_entries as usize * szty!(u32));
    let cq_len = params.cq_off.cqes as usize + (params.cq_entries as usize * szty!(io_uring_cqe));
    let len = sq_len.max(cq_len);
    let ptr = map_ptr(io_uring_syscall::mmap(
        null_mut(),
        len,
        PROT_READ | PROT_WRITE,
        MAP_SHARED | MAP_POPULATE,
        fd,
        IORING_OFF_SQ_RING as isize,
    ))?;
    Ok((ptr, len))
}

pub unsafe fn mmap_sqe(fd: i32, params: &io_uring_params) -> Result<(*mut c_void, usize), i32> {
    let len = params.sq_entries as usize * szty!(io_uring_sqe);
    let ptr = map_ptr(io_uring_syscall::mmap(
        null_mut(),
        len,
        PROT_READ | PROT_WRITE,
        MAP_SHARED | MAP_POPULATE,
        fd,
        IORING_OFF_SQES as isize,
    ))?;
    Ok((ptr, len))
}

pub unsafe fn munmap(addr: *mut c_void, len: usize) -> Result<(), i32> {
    map_val(io_uring_syscall::munmap(addr, len))?;
    Ok(())
}