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#ifndef IO_URING_CHECK_VERSION
24#define IO_URING_CHECK_VERSION(major, minor) \
25 (major > IO_URING_VERSION_MAJOR || \
26 (major == IO_URING_VERSION_MAJOR && minor > IO_URING_VERSION_MINOR))
31#if IO_URING_CHECK_VERSION(2, 13)
32inline void io_uring_prep_uring_cmd(
struct io_uring_sqe *sqe,
int cmd_op,
34 sqe->opcode = (__u8)IORING_OP_URING_CMD;
45#if IO_URING_CHECK_VERSION(2, 4)
46inline struct io_uring_buf_ring *
47io_uring_setup_buf_ring(
struct io_uring *ring,
unsigned int nentries,
int bgid,
48 unsigned int flags,
int *err)
noexcept {
49 size_t ring_size = nentries *
sizeof(
struct io_uring_buf);
50 auto *br =
static_cast<struct io_uring_buf_ring *
>(
51 mmap(
nullptr, ring_size, PROT_READ | PROT_WRITE,
52 MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
53 if (br == MAP_FAILED) {
58 io_uring_buf_ring_init(br);
60 struct io_uring_buf_reg reg = {};
61 reg.ring_addr =
reinterpret_cast<uint64_t
>(br);
62 reg.ring_entries = nentries;
66 int ret = io_uring_register_buf_ring(ring, ®, flags);
68 munmap(br, ring_size);
76inline int io_uring_free_buf_ring(
struct io_uring *ring,
77 struct io_uring_buf_ring *br,
78 unsigned int nentries,
int bgid)
noexcept {
79 int ret = io_uring_unregister_buf_ring(ring, bgid);
83 munmap(br, nentries *
sizeof(
struct io_uring_buf));