diff options
| author | robot-contrib <[email protected]> | 2025-02-21 13:15:16 +0300 |
|---|---|---|
| committer | robot-contrib <[email protected]> | 2025-02-21 13:36:13 +0300 |
| commit | a4e53fc5cc0c64cd0c54aa050e82cab26e258b7f (patch) | |
| tree | 4a11071a8b2c78a978064585a2583afb14f6a99d /contrib/libs/liburing/src | |
| parent | c1fa17d4daa4633b45d839e44f84d16eacfb82b8 (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.h | 21 | ||||
| -rw-r--r-- | contrib/libs/liburing/src/include/liburing/io_uring.h | 78 | ||||
| -rw-r--r-- | contrib/libs/liburing/src/include/liburing/io_uring_version.h | 2 | ||||
| -rw-r--r-- | contrib/libs/liburing/src/liburing.map | 105 | ||||
| -rw-r--r-- | contrib/libs/liburing/src/queue.c | 23 | ||||
| -rw-r--r-- | contrib/libs/liburing/src/register.c | 76 | ||||
| -rw-r--r-- | contrib/libs/liburing/src/setup.c | 31 | ||||
| -rw-r--r-- | contrib/libs/liburing/src/setup.h | 6 |
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 |
