15#ifndef IO_URING_VERSION_MAJOR
16#define IO_URING_VERSION_MAJOR 2
19#ifndef IO_URING_VERSION_MINOR
20#define IO_URING_VERSION_MINOR 3
23#define CONDY_URING_VERSION_GE(major, minor) \
24 (IO_URING_VERSION_MAJOR > (major) || \
25 (IO_URING_VERSION_MAJOR == (major) && IO_URING_VERSION_MINOR >= (minor)))
29#if !CONDY_URING_VERSION_GE(2, 13)
30inline void io_uring_prep_uring_cmd(
struct io_uring_sqe *sqe,
int cmd_op,
32 sqe->opcode = (__u8)IORING_OP_URING_CMD;
43#if !CONDY_URING_VERSION_GE(2, 4)
44inline struct io_uring_buf_ring *
45io_uring_setup_buf_ring(
struct io_uring *ring,
unsigned int nentries,
int bgid,
46 unsigned int flags,
int *err)
noexcept {
47 size_t ring_size = nentries *
sizeof(
struct io_uring_buf);
48 auto *br =
static_cast<struct io_uring_buf_ring *
>(
49 mmap(
nullptr, ring_size, PROT_READ | PROT_WRITE,
50 MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
51 if (br == MAP_FAILED) {
56 io_uring_buf_ring_init(br);
58 struct io_uring_buf_reg reg = {};
59 reg.ring_addr =
reinterpret_cast<uint64_t
>(br);
60 reg.ring_entries = nentries;
64 int ret = io_uring_register_buf_ring(ring, ®, flags);
66 munmap(br, ring_size);
74inline int io_uring_free_buf_ring(
struct io_uring *ring,
75 struct io_uring_buf_ring *br,
76 unsigned int nentries,
int bgid)
noexcept {
77 int ret = io_uring_unregister_buf_ring(ring, bgid);
81 munmap(br, nentries *
sizeof(
struct io_uring_buf));