summaryrefslogtreecommitdiffstats
path: root/contrib/libs/liburing/src
diff options
context:
space:
mode:
authorrobot-contrib <[email protected]>2025-02-21 13:15:16 +0300
committerrobot-contrib <[email protected]>2025-02-21 13:36:13 +0300
commita4e53fc5cc0c64cd0c54aa050e82cab26e258b7f (patch)
tree4a11071a8b2c78a978064585a2583afb14f6a99d /contrib/libs/liburing/src
parentc1fa17d4daa4633b45d839e44f84d16eacfb82b8 (diff)
Update contrib/libs/liburing to 2.9
commit_hash:88f21b0567edce8f03258355bcc0e4029ea2085b
Diffstat (limited to 'contrib/libs/liburing/src')
-rw-r--r--contrib/libs/liburing/src/include/liburing.h21
-rw-r--r--contrib/libs/liburing/src/include/liburing/io_uring.h78
-rw-r--r--contrib/libs/liburing/src/include/liburing/io_uring_version.h2
-rw-r--r--contrib/libs/liburing/src/liburing.map105
-rw-r--r--contrib/libs/liburing/src/queue.c23
-rw-r--r--contrib/libs/liburing/src/register.c76
-rw-r--r--contrib/libs/liburing/src/setup.c31
-rw-r--r--contrib/libs/liburing/src/setup.h6
8 files changed, 214 insertions, 128 deletions
diff --git a/contrib/libs/liburing/src/include/liburing.h b/contrib/libs/liburing/src/include/liburing.h
index 6eae1389751..49b4edf437b 100644
--- a/contrib/libs/liburing/src/include/liburing.h
+++ b/contrib/libs/liburing/src/include/liburing.h
@@ -196,7 +196,16 @@ int io_uring_submit_and_wait_min_timeout(struct io_uring *ring,
struct __kernel_timespec *ts,
unsigned min_wait,
sigset_t *sigmask);
+int io_uring_submit_and_wait_reg(struct io_uring *ring,
+ struct io_uring_cqe **cqe_ptr, unsigned wait_nr,
+ int reg_index);
+int io_uring_register_wait_reg(struct io_uring *ring,
+ struct io_uring_reg_wait *reg, int nr);
+int io_uring_resize_rings(struct io_uring *ring, struct io_uring_params *p);
+int io_uring_clone_buffers_offset(struct io_uring *dst, struct io_uring *src,
+ unsigned int dst_off, unsigned int src_off,
+ unsigned int nr, unsigned int flags);
int io_uring_clone_buffers(struct io_uring *dst, struct io_uring *src);
int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
unsigned nr_iovecs);
@@ -276,6 +285,12 @@ int io_uring_register(unsigned int fd, unsigned int opcode, const void *arg,
unsigned int nr_args);
/*
+ * Mapped/registered regions
+ */
+int io_uring_register_region(struct io_uring *ring,
+ struct io_uring_mem_region_reg *reg);
+
+/*
* Mapped buffer ring alloc/register + unregister/free helpers
*/
struct io_uring_buf_ring *io_uring_setup_buf_ring(struct io_uring *ring,
@@ -394,6 +409,12 @@ IOURINGINLINE void io_uring_sqe_set_flags(struct io_uring_sqe *sqe,
sqe->flags = (__u8) flags;
}
+IOURINGINLINE void io_uring_sqe_set_buf_group(struct io_uring_sqe *sqe,
+ int bgid)
+{
+ sqe->buf_group = (__u16) bgid;
+}
+
IOURINGINLINE void __io_uring_set_target_fixed_file(struct io_uring_sqe *sqe,
unsigned int file_index)
{
diff --git a/contrib/libs/liburing/src/include/liburing/io_uring.h b/contrib/libs/liburing/src/include/liburing/io_uring.h
index 4ac13f7327e..765919883cf 100644
--- a/contrib/libs/liburing/src/include/liburing/io_uring.h
+++ b/contrib/libs/liburing/src/include/liburing/io_uring.h
@@ -200,6 +200,9 @@ enum io_uring_sqe_flags_bit {
*/
#define IORING_SETUP_NO_SQARRAY (1U << 16)
+/* Use hybrid poll in iopoll process */
+#define IORING_SETUP_HYBRID_IOPOLL (1U << 17)
+
enum io_uring_op {
IORING_OP_NOP,
IORING_OP_READV,
@@ -518,6 +521,7 @@ struct io_cqring_offsets {
#define IORING_ENTER_EXT_ARG (1U << 3)
#define IORING_ENTER_REGISTERED_RING (1U << 4)
#define IORING_ENTER_ABS_TIMER (1U << 5)
+#define IORING_ENTER_EXT_ARG_REG (1U << 6)
/*
* Passed in for io_uring_setup(2). Copied back with updated info on success
@@ -612,6 +616,10 @@ enum io_uring_register_op {
/* clone registered buffers from source ring to current ring */
IORING_REGISTER_CLONE_BUFFERS = 30,
+ IORING_REGISTER_RESIZE_RINGS = 33,
+
+ IORING_REGISTER_MEM_REGION = 34,
+
/* this goes last */
IORING_REGISTER_LAST,
@@ -632,6 +640,31 @@ struct io_uring_files_update {
__aligned_u64 /* __s32 * */ fds;
};
+enum {
+ /* initialise with user provided memory pointed by user_addr */
+ IORING_MEM_REGION_TYPE_USER = 1,
+};
+
+struct io_uring_region_desc {
+ __u64 user_addr;
+ __u64 size;
+ __u32 flags;
+ __u32 id;
+ __u64 mmap_offset;
+ __u64 __resv[4];
+};
+
+enum {
+ /* expose the region as registered wait arguments */
+ IORING_MEM_REGION_REG_WAIT_ARG = 1,
+};
+
+struct io_uring_mem_region_reg {
+ __u64 region_uptr; /* struct io_uring_region_desc * */
+ __u64 flags;
+ __u64 __resv[2];
+};
+
/*
* Register a fully sparse file space, rather than pass in an array of all
* -1 file descriptors.
@@ -698,13 +731,17 @@ struct io_uring_clock_register {
};
enum {
- IORING_REGISTER_SRC_REGISTERED = 1,
+ IORING_REGISTER_SRC_REGISTERED = (1U << 0),
+ IORING_REGISTER_DST_REPLACE = (1U << 1),
};
struct io_uring_clone_buffers {
__u32 src_fd;
__u32 flags;
- __u32 pad[6];
+ __u32 src_off;
+ __u32 dst_off;
+ __u32 nr;
+ __u32 pad[3];
};
struct io_uring_buf {
@@ -795,6 +832,43 @@ enum io_uring_register_restriction_op {
IORING_RESTRICTION_LAST
};
+enum {
+ IORING_REG_WAIT_TS = (1U << 0),
+};
+
+/*
+ * Argument for IORING_REGISTER_CQWAIT_REG, registering a region of
+ * struct io_uring_reg_wait that can be indexed when io_uring_enter(2) is
+ * called rather than pass in a wait argument structure separately.
+ */
+struct io_uring_cqwait_reg_arg {
+ __u32 flags;
+ __u32 struct_size;
+ __u32 nr_entries;
+ __u32 pad;
+ __u64 user_addr;
+ __u64 pad2[3];
+};
+
+/*
+ * Argument for io_uring_enter(2) with
+ * IORING_GETEVENTS | IORING_ENTER_EXT_ARG_REG set, where the actual argument
+ * is an index into a previously registered fixed wait region described by
+ * the below structure.
+ */
+struct io_uring_reg_wait {
+ struct __kernel_timespec ts;
+ __u32 min_wait_usec;
+ __u32 flags;
+ __u64 sigmask;
+ __u32 sigmask_sz;
+ __u32 pad[3];
+ __u64 pad2[2];
+};
+
+/*
+ * Argument for io_uring_enter(2) with IORING_GETEVENTS | IORING_ENTER_EXT_ARG
+ */
struct io_uring_getevents_arg {
__u64 sigmask;
__u32 sigmask_sz;
diff --git a/contrib/libs/liburing/src/include/liburing/io_uring_version.h b/contrib/libs/liburing/src/include/liburing/io_uring_version.h
index 6705e526108..f31d92539f4 100644
--- a/contrib/libs/liburing/src/include/liburing/io_uring_version.h
+++ b/contrib/libs/liburing/src/include/liburing/io_uring_version.h
@@ -3,6 +3,6 @@
#define LIBURING_VERSION_H
#define IO_URING_VERSION_MAJOR 2
-#define IO_URING_VERSION_MINOR 8
+#define IO_URING_VERSION_MINOR 9
#endif
diff --git a/contrib/libs/liburing/src/liburing.map b/contrib/libs/liburing/src/liburing.map
deleted file mode 100644
index c13cd36ece2..00000000000
--- a/contrib/libs/liburing/src/liburing.map
+++ /dev/null
@@ -1,105 +0,0 @@
-LIBURING_2.0 {
- global:
- io_uring_get_probe;
- io_uring_get_probe_ring;
- io_uring_free_probe;
- io_uring_get_sqe;
- io_uring_peek_batch_cqe;
- io_uring_queue_exit;
- io_uring_queue_init;
- io_uring_queue_init_params;
- io_uring_queue_mmap;
- io_uring_register_buffers;
- io_uring_register_eventfd;
- io_uring_register_eventfd_async;
- io_uring_register_files;
- io_uring_register_files_update;
- io_uring_register_personality;
- io_uring_register_probe;
- io_uring_ring_dontfork;
- io_uring_submit;
- io_uring_submit_and_wait;
- io_uring_unregister_buffers;
- io_uring_unregister_eventfd;
- io_uring_unregister_files;
- io_uring_unregister_personality;
- io_uring_wait_cqe_timeout;
- io_uring_wait_cqes;
-
- __io_uring_get_cqe;
- __io_uring_sqring_wait;
- local:
- *;
-};
-
-LIBURING_2.1 {
- global:
- io_uring_mlock_size_params;
- io_uring_mlock_size;
- io_uring_register_buffers_tags;
- io_uring_register_buffers_update_tag;
- io_uring_register_files_tags;
- io_uring_register_files_update_tag;
- io_uring_register_iowq_aff;
- io_uring_unregister_iowq_aff;
- io_uring_register_iowq_max_workers;
-} LIBURING_2.0;
-
-LIBURING_2.2 {
- global:
- io_uring_submit_and_wait_timeout;
- io_uring_register_ring_fd;
- io_uring_unregister_ring_fd;
- io_uring_register_files_sparse;
- io_uring_register_buffers_sparse;
- io_uring_register_buf_ring;
- io_uring_unregister_buf_ring;
-} LIBURING_2.1;
-
-LIBURING_2.3 {
- global:
- io_uring_register_sync_cancel;
- io_uring_register_file_alloc_range;
- io_uring_enter;
- io_uring_enter2;
- io_uring_setup;
- io_uring_register;
- io_uring_get_events;
- io_uring_submit_and_get_events;
-} LIBURING_2.2;
-
-LIBURING_2.4 {
- global:
- io_uring_major_version;
- io_uring_minor_version;
- io_uring_check_version;
-
- io_uring_close_ring_fd;
- io_uring_enable_rings;
- io_uring_register_restrictions;
- io_uring_setup_buf_ring;
- io_uring_free_buf_ring;
-} LIBURING_2.3;
-
-LIBURING_2.5 {
- global:
- io_uring_queue_init_mem;
-} LIBURING_2.4;
-
-LIBURING_2.6 {
- global:
- io_uring_buf_ring_head;
- io_uring_register_napi;
- io_uring_unregister_napi;
-} LIBURING_2.5;
-
-LIBURING_2.7 {
-} LIBURING_2.6;
-
-LIBURING_2.8 {
- global:
- io_uring_register_clock;
- io_uring_submit_and_wait_min_timeout;
- io_uring_wait_cqes_min_timeout;
- io_uring_clone_buffers;
-} LIBURING_2.7;
diff --git a/contrib/libs/liburing/src/queue.c b/contrib/libs/liburing/src/queue.c
index 6e855a2d3d1..835815d7e00 100644
--- a/contrib/libs/liburing/src/queue.c
+++ b/contrib/libs/liburing/src/queue.c
@@ -7,7 +7,6 @@
#include "liburing.h"
#include "int_flags.h"
#include "liburing/sanitize.h"
-#include "liburing/compat.h"
#include "liburing/io_uring.h"
/*
@@ -322,6 +321,28 @@ int io_uring_wait_cqes_min_timeout(struct io_uring *ring,
sigmask);
}
+int io_uring_submit_and_wait_reg(struct io_uring *ring,
+ struct io_uring_cqe **cqe_ptr,
+ unsigned wait_nr, int reg_index)
+{
+ unsigned long offset = reg_index * sizeof(struct io_uring_reg_wait);
+
+ struct get_data data = {
+ .submit = __io_uring_flush_sq(ring),
+ .wait_nr = wait_nr,
+ .get_flags = IORING_ENTER_EXT_ARG |
+ IORING_ENTER_EXT_ARG_REG,
+ .sz = sizeof(struct io_uring_reg_wait),
+ .has_ts = true,
+ .arg = (void *) (uintptr_t) offset,
+ };
+
+ if (!(ring->features & IORING_FEAT_EXT_ARG))
+ return -EINVAL;
+
+ return _io_uring_get_cqe(ring, cqe_ptr, &data);
+}
+
static int __io_uring_submit_and_wait_timeout(struct io_uring *ring,
struct io_uring_cqe **cqe_ptr, unsigned wait_nr,
struct __kernel_timespec *ts,
diff --git a/contrib/libs/liburing/src/register.c b/contrib/libs/liburing/src/register.c
index c215da7f219..7ee92adb066 100644
--- a/contrib/libs/liburing/src/register.c
+++ b/contrib/libs/liburing/src/register.c
@@ -5,8 +5,8 @@
#include "lib.h"
#include "syscall.h"
#include "liburing.h"
+#include "setup.h"
#include "int_flags.h"
-#include "liburing/compat.h"
#include "liburing/io_uring.h"
#include "liburing/sanitize.h"
@@ -396,16 +396,84 @@ int io_uring_register_clock(struct io_uring *ring,
return do_register(ring, IORING_REGISTER_CLOCK, arg, 0);
}
-int io_uring_clone_buffers(struct io_uring *dst, struct io_uring *src)
+int io_uring_clone_buffers_offset(struct io_uring *dst, struct io_uring *src,
+ unsigned int dst_off, unsigned int src_off,
+ unsigned int nr, unsigned int flags)
{
- struct io_uring_clone_buffers buf = { .src_fd = src->ring_fd, };
+ struct io_uring_clone_buffers buf = {
+ .src_fd = src->ring_fd,
+ .flags = flags,
+ .src_off = src_off,
+ .dst_off = dst_off,
+ .nr = nr,
+ };
if (src->int_flags & INT_FLAG_REG_REG_RING) {
buf.src_fd = src->enter_ring_fd;
- buf.flags = IORING_REGISTER_SRC_REGISTERED;
+ buf.flags |= IORING_REGISTER_SRC_REGISTERED;
} else {
buf.src_fd = src->ring_fd;
}
return do_register(dst, IORING_REGISTER_CLONE_BUFFERS, &buf, 1);
}
+
+int io_uring_clone_buffers(struct io_uring *dst, struct io_uring *src)
+{
+ return io_uring_clone_buffers_offset(dst, src, 0, 0, 0, 0);
+}
+
+int io_uring_resize_rings(struct io_uring *ring, struct io_uring_params *p)
+{
+ unsigned sq_head, sq_tail;
+ int ret;
+
+ if (ring->flags & IORING_SETUP_NO_MMAP)
+ return -EINVAL;
+
+ memset(&p->sq_off, 0, sizeof(p->sq_off));
+ memset(&p->cq_off, 0, sizeof(p->cq_off));
+
+ ret = do_register(ring, IORING_REGISTER_RESIZE_RINGS, p, 1);
+ if (ret < 0)
+ goto out;
+
+ sq_head = ring->sq.sqe_head;
+ sq_tail = ring->sq.sqe_tail;
+ io_uring_unmap_rings(&ring->sq, &ring->cq);
+ memset(&ring->sq, 0, sizeof(ring->sq));
+ memset(&ring->cq, 0, sizeof(ring->cq));
+ ret = io_uring_mmap(ring->ring_fd, p, &ring->sq, &ring->cq);
+ if (ret)
+ goto out;
+
+ ring->sq.sqe_head = sq_head;
+ ring->sq.sqe_tail = sq_tail;
+
+ /*
+ * Directly map SQ slots to SQEs
+ */
+ if (!(p->flags & IORING_SETUP_NO_SQARRAY)) {
+ unsigned index;
+
+ for (index = 0; index < p->sq_entries; index++)
+ ring->sq.array[index] = index;
+ }
+
+ /* clear for next use */
+out:
+ p->flags = 0;
+ return ret;
+}
+
+int io_uring_register_wait_reg(struct io_uring *ring,
+ struct io_uring_reg_wait *reg, int nr)
+{
+ return -EINVAL;
+}
+
+int io_uring_register_region(struct io_uring *ring,
+ struct io_uring_mem_region_reg *reg)
+{
+ return do_register(ring, IORING_REGISTER_MEM_REGION, reg, 1);
+}
diff --git a/contrib/libs/liburing/src/setup.c b/contrib/libs/liburing/src/setup.c
index fef92dbd487..de7ef44d5fa 100644
--- a/contrib/libs/liburing/src/setup.c
+++ b/contrib/libs/liburing/src/setup.c
@@ -7,7 +7,6 @@
#include "liburing.h"
#include "int_flags.h"
#include "setup.h"
-#include "liburing/compat.h"
#include "liburing/io_uring.h"
#define KERN_MAX_ENTRIES 32768
@@ -60,7 +59,7 @@ static int get_sq_cq_entries(unsigned entries, struct io_uring_params *p,
return 0;
}
-static void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
+void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
{
if (sq->ring_sz)
__sys_munmap(sq->ring_ptr, sq->ring_sz);
@@ -68,9 +67,9 @@ static void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
__sys_munmap(cq->ring_ptr, cq->ring_sz);
}
-static void io_uring_setup_ring_pointers(struct io_uring_params *p,
- struct io_uring_sq *sq,
- struct io_uring_cq *cq)
+void io_uring_setup_ring_pointers(struct io_uring_params *p,
+ struct io_uring_sq *sq,
+ struct io_uring_cq *cq)
{
sq->khead = sq->ring_ptr + p->sq_off.head;
sq->ktail = sq->ring_ptr + p->sq_off.tail;
@@ -96,8 +95,8 @@ static void io_uring_setup_ring_pointers(struct io_uring_params *p,
cq->ring_entries = *cq->kring_entries;
}
-static int io_uring_mmap(int fd, struct io_uring_params *p,
- struct io_uring_sq *sq, struct io_uring_cq *cq)
+int io_uring_mmap(int fd, struct io_uring_params *p, struct io_uring_sq *sq,
+ struct io_uring_cq *cq)
{
size_t size;
int ret;
@@ -211,7 +210,7 @@ static int io_uring_alloc_huge(unsigned entries, struct io_uring_params *p,
{
unsigned long page_size = get_page_size();
unsigned sq_entries, cq_entries;
- size_t ring_mem, sqes_mem, cqes_mem;
+ size_t ring_mem, sqes_mem, cqes_mem, sqe_size;
unsigned long mem_used = 0;
void *ptr;
int ret;
@@ -222,7 +221,10 @@ static int io_uring_alloc_huge(unsigned entries, struct io_uring_params *p,
ring_mem = KRING_SIZE;
- sqes_mem = sq_entries * sizeof(struct io_uring_sqe);
+ sqe_size = sizeof(struct io_uring_sqe);
+ if (p->flags & IORING_SETUP_SQE128)
+ sqe_size <<= 1;
+ sqes_mem = sq_entries * sqe_size;
if (!(p->flags & IORING_SETUP_NO_SQARRAY))
sqes_mem += sq_entries * sizeof(unsigned);
sqes_mem = (sqes_mem + page_size - 1) & ~(page_size - 1);
@@ -432,18 +434,17 @@ __cold void io_uring_queue_exit(struct io_uring *ring)
{
struct io_uring_sq *sq = &ring->sq;
struct io_uring_cq *cq = &ring->cq;
- size_t sqe_size;
+ size_t sqe_size = sizeof(struct io_uring_sqe);
+
+ if (ring->flags & IORING_SETUP_SQE128)
+ sqe_size <<= 1;
if (!sq->ring_sz && !(ring->int_flags & INT_FLAG_APP_MEM)) {
- sqe_size = sizeof(struct io_uring_sqe);
- if (ring->flags & IORING_SETUP_SQE128)
- sqe_size += 64;
__sys_munmap(sq->sqes, sqe_size * sq->ring_entries);
io_uring_unmap_rings(sq, cq);
} else {
if (!(ring->int_flags & INT_FLAG_APP_MEM)) {
- __sys_munmap(sq->sqes,
- *sq->kring_entries * sizeof(struct io_uring_sqe));
+ __sys_munmap(sq->sqes, *sq->kring_entries * sqe_size);
io_uring_unmap_rings(sq, cq);
}
}
diff --git a/contrib/libs/liburing/src/setup.h b/contrib/libs/liburing/src/setup.h
index ae44314cbee..5a18a7d829c 100644
--- a/contrib/libs/liburing/src/setup.h
+++ b/contrib/libs/liburing/src/setup.h
@@ -5,5 +5,11 @@
int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring,
struct io_uring_params *p, void *buf,
size_t buf_size);
+void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq);
+int io_uring_mmap(int fd, struct io_uring_params *p, struct io_uring_sq *sq,
+ struct io_uring_cq *cq);
+void io_uring_setup_ring_pointers(struct io_uring_params *p,
+ struct io_uring_sq *sq,
+ struct io_uring_cq *cq);
#endif