io_uring/
syscalls.rs

1// Copyright 2020 The ChromiumOS Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use std::io::Error;
6use std::os::unix::io::RawFd;
7use std::ptr::null_mut;
8
9use libc::c_int;
10use libc::c_long;
11use libc::c_uint;
12use libc::c_void;
13use libc::syscall;
14use libc::SYS_io_uring_enter;
15use libc::SYS_io_uring_register;
16use libc::SYS_io_uring_setup;
17
18use crate::bindings::*;
19
20/// Returns the system error as the result;
21pub type Result<T> = std::result::Result<T, c_int>;
22
23pub unsafe fn io_uring_setup(num_entries: usize, params: &io_uring_params) -> Result<RawFd> {
24    let ret = syscall(
25        SYS_io_uring_setup as c_long,
26        num_entries as c_int,
27        params as *const _,
28    );
29    if ret < 0 {
30        return Err(Error::last_os_error().raw_os_error().unwrap());
31    }
32    Ok(ret as RawFd)
33}
34
35pub unsafe fn io_uring_enter(fd: RawFd, to_submit: u64, to_wait: u64, flags: u32) -> Result<()> {
36    let ret = syscall(
37        SYS_io_uring_enter as c_long,
38        fd,
39        to_submit as c_int,
40        to_wait as c_int,
41        flags as c_int,
42        null_mut::<*mut c_void>(),
43    );
44    if ret < 0 {
45        return Err(Error::last_os_error().raw_os_error().unwrap());
46    }
47    Ok(())
48}
49
50pub unsafe fn io_uring_register(
51    fd: RawFd,
52    opcode: u32,
53    args: *const c_void,
54    nr_args: u32,
55) -> Result<()> {
56    let ret = syscall(
57        SYS_io_uring_register as c_long,
58        fd,
59        opcode as c_uint,
60        args,
61        nr_args as c_uint,
62    );
63    if ret < 0 {
64        return Err(Error::last_os_error().raw_os_error().unwrap());
65    }
66    Ok(())
67}