aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs
diff options
context:
space:
mode:
authorrobot-contrib <robot-contrib@yandex-team.com>2024-09-15 15:23:16 +0300
committerrobot-contrib <robot-contrib@yandex-team.com>2024-09-15 15:34:37 +0300
commit652e26979af322802fc3f9a6fa7800b574e47ae5 (patch)
treeea8007b370826a47fdf8051b40fb178afcb4f599 /contrib/libs
parentdbf2aed3f6d5c2cb919f9ace1b876025989f8ab1 (diff)
downloadydb-652e26979af322802fc3f9a6fa7800b574e47ae5.tar.gz
Update contrib/libs/liburing to 2.7
commit_hash:87f3322875a8a40a773f874c3ee2d0a95ce53dbe
Diffstat (limited to 'contrib/libs')
-rw-r--r--contrib/libs/liburing/CHANGELOG20
-rw-r--r--contrib/libs/liburing/src/include/liburing.h42
-rw-r--r--contrib/libs/liburing/src/include/liburing/io_uring.h26
-rw-r--r--contrib/libs/liburing/src/include/liburing/io_uring_version.h2
-rw-r--r--contrib/libs/liburing/src/setup.c20
-rw-r--r--contrib/libs/liburing/test/232c93d07b74.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/35fa71a030ca.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/500f9fbadef8.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/7ad0e4b2f83c.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/8a9973408177.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/917257daa0fe.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/a0908ae19763.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/a4c0b3decb33.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/accept-link.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/accept-non-empty.c257
-rw-r--r--contrib/libs/liburing/test/accept-non-empty.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/accept-reuse.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/accept-test.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/accept.c4
-rw-r--r--contrib/libs/liburing/test/accept.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/across-fork.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/b19062a56726.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/b5837bd5311d.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/bind-listen.c409
-rw-r--r--contrib/libs/liburing/test/bind-listen.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/buf-ring-nommap.c4
-rw-r--r--contrib/libs/liburing/test/buf-ring-nommap.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/buf-ring-put.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/buf-ring.c34
-rw-r--r--contrib/libs/liburing/test/buf-ring.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/ce593a6c480a.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/close-opath.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/connect-rep.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/connect.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/coredump.c1
-rw-r--r--contrib/libs/liburing/test/coredump.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/cq-full.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/cq-overflow.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/cq-peek-batch.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/cq-ready.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/cq-size.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/d4ae271dfaae.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/d77a67ed5f27.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/defer-taskrun.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/defer-tw-timeout.c5
-rw-r--r--contrib/libs/liburing/test/defer-tw-timeout.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/defer.c6
-rw-r--r--contrib/libs/liburing/test/defer.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/double-poll-crash.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/drop-submit.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/eeed8b54e0df.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/empty-eownerdead.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/eploop.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/eventfd-disable.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/eventfd-reg.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/eventfd-ring.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/eventfd.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/evloop.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/exec-target.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/exit-no-cleanup.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fadvise.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fallocate.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fc2a85cb02ef.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fd-install.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fd-pass.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/file-register.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/file-update.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/file-verify.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/files-exit-hang-poll.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/files-exit-hang-timeout.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fixed-buf-iter.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fixed-buf-merge.c4
-rw-r--r--contrib/libs/liburing/test/fixed-buf-merge.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fixed-hugepage.c412
-rw-r--r--contrib/libs/liburing/test/fixed-hugepage.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/fixed-link.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fixed-reuse.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fpos.c2
-rw-r--r--contrib/libs/liburing/test/fpos.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/fsync.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/futex.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/hardlink.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/ignore-single-mmap.c49
-rw-r--r--contrib/libs/liburing/test/ignore-single-mmap.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/init-mem.c165
-rw-r--r--contrib/libs/liburing/test/init-mem.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/io-cancel.c20
-rw-r--r--contrib/libs/liburing/test/io-cancel.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/io_uring_enter.c4
-rw-r--r--contrib/libs/liburing/test/io_uring_enter.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/io_uring_passthrough.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/io_uring_register.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/io_uring_setup.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/iopoll-leak.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/iopoll-overflow.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/iopoll.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/lfs-openat-write.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/lfs-openat.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/link-timeout.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/link.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/link_drain.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/madvise.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/mkdir.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/msg-ring-fd.c15
-rw-r--r--contrib/libs/liburing/test/msg-ring-fd.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/msg-ring-flags.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/msg-ring-overflow.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/msg-ring.c29
-rw-r--r--contrib/libs/liburing/test/msg-ring.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/multicqes_drain.c10
-rw-r--r--contrib/libs/liburing/test/multicqes_drain.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/no-mmap-inval.c2
-rw-r--r--contrib/libs/liburing/test/no-mmap-inval.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/nolibc.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/nop-all-sizes.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/nop.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/ooo-file-unreg.c83
-rw-r--r--contrib/libs/liburing/test/ooo-file-unreg.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/open-close.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/open-direct-link.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/open-direct-pick.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/openat2.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/personality.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/pipe-bug.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/pipe-eof.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/pipe-reuse.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-cancel-all.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-cancel-ton.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-cancel.c4
-rw-r--r--contrib/libs/liburing/test/poll-cancel.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-link.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-many.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-mshot-overflow.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-mshot-update.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-race-mshot.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-race.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-ring.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll-v-poll.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/poll.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/probe.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/read-before-exit.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/read-mshot-empty.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/read-mshot.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/read-write.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/recv-msgall-stream.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/recv-msgall.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/recv-multishot.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/recvsend_bundle.c692
-rw-r--r--contrib/libs/liburing/test/recvsend_bundle.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/reg-fd-only.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/reg-hint.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/reg-reg-ring.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/regbuf-merge.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/register-restrictions.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/rename.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/ring-leak.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/ring-leak2.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/ringbuf-read.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/ringbuf-status.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/rsrc_tags.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/rw_merge_test.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/self.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/send-zerocopy.c12
-rw-r--r--contrib/libs/liburing/test/send-zerocopy.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/send_recv.c99
-rw-r--r--contrib/libs/liburing/test/send_recv.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/send_recvmsg.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/shared-wq.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/short-read.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/shutdown.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sigfd-deadlock.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/single-issuer.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/skip-cqe.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/socket-getsetsock-cmd.c62
-rw-r--r--contrib/libs/liburing/test/socket-getsetsock-cmd.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/socket-io-cmd.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/socket-rw-eagain.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/socket-rw-offset.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/socket-rw.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/socket.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/splice.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sq-full-cpp.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sq-full.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sq-poll-dup.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sq-poll-kthread.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sq-poll-share.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sq-space_left.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sqpoll-disable-exit.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sqpoll-exec.c133
-rw-r--r--contrib/libs/liburing/test/sqpoll-exec.t/ya.make35
-rw-r--r--contrib/libs/liburing/test/sqpoll-exit-hang.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sqpoll-sleep.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/stdout.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/submit-and-wait.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/submit-link-fail.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/submit-reuse.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/symlink.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/sync-cancel.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/teardowns.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/thread-exit.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/timeout-new.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/timeout.c2
-rw-r--r--contrib/libs/liburing/test/timeout.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/truncate.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/tty-write-dpoll.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/unlink.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/version.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/waitid.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/wakeup-hang.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/wq-aff.t/ya.make2
-rw-r--r--contrib/libs/liburing/test/xattr.t/ya.make2
-rw-r--r--contrib/libs/liburing/ya.make12
212 files changed, 2990 insertions, 273 deletions
diff --git a/contrib/libs/liburing/CHANGELOG b/contrib/libs/liburing/CHANGELOG
index 0c902312fa..4eb15f38a4 100644
--- a/contrib/libs/liburing/CHANGELOG
+++ b/contrib/libs/liburing/CHANGELOG
@@ -1,3 +1,23 @@
+liburing-2.7 release
+
+- Man page updates
+- Sync with kernel 6.10
+ - send/recv bundle support
+ - accept nowait and CQE_F_MORE
+- Add and update test cases
+- Fix io_uring_queue_init_mem() returning a value that was too small,
+ potentially causing memory corruption in userspace by overwriting
+ 64 bytes beyond the returned value. Also add test case for that.
+- Add 64-bit length variants of io_uring_prep_{m,f}advise()
+- Add BIND/LISTEN support and helpers / man pages
+- Add io_uring_enable_rings.3 man page
+- Fix bug in io_uring_prep_read_multishot()
+- Fixup bundle test cases
+- Add fixed-hugepage test case
+- Fix io_uring_prep_fixed_fd_install.3 man page
+- Note 'len' == 0 requirement in io_uring_prep_send.3 man page
+- Fix some test cases for skipping on older kernels
+
liburing-2.6 release
- Add getsockopt and setsockopt socket commands
diff --git a/contrib/libs/liburing/src/include/liburing.h b/contrib/libs/liburing/src/include/liburing.h
index 7d04aec13a..1092f3b10b 100644
--- a/contrib/libs/liburing/src/include/liburing.h
+++ b/contrib/libs/liburing/src/include/liburing.h
@@ -375,7 +375,7 @@ IOURINGINLINE void __io_uring_set_target_fixed_file(struct io_uring_sqe *sqe,
sqe->file_index = file_index + 1;
}
-IOURINGINLINE void io_uring_initialize_sqe(struct io_uring_sqe *sqe)
+IOURINGINLINE void io_uring_initialize_sqe(struct io_uring_sqe *sqe)
{
sqe->flags = 0;
sqe->ioprio = 0;
@@ -669,6 +669,19 @@ IOURINGINLINE void io_uring_prep_connect(struct io_uring_sqe *sqe, int fd,
io_uring_prep_rw(IORING_OP_CONNECT, sqe, fd, addr, 0, addrlen);
}
+IOURINGINLINE void io_uring_prep_bind(struct io_uring_sqe *sqe, int fd,
+ struct sockaddr *addr,
+ socklen_t addrlen)
+{
+ io_uring_prep_rw(IORING_OP_BIND, sqe, fd, addr, 0, addrlen);
+}
+
+IOURINGINLINE void io_uring_prep_listen(struct io_uring_sqe *sqe, int fd,
+ int backlog)
+{
+ io_uring_prep_rw(IORING_OP_LISTEN, sqe, fd, 0, backlog, 0);
+}
+
IOURINGINLINE void io_uring_prep_files_update(struct io_uring_sqe *sqe,
int *fds, unsigned nr_fds,
int offset)
@@ -731,6 +744,7 @@ IOURINGINLINE void io_uring_prep_read_multishot(struct io_uring_sqe *sqe,
io_uring_prep_rw(IORING_OP_READ_MULTISHOT, sqe, fd, NULL, nbytes,
offset);
sqe->buf_group = buf_group;
+ sqe->flags = IOSQE_BUFFER_SELECT;
}
IOURINGINLINE void io_uring_prep_write(struct io_uring_sqe *sqe, int fd,
@@ -751,19 +765,34 @@ IOURINGINLINE void io_uring_prep_statx(struct io_uring_sqe *sqe, int dfd,
}
IOURINGINLINE void io_uring_prep_fadvise(struct io_uring_sqe *sqe, int fd,
- __u64 offset, off_t len, int advice)
+ __u64 offset, __u32 len, int advice)
{
io_uring_prep_rw(IORING_OP_FADVISE, sqe, fd, NULL, (__u32) len, offset);
sqe->fadvise_advice = (__u32) advice;
}
IOURINGINLINE void io_uring_prep_madvise(struct io_uring_sqe *sqe, void *addr,
- off_t length, int advice)
+ __u32 length, int advice)
{
io_uring_prep_rw(IORING_OP_MADVISE, sqe, -1, addr, (__u32) length, 0);
sqe->fadvise_advice = (__u32) advice;
}
+IOURINGINLINE void io_uring_prep_fadvise64(struct io_uring_sqe *sqe, int fd,
+ __u64 offset, off_t len, int advice)
+{
+ io_uring_prep_rw(IORING_OP_FADVISE, sqe, fd, NULL, 0, offset);
+ sqe->addr = len;
+ sqe->fadvise_advice = (__u32) advice;
+}
+
+IOURINGINLINE void io_uring_prep_madvise64(struct io_uring_sqe *sqe, void *addr,
+ off_t length, int advice)
+{
+ io_uring_prep_rw(IORING_OP_MADVISE, sqe, -1, addr, 0, length);
+ sqe->fadvise_advice = (__u32) advice;
+}
+
IOURINGINLINE void io_uring_prep_send(struct io_uring_sqe *sqe, int sockfd,
const void *buf, size_t len, int flags)
{
@@ -771,6 +800,13 @@ IOURINGINLINE void io_uring_prep_send(struct io_uring_sqe *sqe, int sockfd,
sqe->msg_flags = (__u32) flags;
}
+IOURINGINLINE void io_uring_prep_send_bundle(struct io_uring_sqe *sqe,
+ int sockfd, size_t len, int flags)
+{
+ io_uring_prep_send(sqe, sockfd, NULL, len, flags);
+ sqe->ioprio |= IORING_RECVSEND_BUNDLE;
+}
+
IOURINGINLINE void io_uring_prep_send_set_addr(struct io_uring_sqe *sqe,
const struct sockaddr *dest_addr,
__u16 addr_len)
diff --git a/contrib/libs/liburing/src/include/liburing/io_uring.h b/contrib/libs/liburing/src/include/liburing/io_uring.h
index bde11991bf..01c36a83f3 100644
--- a/contrib/libs/liburing/src/include/liburing/io_uring.h
+++ b/contrib/libs/liburing/src/include/liburing/io_uring.h
@@ -72,6 +72,7 @@ struct io_uring_sqe {
__u32 waitid_flags;
__u32 futex_flags;
__u32 install_fd_flags;
+ __u32 nop_flags;
};
__u64 user_data; /* data to be passed back at completion time */
/* pack this to avoid bogus arm OABI complaints */
@@ -256,6 +257,8 @@ enum io_uring_op {
IORING_OP_FUTEX_WAITV,
IORING_OP_FIXED_FD_INSTALL,
IORING_OP_FTRUNCATE,
+ IORING_OP_BIND,
+ IORING_OP_LISTEN,
/* this goes last, obviously */
IORING_OP_LAST,
@@ -314,7 +317,7 @@ enum io_uring_op {
* ASYNC_CANCEL flags.
*
* IORING_ASYNC_CANCEL_ALL Cancel all requests that match the given key
- * IORING_ASYNC_CANCEL_FD Key off 'fd' for cancelation rather than the
+ * IORING_ASYNC_CANCEL_FD Key off 'fd' for cancelation rather than the
* request 'user_data'
* IORING_ASYNC_CANCEL_ANY Match any request
* IORING_ASYNC_CANCEL_FD_FIXED 'fd' passed in is a fixed descriptor
@@ -346,11 +349,20 @@ enum io_uring_op {
* 0 is reported if zerocopy was actually possible.
* IORING_NOTIF_USAGE_ZC_COPIED if data was copied
* (at least partially).
+ *
+ * IORING_RECVSEND_BUNDLE Used with IOSQE_BUFFER_SELECT. If set, send wil
+ * grab as many buffers from the buffer group ID
+ * given and send them all. The completion result
+ * will be the number of buffers send, with the
+ * starting buffer ID in cqe->flags as per usual
+ * for provided buffer usage. The buffers will be
+ * contigious from the starting buffer ID.
*/
#define IORING_RECVSEND_POLL_FIRST (1U << 0)
#define IORING_RECV_MULTISHOT (1U << 1)
#define IORING_RECVSEND_FIXED_BUF (1U << 2)
#define IORING_SEND_ZC_REPORT_USAGE (1U << 3)
+#define IORING_RECVSEND_BUNDLE (1U << 4)
/*
* cqe.res for IORING_CQE_F_NOTIF if
@@ -365,6 +377,8 @@ enum io_uring_op {
* accept flags stored in sqe->ioprio
*/
#define IORING_ACCEPT_MULTISHOT (1U << 0)
+#define IORING_ACCEPT_DONTWAIT (1U << 1)
+#define IORING_ACCEPT_POLL_FIRST (1U << 2)
/*
* IORING_OP_MSG_RING command types, stored in sqe->addr
@@ -392,10 +406,17 @@ enum {
#define IORING_FIXED_FD_NO_CLOEXEC (1U << 0)
/*
+ * IORING_OP_NOP flags (sqe->nop_flags)
+ *
+ * IORING_NOP_INJECT_RESULT Inject result from sqe->result
+ */
+#define IORING_NOP_INJECT_RESULT (1U << 0)
+
+/*
* IO completion data structure (Completion Queue Entry)
*/
struct io_uring_cqe {
- __u64 user_data; /* sqe->data submission passed back */
+ __u64 user_data; /* sqe->user_data value passed back */
__s32 res; /* result code for this event */
__u32 flags;
@@ -517,6 +538,7 @@ struct io_uring_params {
#define IORING_FEAT_CQE_SKIP (1U << 11)
#define IORING_FEAT_LINKED_FILE (1U << 12)
#define IORING_FEAT_REG_REG_RING (1U << 13)
+#define IORING_FEAT_RECVSEND_BUNDLE (1U << 14)
/*
* io_uring_register(2) opcodes and arguments
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 49d8c7ed72..37aba1d0b4 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 6
+#define IO_URING_VERSION_MINOR 7
#endif
diff --git a/contrib/libs/liburing/src/setup.c b/contrib/libs/liburing/src/setup.c
index 0d33f65aae..aa0fcaaaa5 100644
--- a/contrib/libs/liburing/src/setup.c
+++ b/contrib/libs/liburing/src/setup.c
@@ -200,6 +200,8 @@ __cold int io_uring_ring_dontfork(struct io_uring *ring)
/* FIXME */
static size_t huge_page_size = 2 * 1024 * 1024;
+#define KRING_SIZE 64
+
/*
* Returns negative for error, or number of bytes used in the buffer on success
*/
@@ -209,7 +211,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;
+ size_t ring_mem, sqes_mem, cqes_mem;
unsigned long mem_used = 0;
void *ptr;
int ret;
@@ -218,14 +220,18 @@ static int io_uring_alloc_huge(unsigned entries, struct io_uring_params *p,
if (ret)
return ret;
+ ring_mem = KRING_SIZE;
+
sqes_mem = sq_entries * sizeof(struct io_uring_sqe);
sqes_mem = (sqes_mem + page_size - 1) & ~(page_size - 1);
- ring_mem = cq_entries * sizeof(struct io_uring_cqe);
- if (p->flags & IORING_SETUP_CQE32)
- ring_mem *= 2;
if (!(p->flags & IORING_SETUP_NO_SQARRAY))
- ring_mem += sq_entries * sizeof(unsigned);
- mem_used = sqes_mem + ring_mem;
+ sqes_mem += sq_entries * sizeof(unsigned);
+
+ cqes_mem = cq_entries * sizeof(struct io_uring_cqe);
+ if (p->flags & IORING_SETUP_CQE32)
+ cqes_mem *= 2;
+ ring_mem += sqes_mem + cqes_mem;
+ mem_used = ring_mem;
mem_used = (mem_used + page_size - 1) & ~(page_size - 1);
/*
@@ -499,8 +505,6 @@ static size_t npages(size_t size, long page_size)
return __fls((int) size);
}
-#define KRING_SIZE 320
-
static size_t rings_size(struct io_uring_params *p, unsigned entries,
unsigned cq_entries, long page_size)
{
diff --git a/contrib/libs/liburing/test/232c93d07b74.t/ya.make b/contrib/libs/liburing/test/232c93d07b74.t/ya.make
index 9872dbc87f..b1d0260eef 100644
--- a/contrib/libs/liburing/test/232c93d07b74.t/ya.make
+++ b/contrib/libs/liburing/test/232c93d07b74.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/35fa71a030ca.t/ya.make b/contrib/libs/liburing/test/35fa71a030ca.t/ya.make
index 47127daf43..38988d083d 100644
--- a/contrib/libs/liburing/test/35fa71a030ca.t/ya.make
+++ b/contrib/libs/liburing/test/35fa71a030ca.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/500f9fbadef8.t/ya.make b/contrib/libs/liburing/test/500f9fbadef8.t/ya.make
index 5812da208b..f4f3bdc390 100644
--- a/contrib/libs/liburing/test/500f9fbadef8.t/ya.make
+++ b/contrib/libs/liburing/test/500f9fbadef8.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/7ad0e4b2f83c.t/ya.make b/contrib/libs/liburing/test/7ad0e4b2f83c.t/ya.make
index 3ca468c7ca..681c052f9f 100644
--- a/contrib/libs/liburing/test/7ad0e4b2f83c.t/ya.make
+++ b/contrib/libs/liburing/test/7ad0e4b2f83c.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/8a9973408177.t/ya.make b/contrib/libs/liburing/test/8a9973408177.t/ya.make
index 04e50f0af5..fdab64253a 100644
--- a/contrib/libs/liburing/test/8a9973408177.t/ya.make
+++ b/contrib/libs/liburing/test/8a9973408177.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/917257daa0fe.t/ya.make b/contrib/libs/liburing/test/917257daa0fe.t/ya.make
index 071894eada..b7cf6b187d 100644
--- a/contrib/libs/liburing/test/917257daa0fe.t/ya.make
+++ b/contrib/libs/liburing/test/917257daa0fe.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/a0908ae19763.t/ya.make b/contrib/libs/liburing/test/a0908ae19763.t/ya.make
index 8be6e50d55..c6aca489f1 100644
--- a/contrib/libs/liburing/test/a0908ae19763.t/ya.make
+++ b/contrib/libs/liburing/test/a0908ae19763.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/a4c0b3decb33.t/ya.make b/contrib/libs/liburing/test/a4c0b3decb33.t/ya.make
index c0ef350da3..f73ec56c45 100644
--- a/contrib/libs/liburing/test/a4c0b3decb33.t/ya.make
+++ b/contrib/libs/liburing/test/a4c0b3decb33.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/accept-link.t/ya.make b/contrib/libs/liburing/test/accept-link.t/ya.make
index ac5f9b5c6d..9a7e139107 100644
--- a/contrib/libs/liburing/test/accept-link.t/ya.make
+++ b/contrib/libs/liburing/test/accept-link.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/accept-non-empty.c b/contrib/libs/liburing/test/accept-non-empty.c
new file mode 100644
index 0000000000..f85f30ca87
--- /dev/null
+++ b/contrib/libs/liburing/test/accept-non-empty.c
@@ -0,0 +1,257 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * Check that kernels that support it will return IORING_CQE_F_SOCK_NONEMPTY
+ * on accepts requests where more connections are pending.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <assert.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/un.h>
+#include <netinet/tcp.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <pthread.h>
+
+#include "liburing.h"
+#include "helpers.h"
+
+static int no_more_accept;
+
+#define MAX_ACCEPTS 8
+
+struct data {
+ pthread_t thread;
+ pthread_barrier_t barrier;
+ pthread_barrier_t conn_barrier;
+ int connects;
+};
+
+static int start_accept_listen(int port_off, int extra_flags)
+{
+ struct sockaddr_in addr;
+ int32_t val = 1;
+ int fd, ret;
+
+ fd = socket(AF_INET, SOCK_STREAM | extra_flags, IPPROTO_TCP);
+
+ ret = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
+ assert(ret != -1);
+ ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+ assert(ret != -1);
+
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(0x1235 + port_off);
+ addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+
+ ret = bind(fd, (struct sockaddr *) &addr, sizeof(addr));
+ assert(ret != -1);
+ ret = listen(fd, 20000);
+ assert(ret != -1);
+
+ return fd;
+}
+
+static int test_maccept(struct data *d, int flags, int fixed)
+{
+ struct io_uring_params p = { };
+ struct io_uring ring;
+ struct io_uring_cqe *cqe;
+ struct io_uring_sqe *sqe;
+ int err = 0, fd, ret, i, *fds;
+
+ p.flags = flags;
+ ret = io_uring_queue_init_params(8, &ring, &p);
+ if (ret == -EINVAL) {
+ return T_EXIT_SKIP;
+ } else if (ret < 0) {
+ fprintf(stderr, "ring setup failure: %d\n", ret);
+ return T_EXIT_FAIL;
+ }
+
+ if (!(p.features & IORING_FEAT_RECVSEND_BUNDLE)) {
+ no_more_accept = 1;
+ return 0;
+ }
+
+ fds = malloc(MAX_ACCEPTS * sizeof(int));
+ memset(fds, -1, MAX_ACCEPTS * sizeof(int));
+
+ if (fixed) {
+ io_uring_register_ring_fd(&ring);
+
+ ret = io_uring_register_files(&ring, fds, MAX_ACCEPTS);
+ if (ret) {
+ fprintf(stderr, "file reg %d\n", ret);
+ return -1;
+ }
+ }
+
+ fd = start_accept_listen(0, 0);
+
+ pthread_barrier_wait(&d->barrier);
+
+ if (d->connects > 1)
+ pthread_barrier_wait(&d->conn_barrier);
+
+ for (i = 0; i < d->connects; i++) {
+ sqe = io_uring_get_sqe(&ring);
+ if (fixed)
+ io_uring_prep_accept_direct(sqe, fd, NULL, NULL, 0, i);
+ else
+ io_uring_prep_accept(sqe, fd, NULL, NULL, 0);
+
+ ret = io_uring_submit_and_wait(&ring, 1);
+ assert(ret != -1);
+
+ ret = io_uring_wait_cqe(&ring, &cqe);
+ assert(!ret);
+ if (cqe->res < 0) {
+ fprintf(stderr, "res=%d\n", cqe->res);
+ break;
+ }
+ fds[i] = cqe->res;
+ if (d->connects == 1) {
+ if (cqe->flags & IORING_CQE_F_SOCK_NONEMPTY) {
+ fprintf(stderr, "Non-empty sock on single?\n");
+ err = 1;
+ break;
+ }
+ } else {
+ int last = i + 1 == d->connects;
+
+ if (last && cqe->flags & IORING_CQE_F_SOCK_NONEMPTY) {
+ fprintf(stderr, "Non-empty sock on last?\n");
+ err = 1;
+ break;
+ } else if (!last && !(cqe->flags & IORING_CQE_F_SOCK_NONEMPTY)) {
+ fprintf(stderr, "Empty on multi connect?\n");
+ err = 1;
+ break;
+ }
+ }
+ io_uring_cqe_seen(&ring, cqe);
+ }
+
+ close(fd);
+ if (!fixed) {
+ for (i = 0; i < MAX_ACCEPTS; i++)
+ if (fds[i] != -1)
+ close(fds[i]);
+ }
+ free(fds);
+ io_uring_queue_exit(&ring);
+ return err;
+}
+
+static void *connect_fn(void *data)
+{
+ struct sockaddr_in addr = { };
+ struct data *d = data;
+ int i;
+
+ pthread_barrier_wait(&d->barrier);
+
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(0x1235);
+ addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+
+ for (i = 0; i < d->connects; i++) {
+ int s;
+
+ s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (s < 0) {
+ perror("socket");
+ break;
+ }
+ if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+ perror("connect");
+ break;
+ }
+ }
+
+ if (d->connects > 1)
+ pthread_barrier_wait(&d->conn_barrier);
+
+ return NULL;
+}
+
+static void setup_thread(struct data *d, int nconns)
+{
+ d->connects = nconns;
+ pthread_barrier_init(&d->barrier, NULL, 2);
+ pthread_barrier_init(&d->conn_barrier, NULL, 2);
+ pthread_create(&d->thread, NULL, connect_fn, d);
+}
+
+static int test(int flags, int fixed)
+{
+ struct data d;
+ void *tret;
+ int ret;
+
+ setup_thread(&d, 1);
+ ret = test_maccept(&d, flags, fixed);
+ if (ret) {
+ fprintf(stderr, "test conns=1 failed\n");
+ return ret;
+ }
+ if (no_more_accept)
+ return T_EXIT_SKIP;
+
+ pthread_join(d.thread, &tret);
+
+ setup_thread(&d, MAX_ACCEPTS);
+ ret = test_maccept(&d, flags, fixed);
+ if (ret) {
+ fprintf(stderr, "test conns=MAX failed\n");
+ return ret;
+ }
+
+ pthread_join(d.thread, &tret);
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ int ret;
+
+ if (argc > 1)
+ return T_EXIT_SKIP;
+
+ ret = test(0, 0);
+ if (no_more_accept)
+ return T_EXIT_SKIP;
+ if (ret) {
+ fprintf(stderr, "test 0 0 failed\n");
+ return ret;
+ }
+
+ ret = test(IORING_SETUP_SINGLE_ISSUER|IORING_SETUP_DEFER_TASKRUN, 0);
+ if (ret) {
+ fprintf(stderr, "test DEFER 0 failed\n");
+ return ret;
+ }
+
+ ret = test(0, 1);
+ if (ret) {
+ fprintf(stderr, "test 0 1 failed\n");
+ return ret;
+ }
+
+ ret = test(IORING_SETUP_SINGLE_ISSUER|IORING_SETUP_DEFER_TASKRUN, 1);
+ if (ret) {
+ fprintf(stderr, "test DEFER 1 failed\n");
+ return ret;
+ }
+
+ return 0;
+}
diff --git a/contrib/libs/liburing/test/accept-non-empty.t/ya.make b/contrib/libs/liburing/test/accept-non-empty.t/ya.make
new file mode 100644
index 0000000000..c6df3eb032
--- /dev/null
+++ b/contrib/libs/liburing/test/accept-non-empty.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ accept-non-empty.c
+ helpers.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/accept-reuse.t/ya.make b/contrib/libs/liburing/test/accept-reuse.t/ya.make
index 7ad6187e2d..6624289a0e 100644
--- a/contrib/libs/liburing/test/accept-reuse.t/ya.make
+++ b/contrib/libs/liburing/test/accept-reuse.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/accept-test.t/ya.make b/contrib/libs/liburing/test/accept-test.t/ya.make
index 4f14f4a280..c82e260ee9 100644
--- a/contrib/libs/liburing/test/accept-test.t/ya.make
+++ b/contrib/libs/liburing/test/accept-test.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/accept.c b/contrib/libs/liburing/test/accept.c
index 2208a54708..49b1ca1345 100644
--- a/contrib/libs/liburing/test/accept.c
+++ b/contrib/libs/liburing/test/accept.c
@@ -432,7 +432,7 @@ struct test_accept_many_args {
};
/*
- * Test issue many accepts and see if we handle cancellation on exit
+ * Test issue many accepts and see if we handle cancelation on exit
*/
static int test_accept_many(struct test_accept_many_args args)
{
@@ -487,7 +487,7 @@ static int test_accept_many(struct test_accept_many_args args)
if (io_uring_peek_cqe(&m_io_uring, &cqe))
break;
if (cqe->res != -ECANCELED) {
- fprintf(stderr, "Expected cqe to be cancelled %d\n", cqe->res);
+ fprintf(stderr, "Expected cqe to be canceled %d\n", cqe->res);
ret = 1;
goto out;
}
diff --git a/contrib/libs/liburing/test/accept.t/ya.make b/contrib/libs/liburing/test/accept.t/ya.make
index 25632aeb5f..95bb00c414 100644
--- a/contrib/libs/liburing/test/accept.t/ya.make
+++ b/contrib/libs/liburing/test/accept.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/across-fork.t/ya.make b/contrib/libs/liburing/test/across-fork.t/ya.make
index c8257c2316..1b12588baf 100644
--- a/contrib/libs/liburing/test/across-fork.t/ya.make
+++ b/contrib/libs/liburing/test/across-fork.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/b19062a56726.t/ya.make b/contrib/libs/liburing/test/b19062a56726.t/ya.make
index 98ff484e7c..5c7a8603ad 100644
--- a/contrib/libs/liburing/test/b19062a56726.t/ya.make
+++ b/contrib/libs/liburing/test/b19062a56726.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/b5837bd5311d.t/ya.make b/contrib/libs/liburing/test/b5837bd5311d.t/ya.make
index 4d57ddd1a9..74e7ca4d07 100644
--- a/contrib/libs/liburing/test/b5837bd5311d.t/ya.make
+++ b/contrib/libs/liburing/test/b5837bd5311d.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/bind-listen.c b/contrib/libs/liburing/test/bind-listen.c
new file mode 100644
index 0000000000..25f41b48b5
--- /dev/null
+++ b/contrib/libs/liburing/test/bind-listen.c
@@ -0,0 +1,409 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * Configure and operate a TCP socket solely with io_uring.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <liburing.h>
+#include <err.h>
+#include <sys/mman.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <netinet/ip.h>
+#include "liburing.h"
+#include "helpers.h"
+
+static void msec_to_ts(struct __kernel_timespec *ts, unsigned int msec)
+{
+ ts->tv_sec = msec / 1000;
+ ts->tv_nsec = (msec % 1000) * 1000000;
+}
+
+static const char *magic = "Hello World!";
+static int use_port = 8000;
+
+enum {
+ SRV_INDEX = 0,
+ CLI_INDEX,
+ CONN_INDEX,
+};
+
+static int connect_client(struct io_uring *ring, unsigned short peer_port)
+{
+ struct __kernel_timespec ts;
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ int head, ret, submitted = 0;
+ struct sockaddr_in peer_addr;
+ socklen_t addr_len = sizeof(peer_addr);
+
+ peer_addr.sin_family = AF_INET;
+ peer_addr.sin_port = peer_port;
+ peer_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_socket_direct(sqe, AF_INET, SOCK_STREAM, 0,
+ CLI_INDEX, 0);
+ sqe->flags |= IOSQE_IO_LINK;
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_connect(sqe, CLI_INDEX, (struct sockaddr*) &peer_addr, addr_len);
+ sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK;
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_send(sqe, CLI_INDEX, magic, strlen(magic), 0);
+ sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK;
+
+ submitted = ret = io_uring_submit(ring);
+ if (ret < 0)
+ return T_SETUP_SKIP;
+
+ msec_to_ts(&ts, 300);
+ ret = io_uring_wait_cqes(ring, &cqe, submitted, &ts, NULL);
+ if (ret < 0)
+ return T_SETUP_SKIP;
+
+ io_uring_for_each_cqe(ring, head, cqe) {
+ ret = cqe->res;
+ if (ret < 0)
+ return T_SETUP_SKIP;
+ } io_uring_cq_advance(ring, submitted);
+
+ return T_SETUP_OK;
+}
+
+static int setup_srv(struct io_uring *ring, struct sockaddr_in *server_addr)
+{
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ struct __kernel_timespec ts;
+ int ret, val, submitted;
+ unsigned head;
+
+ memset(server_addr, 0, sizeof(struct sockaddr_in));
+ server_addr->sin_family = AF_INET;
+ server_addr->sin_port = htons(use_port++);
+ server_addr->sin_addr.s_addr = htons(INADDR_ANY);
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_socket_direct(sqe, AF_INET, SOCK_STREAM, 0, SRV_INDEX, 0);
+ sqe->flags |= IOSQE_IO_LINK;
+
+ sqe = io_uring_get_sqe(ring);
+ val = 1;
+ io_uring_prep_cmd_sock(sqe, SOCKET_URING_OP_SETSOCKOPT, 0, SOL_SOCKET,
+ SO_REUSEADDR, &val, sizeof(val));
+ sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK;
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_bind(sqe, SRV_INDEX, (struct sockaddr *) server_addr,
+ sizeof(struct sockaddr_in));
+ sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK;
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_listen(sqe, SRV_INDEX, 1);
+ sqe->flags |= IOSQE_FIXED_FILE;
+
+ submitted = ret = io_uring_submit(ring);
+ if (ret < 0) {
+ fprintf(stderr, "submission failed. %d\n", ret);
+ return T_EXIT_FAIL;
+ }
+
+ msec_to_ts(&ts, 300);
+ ret = io_uring_wait_cqes(ring, &cqe, ret, &ts, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "submission failed. %d\n", ret);
+ return T_EXIT_FAIL;
+ }
+
+ io_uring_for_each_cqe(ring, head, cqe) {
+ ret = cqe->res;
+ if (ret < 0) {
+ fprintf(stderr, "Server startup failed. step %d got %d \n", head, ret);
+ return T_EXIT_FAIL;
+ }
+ } io_uring_cq_advance(ring, submitted);
+
+ return T_SETUP_OK;
+}
+
+static int test_good_server(unsigned int ring_flags)
+{
+ struct sockaddr_in server_addr;
+ struct __kernel_timespec ts;
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ struct io_uring ring;
+ int ret;
+ int fds[3];
+ char buf[1024];
+
+ memset(fds, -1, sizeof(fds));
+
+ ret = t_create_ring(10, &ring, ring_flags | IORING_SETUP_SUBMIT_ALL);
+ if (ret < 0) {
+ fprintf(stderr, "queue_init: %s\n", strerror(-ret));
+ return T_SETUP_SKIP;
+ }
+
+ ret = io_uring_register_files(&ring, fds, 3);
+ if (ret) {
+ fprintf(stderr, "server file register %d\n", ret);
+ return T_SETUP_SKIP;
+ }
+
+ ret = setup_srv(&ring, &server_addr);
+ if (ret != T_SETUP_OK) {
+ fprintf(stderr, "srv startup failed.\n");
+ return T_EXIT_FAIL;
+ }
+
+ if (connect_client(&ring, server_addr.sin_port) != T_SETUP_OK) {
+ fprintf(stderr, "cli startup failed.\n");
+ return T_SETUP_SKIP;
+ }
+
+ /* Wait for a request */
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_accept_direct(sqe, SRV_INDEX, NULL, NULL, 0, CONN_INDEX);
+ sqe->flags |= IOSQE_FIXED_FILE;
+
+ io_uring_submit(&ring);
+ io_uring_wait_cqe(&ring, &cqe);
+ if (cqe->res < 0) {
+ fprintf(stderr, "accept failed. %d\n", cqe->res);
+ return T_EXIT_FAIL;
+ }
+ io_uring_cqe_seen(&ring, cqe);
+
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_recv(sqe, CONN_INDEX, buf, BUFSIZ, 0);
+ sqe->flags |= IOSQE_FIXED_FILE;
+
+ io_uring_submit(&ring);
+ io_uring_wait_cqe_timeout(&ring, &cqe, &ts);
+
+ if (cqe->res < 0) {
+ fprintf(stderr, "bad receive cqe. %d\n", cqe->res);
+ return T_EXIT_FAIL;
+ }
+ ret = cqe->res;
+ io_uring_cqe_seen(&ring, cqe);
+
+ io_uring_queue_exit(&ring);
+
+ if (ret != strlen(magic) || strncmp(buf, magic, ret)) {
+ fprintf(stderr, "didn't receive expected string. Got %d '%s'\n", ret, buf);
+ return T_EXIT_FAIL;
+ }
+
+ return T_EXIT_PASS;
+}
+
+static int test_bad_bind(void)
+{
+ struct sockaddr_in server_addr;
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ struct io_uring ring;
+ int sock = -1, err;
+ int ret = T_EXIT_FAIL;
+
+ memset(&server_addr, 0, sizeof(struct sockaddr_in));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(9001);
+ server_addr.sin_addr.s_addr = htons(INADDR_ANY);
+
+ err = t_create_ring(1, &ring, 0);
+ if (err < 0) {
+ fprintf(stderr, "queue_init: %s\n", strerror(-ret));
+ return T_SETUP_SKIP;
+ }
+
+ sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (sock < 0) {
+ perror("socket");
+ goto fail;
+ }
+
+ /* Bind with size 0 */
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_bind(sqe, sock, (struct sockaddr *) &server_addr, 0);
+ err = io_uring_submit(&ring);
+ if (err < 0)
+ goto fail;
+
+ err = io_uring_wait_cqe(&ring, &cqe);
+ if (err)
+ goto fail;
+
+ if (cqe->res != -EINVAL)
+ goto fail;
+ io_uring_cqe_seen(&ring, cqe);
+
+ /* Bind with bad fd */
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_bind(sqe, 0, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));
+ err = io_uring_submit(&ring);
+ if (err < 0)
+ goto fail;
+
+ err = io_uring_wait_cqe(&ring, &cqe);
+ if (err)
+ goto fail;
+ if (cqe->res != -ENOTSOCK)
+ goto fail;
+ io_uring_cqe_seen(&ring, cqe);
+
+ ret = T_EXIT_PASS;
+
+ /* bind with weird value */
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_bind(sqe, sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));
+ sqe->rw_flags = 1;
+ err = io_uring_submit(&ring);
+ if (err < 0)
+ goto fail;
+
+ err = io_uring_wait_cqe(&ring, &cqe);
+ if (err)
+ goto fail;
+ if (cqe->res != -EINVAL)
+ goto fail;
+ io_uring_cqe_seen(&ring, cqe);
+
+ ret = T_EXIT_PASS;
+
+fail:
+ io_uring_queue_exit(&ring);
+ if (sock != -1)
+ close(sock);
+ return ret;
+}
+
+static int test_bad_listen(void)
+{
+ struct sockaddr_in server_addr;
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ struct io_uring ring;
+ int sock = -1, err;
+ int ret = T_EXIT_FAIL;
+
+ memset(&server_addr, 0, sizeof(struct sockaddr_in));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(8001);
+ server_addr.sin_addr.s_addr = htons(INADDR_ANY);
+
+ err = t_create_ring(1, &ring, 0);
+ if (err < 0) {
+ fprintf(stderr, "queue_init: %d\n", err);
+ return T_SETUP_SKIP;
+ }
+
+ sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (sock < 0) {
+ perror("socket");
+ goto fail;
+ }
+
+ err = t_bind_ephemeral_port(sock, &server_addr);
+ if (err) {
+ fprintf(stderr, "bind: %s\n", strerror(-err));
+ goto fail;
+ }
+
+ /* listen on bad sock */
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_listen(sqe, 0, 1);
+ err = io_uring_submit(&ring);
+ if (err < 0)
+ goto fail;
+
+ err = io_uring_wait_cqe(&ring, &cqe);
+ if (err)
+ goto fail;
+
+ if (cqe->res != -ENOTSOCK)
+ goto fail;
+ io_uring_cqe_seen(&ring, cqe);
+
+ /* listen with weird parameters */
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_listen(sqe, sock, 1);
+ sqe->addr2 = 0xffffff;
+ err = io_uring_submit(&ring);
+ if (err < 0)
+ goto fail;
+
+ err = io_uring_wait_cqe(&ring, &cqe);
+ if (err)
+ goto fail;
+
+ if (cqe->res != -EINVAL)
+ goto fail;
+ io_uring_cqe_seen(&ring, cqe);
+
+ ret = T_EXIT_PASS;
+fail:
+ io_uring_queue_exit(&ring);
+ if (sock != -1)
+ close(sock);
+ return ret;
+}
+
+int main(int argc, char *argv[])
+{
+ struct io_uring_probe *probe;
+ int ret;
+
+ if (argc > 1)
+ return 0;
+
+ /*
+ * This test is not supported on older kernels. Check for
+ * OP_LISTEN, since that is the last feature required to support
+ * it.
+ */
+ probe = io_uring_get_probe();
+ if (!probe)
+ return T_EXIT_SKIP;
+ if (!io_uring_opcode_supported(probe, IORING_OP_LISTEN))
+ return T_EXIT_SKIP;
+
+ ret = test_good_server(0);
+ if (ret) {
+ fprintf(stderr, "good 0 failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ ret = test_good_server(IORING_SETUP_SINGLE_ISSUER|IORING_SETUP_DEFER_TASKRUN);
+ if (ret) {
+ fprintf(stderr, "good defer failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ ret = test_good_server(IORING_SETUP_SQPOLL);
+ if (ret) {
+ fprintf(stderr, "good sqpoll failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ ret = test_bad_bind();
+ if (ret) {
+ fprintf(stderr, "bad bind failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ ret = test_bad_listen();
+ if (ret) {
+ fprintf(stderr, "bad listen failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ return T_EXIT_PASS;
+}
diff --git a/contrib/libs/liburing/test/bind-listen.t/ya.make b/contrib/libs/liburing/test/bind-listen.t/ya.make
new file mode 100644
index 0000000000..06ac130345
--- /dev/null
+++ b/contrib/libs/liburing/test/bind-listen.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ bind-listen.c
+ helpers.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/buf-ring-nommap.c b/contrib/libs/liburing/test/buf-ring-nommap.c
index 7624c67fa0..ac4f199c8b 100644
--- a/contrib/libs/liburing/test/buf-ring-nommap.c
+++ b/contrib/libs/liburing/test/buf-ring-nommap.c
@@ -42,10 +42,12 @@ int main(int argc, char *argv[])
if (posix_memalign(&ring_mem, 16384, 16384))
return T_EXIT_FAIL;
+ memset(ring_mem, 0, 16384);
+
p.flags = IORING_SETUP_NO_MMAP;
ret = io_uring_queue_init_mem(1, &ring, &p, ring_mem, 16384);
if (ret < 0) {
- if (ret == -EINVAL)
+ if (ret == -EINVAL || ret == -ENOMEM)
return T_EXIT_SKIP;
fprintf(stderr, "queue init failed %d\n", ret);
return T_EXIT_FAIL;
diff --git a/contrib/libs/liburing/test/buf-ring-nommap.t/ya.make b/contrib/libs/liburing/test/buf-ring-nommap.t/ya.make
index d2a66cb153..1acf0938dc 100644
--- a/contrib/libs/liburing/test/buf-ring-nommap.t/ya.make
+++ b/contrib/libs/liburing/test/buf-ring-nommap.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/buf-ring-put.t/ya.make b/contrib/libs/liburing/test/buf-ring-put.t/ya.make
index 05a9f0e704..f8f026e2a2 100644
--- a/contrib/libs/liburing/test/buf-ring-put.t/ya.make
+++ b/contrib/libs/liburing/test/buf-ring-put.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/buf-ring.c b/contrib/libs/liburing/test/buf-ring.c
index 682a97ec28..526dddaddc 100644
--- a/contrib/libs/liburing/test/buf-ring.c
+++ b/contrib/libs/liburing/test/buf-ring.c
@@ -304,16 +304,16 @@ static int test_running(int bgid, int entries, int loops, int use_mmap)
ret = t_create_ring(1, &ring, 0);
if (ret == T_SETUP_SKIP)
- return 0;
+ return T_EXIT_SKIP;
else if (ret != T_SETUP_OK)
- return 1;
+ return T_EXIT_FAIL;
if (!use_mmap) {
br = io_uring_setup_buf_ring(&ring, entries, bgid, 0, &ret);
if (!br) {
/* by now should have checked if this is supported or not */
fprintf(stderr, "Buffer ring register failed %d\n", ret);
- return 1;
+ return T_EXIT_FAIL;
}
} else {
struct io_uring_buf_reg reg = {
@@ -326,8 +326,10 @@ static int test_running(int bgid, int entries, int loops, int use_mmap)
ret = io_uring_register_buf_ring(&ring, &reg, 0);
if (ret) {
+ if (ret == -EINVAL)
+ return T_EXIT_SKIP;
fprintf(stderr, "mmap ring register failed %d\n", ret);
- return 1;
+ return T_EXIT_FAIL;
}
off = IORING_OFF_PBUF_RING |
@@ -337,17 +339,17 @@ static int test_running(int bgid, int entries, int loops, int use_mmap)
MAP_SHARED | MAP_POPULATE, ring.ring_fd, off);
if (br == MAP_FAILED) {
perror("mmap");
- return 1;
+ return T_EXIT_FAIL;
}
}
buffers = malloc(sizeof(bool) * entries);
if (!buffers)
- return 1;
+ return T_EXIT_SKIP;
read_fd = open("/dev/zero", O_RDONLY);
if (read_fd < 0)
- return 1;
+ return T_EXIT_SKIP;
for (loop = 0; loop < loops; loop++) {
memset(buffers, 0, sizeof(bool) * entries);
@@ -360,28 +362,28 @@ static int test_running(int bgid, int entries, int loops, int use_mmap)
ret = test_one_read(read_fd, bgid, &ring);
if (ret < 0) {
fprintf(stderr, "bad run %d/%d = %d\n", loop, idx, ret);
- return ret;
+ return T_EXIT_FAIL;
}
if (buffers[ret]) {
fprintf(stderr, "reused buffer %d/%d = %d!\n", loop, idx, ret);
- return 1;
+ return T_EXIT_FAIL;
}
if (buffer[0] != 0) {
fprintf(stderr, "unexpected read %d %d/%d = %d!\n",
(int)buffer[0], loop, idx, ret);
- return 1;
+ return T_EXIT_FAIL;
}
if (buffer[1] != 1) {
fprintf(stderr, "unexpected spilled read %d %d/%d = %d!\n",
(int)buffer[1], loop, idx, ret);
- return 1;
+ return T_EXIT_FAIL;
}
buffers[ret] = true;
}
ret = test_one_read(read_fd, bgid, &ring);
if (ret != -ENOBUFS) {
fprintf(stderr, "expected enobufs run %d = %d\n", loop, ret);
- return 1;
+ return T_EXIT_FAIL;
}
}
@@ -389,13 +391,13 @@ static int test_running(int bgid, int entries, int loops, int use_mmap)
ret = io_uring_unregister_buf_ring(&ring, bgid);
if (ret) {
fprintf(stderr, "Buffer ring register failed %d\n", ret);
- return 1;
+ return T_EXIT_FAIL;
}
close(read_fd);
io_uring_queue_exit(&ring);
free(buffers);
- return 0;
+ return T_EXIT_PASS;
}
int main(int argc, char *argv[])
@@ -459,7 +461,9 @@ int main(int argc, char *argv[])
for (i = 0; !no_buf_ring && entries[i] != -1; i++) {
ret = test_running(2, entries[i], 3, 1);
- if (ret) {
+ if (ret == T_EXIT_SKIP) {
+ break;
+ } else if (ret != T_EXIT_PASS) {
fprintf(stderr, "test_running(%d) mmap failed\n", entries[i]);
return T_EXIT_FAIL;
}
diff --git a/contrib/libs/liburing/test/buf-ring.t/ya.make b/contrib/libs/liburing/test/buf-ring.t/ya.make
index 0b49f68bed..63b3bac811 100644
--- a/contrib/libs/liburing/test/buf-ring.t/ya.make
+++ b/contrib/libs/liburing/test/buf-ring.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/ce593a6c480a.t/ya.make b/contrib/libs/liburing/test/ce593a6c480a.t/ya.make
index c4c7dd2bbd..2a1a37f183 100644
--- a/contrib/libs/liburing/test/ce593a6c480a.t/ya.make
+++ b/contrib/libs/liburing/test/ce593a6c480a.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/close-opath.t/ya.make b/contrib/libs/liburing/test/close-opath.t/ya.make
index 9583b3d9f2..0f156c6373 100644
--- a/contrib/libs/liburing/test/close-opath.t/ya.make
+++ b/contrib/libs/liburing/test/close-opath.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/connect-rep.t/ya.make b/contrib/libs/liburing/test/connect-rep.t/ya.make
index d4695ed765..4a22b223ac 100644
--- a/contrib/libs/liburing/test/connect-rep.t/ya.make
+++ b/contrib/libs/liburing/test/connect-rep.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/connect.t/ya.make b/contrib/libs/liburing/test/connect.t/ya.make
index 1015f24ef4..15d4aeedae 100644
--- a/contrib/libs/liburing/test/connect.t/ya.make
+++ b/contrib/libs/liburing/test/connect.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/coredump.c b/contrib/libs/liburing/test/coredump.c
index 44e2817897..d390b78be9 100644
--- a/contrib/libs/liburing/test/coredump.c
+++ b/contrib/libs/liburing/test/coredump.c
@@ -56,5 +56,6 @@ int main(int argc, char *argv[])
}
wait(&wstat);
+ unlink("core");
return T_EXIT_PASS;
}
diff --git a/contrib/libs/liburing/test/coredump.t/ya.make b/contrib/libs/liburing/test/coredump.t/ya.make
index 25cf3a3447..cad32c9a7b 100644
--- a/contrib/libs/liburing/test/coredump.t/ya.make
+++ b/contrib/libs/liburing/test/coredump.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/cq-full.t/ya.make b/contrib/libs/liburing/test/cq-full.t/ya.make
index 4b4463eca6..3ac0b9d38b 100644
--- a/contrib/libs/liburing/test/cq-full.t/ya.make
+++ b/contrib/libs/liburing/test/cq-full.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/cq-overflow.t/ya.make b/contrib/libs/liburing/test/cq-overflow.t/ya.make
index 4e68b4391d..4d67475587 100644
--- a/contrib/libs/liburing/test/cq-overflow.t/ya.make
+++ b/contrib/libs/liburing/test/cq-overflow.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/cq-peek-batch.t/ya.make b/contrib/libs/liburing/test/cq-peek-batch.t/ya.make
index d086bff60c..608e643c84 100644
--- a/contrib/libs/liburing/test/cq-peek-batch.t/ya.make
+++ b/contrib/libs/liburing/test/cq-peek-batch.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/cq-ready.t/ya.make b/contrib/libs/liburing/test/cq-ready.t/ya.make
index 37dc4451a9..e3ec30727e 100644
--- a/contrib/libs/liburing/test/cq-ready.t/ya.make
+++ b/contrib/libs/liburing/test/cq-ready.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/cq-size.t/ya.make b/contrib/libs/liburing/test/cq-size.t/ya.make
index 3111b101e9..5f6423089a 100644
--- a/contrib/libs/liburing/test/cq-size.t/ya.make
+++ b/contrib/libs/liburing/test/cq-size.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/d4ae271dfaae.t/ya.make b/contrib/libs/liburing/test/d4ae271dfaae.t/ya.make
index b162415697..30095cf271 100644
--- a/contrib/libs/liburing/test/d4ae271dfaae.t/ya.make
+++ b/contrib/libs/liburing/test/d4ae271dfaae.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/d77a67ed5f27.t/ya.make b/contrib/libs/liburing/test/d77a67ed5f27.t/ya.make
index f32a909fb2..d8eac8b261 100644
--- a/contrib/libs/liburing/test/d77a67ed5f27.t/ya.make
+++ b/contrib/libs/liburing/test/d77a67ed5f27.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/defer-taskrun.t/ya.make b/contrib/libs/liburing/test/defer-taskrun.t/ya.make
index 4c700d9fc8..a4303270da 100644
--- a/contrib/libs/liburing/test/defer-taskrun.t/ya.make
+++ b/contrib/libs/liburing/test/defer-taskrun.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/defer-tw-timeout.c b/contrib/libs/liburing/test/defer-tw-timeout.c
index ea06e19243..b3489abe62 100644
--- a/contrib/libs/liburing/test/defer-tw-timeout.c
+++ b/contrib/libs/liburing/test/defer-tw-timeout.c
@@ -100,6 +100,11 @@ static int test_file(struct io_uring *ring, char *__fname)
fd = open(fname, O_RDONLY | O_DIRECT);
if (fd < 0) {
+ if (errno == EINVAL) {
+ if (!__fname)
+ unlink(fname);
+ return T_EXIT_SKIP;
+ }
perror("open");
if (!__fname)
unlink(fname);
diff --git a/contrib/libs/liburing/test/defer-tw-timeout.t/ya.make b/contrib/libs/liburing/test/defer-tw-timeout.t/ya.make
index cbb1281cb3..e255116361 100644
--- a/contrib/libs/liburing/test/defer-tw-timeout.t/ya.make
+++ b/contrib/libs/liburing/test/defer-tw-timeout.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/defer.c b/contrib/libs/liburing/test/defer.c
index c1e7478906..1e52dcbf4e 100644
--- a/contrib/libs/liburing/test/defer.c
+++ b/contrib/libs/liburing/test/defer.c
@@ -89,7 +89,7 @@ static int wait_cqes(struct test_context *ctx)
return 0;
}
-static int test_cancelled_userdata(struct io_uring *ring)
+static int test_canceled_userdata(struct io_uring *ring)
{
struct test_context ctx;
int ret, i, nr = 100;
@@ -277,9 +277,9 @@ int main(int argc, char *argv[])
}
- ret = test_cancelled_userdata(&poll_ring);
+ ret = test_canceled_userdata(&poll_ring);
if (ret) {
- printf("test_cancelled_userdata failed\n");
+ printf("test_canceled_userdata failed\n");
return ret;
}
diff --git a/contrib/libs/liburing/test/defer.t/ya.make b/contrib/libs/liburing/test/defer.t/ya.make
index 5687a37df9..1a043bd93a 100644
--- a/contrib/libs/liburing/test/defer.t/ya.make
+++ b/contrib/libs/liburing/test/defer.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/double-poll-crash.t/ya.make b/contrib/libs/liburing/test/double-poll-crash.t/ya.make
index 95a6a129fb..69683beddc 100644
--- a/contrib/libs/liburing/test/double-poll-crash.t/ya.make
+++ b/contrib/libs/liburing/test/double-poll-crash.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/drop-submit.t/ya.make b/contrib/libs/liburing/test/drop-submit.t/ya.make
index 86ec81b668..709c282398 100644
--- a/contrib/libs/liburing/test/drop-submit.t/ya.make
+++ b/contrib/libs/liburing/test/drop-submit.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/eeed8b54e0df.t/ya.make b/contrib/libs/liburing/test/eeed8b54e0df.t/ya.make
index 5c66505da1..a602da28d2 100644
--- a/contrib/libs/liburing/test/eeed8b54e0df.t/ya.make
+++ b/contrib/libs/liburing/test/eeed8b54e0df.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/empty-eownerdead.t/ya.make b/contrib/libs/liburing/test/empty-eownerdead.t/ya.make
index d86f7a8c53..412814da83 100644
--- a/contrib/libs/liburing/test/empty-eownerdead.t/ya.make
+++ b/contrib/libs/liburing/test/empty-eownerdead.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/eploop.t/ya.make b/contrib/libs/liburing/test/eploop.t/ya.make
index bad82c6f00..6461e6be2c 100644
--- a/contrib/libs/liburing/test/eploop.t/ya.make
+++ b/contrib/libs/liburing/test/eploop.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/eventfd-disable.t/ya.make b/contrib/libs/liburing/test/eventfd-disable.t/ya.make
index 16d29b9d5f..01b42db6c5 100644
--- a/contrib/libs/liburing/test/eventfd-disable.t/ya.make
+++ b/contrib/libs/liburing/test/eventfd-disable.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/eventfd-reg.t/ya.make b/contrib/libs/liburing/test/eventfd-reg.t/ya.make
index c3dc596dbb..193586f9bc 100644
--- a/contrib/libs/liburing/test/eventfd-reg.t/ya.make
+++ b/contrib/libs/liburing/test/eventfd-reg.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/eventfd-ring.t/ya.make b/contrib/libs/liburing/test/eventfd-ring.t/ya.make
index 86ff0dac1a..45d2e55520 100644
--- a/contrib/libs/liburing/test/eventfd-ring.t/ya.make
+++ b/contrib/libs/liburing/test/eventfd-ring.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/eventfd.t/ya.make b/contrib/libs/liburing/test/eventfd.t/ya.make
index e78b4c5ee6..b64217ee96 100644
--- a/contrib/libs/liburing/test/eventfd.t/ya.make
+++ b/contrib/libs/liburing/test/eventfd.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/evloop.t/ya.make b/contrib/libs/liburing/test/evloop.t/ya.make
index b46c369692..a5c92be9ca 100644
--- a/contrib/libs/liburing/test/evloop.t/ya.make
+++ b/contrib/libs/liburing/test/evloop.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/exec-target.t/ya.make b/contrib/libs/liburing/test/exec-target.t/ya.make
index 29ea06a2a2..b47e7f3a0f 100644
--- a/contrib/libs/liburing/test/exec-target.t/ya.make
+++ b/contrib/libs/liburing/test/exec-target.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/exit-no-cleanup.t/ya.make b/contrib/libs/liburing/test/exit-no-cleanup.t/ya.make
index 61df6fe9e3..6043dd7ec9 100644
--- a/contrib/libs/liburing/test/exit-no-cleanup.t/ya.make
+++ b/contrib/libs/liburing/test/exit-no-cleanup.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fadvise.t/ya.make b/contrib/libs/liburing/test/fadvise.t/ya.make
index 3e4e506212..05e6a24928 100644
--- a/contrib/libs/liburing/test/fadvise.t/ya.make
+++ b/contrib/libs/liburing/test/fadvise.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fallocate.t/ya.make b/contrib/libs/liburing/test/fallocate.t/ya.make
index efad14c2b1..93b93c9d99 100644
--- a/contrib/libs/liburing/test/fallocate.t/ya.make
+++ b/contrib/libs/liburing/test/fallocate.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fc2a85cb02ef.t/ya.make b/contrib/libs/liburing/test/fc2a85cb02ef.t/ya.make
index d533701f7d..96ffd42829 100644
--- a/contrib/libs/liburing/test/fc2a85cb02ef.t/ya.make
+++ b/contrib/libs/liburing/test/fc2a85cb02ef.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fd-install.t/ya.make b/contrib/libs/liburing/test/fd-install.t/ya.make
index 6c1ec8c557..55f72f4d28 100644
--- a/contrib/libs/liburing/test/fd-install.t/ya.make
+++ b/contrib/libs/liburing/test/fd-install.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fd-pass.t/ya.make b/contrib/libs/liburing/test/fd-pass.t/ya.make
index 4128e73ab7..d7cf684aab 100644
--- a/contrib/libs/liburing/test/fd-pass.t/ya.make
+++ b/contrib/libs/liburing/test/fd-pass.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/file-register.t/ya.make b/contrib/libs/liburing/test/file-register.t/ya.make
index f8d8fa2d28..f7bc1cd23d 100644
--- a/contrib/libs/liburing/test/file-register.t/ya.make
+++ b/contrib/libs/liburing/test/file-register.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/file-update.t/ya.make b/contrib/libs/liburing/test/file-update.t/ya.make
index f7c0c714c0..67491db91c 100644
--- a/contrib/libs/liburing/test/file-update.t/ya.make
+++ b/contrib/libs/liburing/test/file-update.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/file-verify.t/ya.make b/contrib/libs/liburing/test/file-verify.t/ya.make
index b596c57a00..263b811e95 100644
--- a/contrib/libs/liburing/test/file-verify.t/ya.make
+++ b/contrib/libs/liburing/test/file-verify.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/files-exit-hang-poll.t/ya.make b/contrib/libs/liburing/test/files-exit-hang-poll.t/ya.make
index 3a0385b215..cf7bf1f7b9 100644
--- a/contrib/libs/liburing/test/files-exit-hang-poll.t/ya.make
+++ b/contrib/libs/liburing/test/files-exit-hang-poll.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/files-exit-hang-timeout.t/ya.make b/contrib/libs/liburing/test/files-exit-hang-timeout.t/ya.make
index f2c9ecc6d5..e91c801769 100644
--- a/contrib/libs/liburing/test/files-exit-hang-timeout.t/ya.make
+++ b/contrib/libs/liburing/test/files-exit-hang-timeout.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fixed-buf-iter.t/ya.make b/contrib/libs/liburing/test/fixed-buf-iter.t/ya.make
index 4fc19f8968..f4ea025d7f 100644
--- a/contrib/libs/liburing/test/fixed-buf-iter.t/ya.make
+++ b/contrib/libs/liburing/test/fixed-buf-iter.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fixed-buf-merge.c b/contrib/libs/liburing/test/fixed-buf-merge.c
index e75948fa79..ed2e821557 100644
--- a/contrib/libs/liburing/test/fixed-buf-merge.c
+++ b/contrib/libs/liburing/test/fixed-buf-merge.c
@@ -37,6 +37,10 @@ int main(int argc, char *argv[])
fd = open(filename, O_RDONLY | O_DIRECT, 0644);
if (fd < 0) {
+ if (errno == EINVAL) {
+ unlink(filename);
+ return T_EXIT_SKIP;
+ }
perror("open");
goto err_unlink;
}
diff --git a/contrib/libs/liburing/test/fixed-buf-merge.t/ya.make b/contrib/libs/liburing/test/fixed-buf-merge.t/ya.make
index a652ef940d..78178231cc 100644
--- a/contrib/libs/liburing/test/fixed-buf-merge.t/ya.make
+++ b/contrib/libs/liburing/test/fixed-buf-merge.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fixed-hugepage.c b/contrib/libs/liburing/test/fixed-hugepage.c
new file mode 100644
index 0000000000..bbc28bb8a6
--- /dev/null
+++ b/contrib/libs/liburing/test/fixed-hugepage.c
@@ -0,0 +1,412 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * Test fixed buffers consisting of hugepages.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <linux/mman.h>
+
+#include "liburing.h"
+#include "helpers.h"
+
+/*
+ * Before testing
+ * echo (>=4) > /proc/sys/vm/nr_hugepages
+ * echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
+ * echo always > /sys/kernel/mm/transparent_hugepage/hugepages-16kB/enabled
+ *
+ * Not 100% guaranteed to get THP-backed memory, but in general it does.
+ */
+#define MTHP_16KB (16UL * 1024)
+#define HUGEPAGE_SIZE (2UL * 1024 * 1024)
+#define NR_BUFS 1
+#define IN_FD "/dev/urandom"
+#define OUT_FD "/dev/zero"
+
+static int open_files(char *fname_in, int *fd_in, int *fd_out)
+{
+ *fd_in = open(fname_in, O_RDONLY, 0644);
+ if (*fd_in < 0) {
+ printf("open %s failed\n", fname_in);
+ return -1;
+ }
+
+ *fd_out = open(OUT_FD, O_RDWR, 0644);
+ if (*fd_out < 0) {
+ printf("open %s failed\n", OUT_FD);
+ return -1;
+ }
+
+ return 0;
+}
+
+static void unmap(struct iovec *iov, int nr_bufs, size_t offset)
+{
+ int i;
+
+ for (i = 0; i < nr_bufs; i++)
+ munmap(iov[i].iov_base - offset, iov[i].iov_len + offset);
+}
+
+static int mmap_hugebufs(struct iovec *iov, int nr_bufs, size_t buf_size, size_t offset)
+{
+ int i;
+
+ for (i = 0; i < nr_bufs; i++) {
+ void *base = NULL;
+
+ base = mmap(NULL, buf_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
+ if (base == MAP_FAILED) {
+ printf("Unable to map hugetlb page. Try increasing the "
+ "value in /proc/sys/vm/nr_hugepages\n");
+ unmap(iov, i, offset);
+ return -1;
+ }
+
+ memset(base, 0, buf_size);
+ iov[i].iov_base = base + offset;
+ iov[i].iov_len = buf_size - offset;
+ }
+
+ return 0;
+}
+
+/* map a hugepage and smaller page to a contiguous memory */
+static int mmap_mixture(struct iovec *iov, int nr_bufs, size_t buf_size, bool huge_on_left)
+{
+ int i;
+ void *small_base = NULL, *huge_base = NULL, *start = NULL,
+ *huge_start = NULL, *small_start = NULL;
+ size_t small_size = buf_size - HUGEPAGE_SIZE;
+ size_t seg_size = ((buf_size / HUGEPAGE_SIZE) + 1) * HUGEPAGE_SIZE;
+
+ start = mmap(NULL, seg_size * nr_bufs, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
+ if (start == MAP_FAILED) {
+ printf("Unable to preserve the page mixture memory. "
+ "Try increasing the RLIMIT_MEMLOCK resource limit\n");
+ return -1;
+ }
+
+ for (i = 0; i < nr_bufs; i++) {
+ if (huge_on_left) {
+ huge_start = start;
+ small_start = start + HUGEPAGE_SIZE;
+ } else {
+ huge_start = start + HUGEPAGE_SIZE;
+ small_start = start + HUGEPAGE_SIZE - small_size;
+ }
+
+ huge_base = mmap(huge_start, HUGEPAGE_SIZE, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED, -1, 0);
+ if (huge_base == MAP_FAILED) {
+ printf("Unable to map hugetlb page in the page mixture. "
+ "Try increasing the value in /proc/sys/vm/nr_hugepages\n");
+ unmap(iov, nr_bufs, 0);
+ return -1;
+ }
+
+ small_base = mmap(small_start, small_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+ if (small_base == MAP_FAILED) {
+ printf("Unable to map small page in the page mixture. "
+ "Try increasing the RLIMIT_MEMLOCK resource limit\n");
+ unmap(iov, nr_bufs, 0);
+ return -1;
+ }
+
+ if (huge_on_left) {
+ iov[i].iov_base = huge_base;
+ memset(huge_base, 0, buf_size);
+ }
+ else {
+ iov[i].iov_base = small_base;
+ memset(small_base, 0, buf_size);
+ }
+ iov[i].iov_len = buf_size;
+ start += seg_size;
+ }
+
+ return 0;
+}
+
+static void free_bufs(struct iovec *iov, int nr_bufs, size_t offset)
+{
+ int i;
+
+ for (i = 0; i < nr_bufs; i++)
+ free(iov[i].iov_base - offset);
+}
+
+static int get_mthp_bufs(struct iovec *iov, int nr_bufs, size_t buf_size,
+ size_t alignment, size_t offset)
+{
+ int i;
+
+ for (i = 0; i < nr_bufs; i++) {
+ void *base = NULL;
+
+ if (posix_memalign(&base, alignment, buf_size)) {
+ printf("Unable to allocate mthp pages. "
+ "Try increasing the RLIMIT_MEMLOCK resource limit\n");
+ free_bufs(iov, i, offset);
+ return -1;
+ }
+
+ memset(base, 0, buf_size);
+ iov[i].iov_base = base + offset;
+ iov[i].iov_len = buf_size - offset;
+ }
+
+ return 0;
+}
+
+static int do_read(struct io_uring *ring, int fd, struct iovec *iov, int nr_bufs)
+{
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ int i, ret;
+
+ for (i = 0; i < nr_bufs; i++) {
+ sqe = io_uring_get_sqe(ring);
+ if (!sqe) {
+ fprintf(stderr, "Could not get SQE.\n");
+ return -1;
+ }
+
+ io_uring_prep_read_fixed(sqe, fd, iov[i].iov_base, iov[i].iov_len, 0, i);
+ io_uring_submit(ring);
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret < 0) {
+ fprintf(stderr, "Error waiting for completion: %s\n", strerror(-ret));
+ return -1;
+ }
+
+ if (cqe->res < 0) {
+ fprintf(stderr, "Error in async read operation: %s\n", strerror(-cqe->res));
+ return -1;
+ }
+ if (cqe->res != iov[i].iov_len) {
+ fprintf(stderr, "cqe res: %d, expected: %lu\n", cqe->res, (unsigned long) iov[i].iov_len);
+ return -1;
+ }
+
+ io_uring_cqe_seen(ring, cqe);
+ }
+
+ return 0;
+}
+
+static int do_write(struct io_uring *ring, int fd, struct iovec *iov, int nr_bufs)
+{
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ int i, ret;
+
+ for (i = 0; i < nr_bufs; i++) {
+ sqe = io_uring_get_sqe(ring);
+ if (!sqe) {
+ fprintf(stderr, "Could not get SQE.\n");
+ return -1;
+ }
+
+ io_uring_prep_write_fixed(sqe, fd, iov[i].iov_base, iov[i].iov_len, 0, i);
+ io_uring_submit(ring);
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret < 0) {
+ fprintf(stderr, "Error waiting for completion: %s\n", strerror(-ret));
+ return -1;
+ }
+
+ if (cqe->res < 0) {
+ fprintf(stderr, "Error in async write operation: %s\n", strerror(-cqe->res));
+ return -1;
+ }
+ if (cqe->res != iov[i].iov_len) {
+ fprintf(stderr, "cqe res: %d, expected: %lu\n", cqe->res, (unsigned long) iov[i].iov_len);
+ return -1;
+ }
+
+ io_uring_cqe_seen(ring, cqe);
+ }
+
+ return 0;
+}
+
+static int register_submit(struct io_uring *ring, struct iovec *iov,
+ int nr_bufs, int fd_in, int fd_out)
+{
+ int ret;
+
+ ret = io_uring_register_buffers(ring, iov, nr_bufs);
+ if (ret) {
+ fprintf(stderr, "Error registering buffers: %s\n", strerror(-ret));
+ return ret;
+ }
+
+ ret = do_read(ring, fd_in, iov, nr_bufs);
+ if (ret) {
+ fprintf(stderr, "Read test failed\n");
+ return ret;
+ }
+
+ ret = do_write(ring, fd_out, iov, nr_bufs);
+ if (ret) {
+ fprintf(stderr, "Write test failed\n");
+ return ret;
+ }
+
+ ret = io_uring_unregister_buffers(ring);
+ if (ret) {
+ fprintf(stderr, "Error unregistering buffers for one hugepage test: %s", strerror(-ret));
+ return ret;
+ }
+
+ return 0;
+}
+
+static int test_one_hugepage(struct io_uring *ring, int fd_in, int fd_out)
+{
+ struct iovec iov[NR_BUFS];
+ size_t buf_size = HUGEPAGE_SIZE;
+ int ret;
+
+ if (mmap_hugebufs(iov, NR_BUFS, buf_size, 0))
+ return T_EXIT_SKIP;
+
+ ret = register_submit(ring, iov, NR_BUFS, fd_in, fd_out);
+ unmap(iov, NR_BUFS, 0);
+ return ret ? T_EXIT_FAIL : T_EXIT_PASS;
+}
+
+static int test_multi_hugepages(struct io_uring *ring, int fd_in, int fd_out)
+{
+ struct iovec iov[NR_BUFS];
+ size_t buf_size = 4 * HUGEPAGE_SIZE;
+ int ret;
+
+ if (mmap_hugebufs(iov, NR_BUFS, buf_size, 0))
+ return T_EXIT_SKIP;
+
+ ret = register_submit(ring, iov, NR_BUFS, fd_in, fd_out);
+ unmap(iov, NR_BUFS, 0);
+ return ret ? T_EXIT_FAIL : T_EXIT_PASS;
+}
+
+static int test_unaligned_hugepage(struct io_uring *ring, int fd_in, int fd_out)
+{
+ struct iovec iov[NR_BUFS];
+ size_t buf_size = 3 * HUGEPAGE_SIZE;
+ size_t offset = 0x1234;
+ int ret;
+
+ if (mmap_hugebufs(iov, NR_BUFS, buf_size, offset))
+ return T_EXIT_SKIP;
+
+ ret = register_submit(ring, iov, NR_BUFS, fd_in, fd_out);
+ unmap(iov, NR_BUFS, offset);
+ return ret ? T_EXIT_FAIL : T_EXIT_PASS;
+}
+
+static int test_multi_unaligned_mthps(struct io_uring *ring, int fd_in, int fd_out)
+{
+ struct iovec iov[NR_BUFS];
+ int ret;
+ size_t buf_size = 3 * MTHP_16KB;
+ size_t offset = 0x1234;
+
+ if (get_mthp_bufs(iov, NR_BUFS, buf_size, MTHP_16KB, offset))
+ return T_EXIT_SKIP;
+
+ ret = register_submit(ring, iov, NR_BUFS, fd_in, fd_out);
+ free_bufs(iov, NR_BUFS, offset);
+ return ret ? T_EXIT_FAIL : T_EXIT_PASS;
+}
+
+/* Should not coalesce */
+static int test_page_mixture(struct io_uring *ring, int fd_in, int fd_out, int huge_on_left)
+{
+ struct iovec iov[NR_BUFS];
+ size_t buf_size = HUGEPAGE_SIZE + MTHP_16KB;
+ int ret;
+
+ if (mmap_mixture(iov, NR_BUFS, buf_size, huge_on_left))
+ return T_EXIT_SKIP;
+
+ ret = register_submit(ring, iov, NR_BUFS, fd_in, fd_out);
+ unmap(iov, NR_BUFS, 0);
+ return ret ? T_EXIT_FAIL : T_EXIT_PASS;
+}
+
+int main(int argc, char *argv[])
+{
+ struct io_uring ring;
+ int ret, fd_in, fd_out;
+ char *fname_in;
+
+ if (argc > 1)
+ fname_in = argv[1];
+ else
+ fname_in = IN_FD;
+
+ if (open_files(fname_in, &fd_in, &fd_out))
+ return T_EXIT_SKIP;
+
+ ret = t_create_ring(8, &ring, 0);
+ if (ret == T_SETUP_SKIP)
+ return T_EXIT_SKIP;
+ else if (ret < 0)
+ return T_EXIT_FAIL;
+
+ ret = test_one_hugepage(&ring, fd_in, fd_out);
+ if (ret != T_EXIT_PASS) {
+ if (ret != T_EXIT_SKIP)
+ fprintf(stderr, "Test one hugepage failed.\n");
+ return ret;
+ }
+
+ ret = test_multi_hugepages(&ring, fd_in, fd_out);
+ if (ret != T_EXIT_PASS) {
+ if (ret != T_EXIT_SKIP)
+ fprintf(stderr, "Test multi hugepages failed.\n");
+ return ret;
+ }
+
+ ret = test_unaligned_hugepage(&ring, fd_in, fd_out);
+ if (ret != T_EXIT_PASS) {
+ if (ret != T_EXIT_SKIP)
+ fprintf(stderr, "Test unaligned hugepage failed.\n");
+ return ret;
+ }
+
+ ret = test_multi_unaligned_mthps(&ring, fd_in, fd_out);
+ if (ret != T_EXIT_PASS) {
+ if (ret != T_EXIT_SKIP)
+ fprintf(stderr, "Test unaligned multi-size'd THPs failed.\n");
+ return ret;
+ }
+
+ ret = test_page_mixture(&ring, fd_in, fd_out, true);
+ if (ret != T_EXIT_PASS) {
+ if (ret != T_EXIT_SKIP)
+ fprintf(stderr, "Test huge small page mixture (start with huge) failed.\n");
+ return ret;
+ }
+
+ ret = test_page_mixture(&ring, fd_in, fd_out, false);
+ if (ret != T_EXIT_PASS) {
+ if (ret != T_EXIT_SKIP)
+ fprintf(stderr, "Test huge small page mixture (start with small) failed.\n");
+ return ret;
+ }
+
+ io_uring_queue_exit(&ring);
+ return T_EXIT_PASS;
+}
diff --git a/contrib/libs/liburing/test/fixed-hugepage.t/ya.make b/contrib/libs/liburing/test/fixed-hugepage.t/ya.make
new file mode 100644
index 0000000000..9c4ef3dbe4
--- /dev/null
+++ b/contrib/libs/liburing/test/fixed-hugepage.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ fixed-hugepage.c
+ helpers.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/fixed-link.t/ya.make b/contrib/libs/liburing/test/fixed-link.t/ya.make
index 86001d014a..afc5190ea1 100644
--- a/contrib/libs/liburing/test/fixed-link.t/ya.make
+++ b/contrib/libs/liburing/test/fixed-link.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fixed-reuse.t/ya.make b/contrib/libs/liburing/test/fixed-reuse.t/ya.make
index 3a3b2d7d81..711704cf4d 100644
--- a/contrib/libs/liburing/test/fixed-reuse.t/ya.make
+++ b/contrib/libs/liburing/test/fixed-reuse.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fpos.c b/contrib/libs/liburing/test/fpos.c
index 239a5b2959..61dc4a5055 100644
--- a/contrib/libs/liburing/test/fpos.c
+++ b/contrib/libs/liburing/test/fpos.c
@@ -99,7 +99,7 @@ static int test_read(struct io_uring *ring, bool async, int blocksize)
if (res == 0) {
done = true;
} else if (res == -ECANCELED) {
- /* cancelled, probably ok */
+ /* canceled, probably ok */
} else if (res < 0 || res > blocksize) {
fprintf(stderr, "bad read: %d\n", res);
return -1;
diff --git a/contrib/libs/liburing/test/fpos.t/ya.make b/contrib/libs/liburing/test/fpos.t/ya.make
index 3bd7031c19..f9faf5bee7 100644
--- a/contrib/libs/liburing/test/fpos.t/ya.make
+++ b/contrib/libs/liburing/test/fpos.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/fsync.t/ya.make b/contrib/libs/liburing/test/fsync.t/ya.make
index c5218115df..c3be5c5b45 100644
--- a/contrib/libs/liburing/test/fsync.t/ya.make
+++ b/contrib/libs/liburing/test/fsync.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/futex.t/ya.make b/contrib/libs/liburing/test/futex.t/ya.make
index 3752134a0e..66ce3413c2 100644
--- a/contrib/libs/liburing/test/futex.t/ya.make
+++ b/contrib/libs/liburing/test/futex.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/hardlink.t/ya.make b/contrib/libs/liburing/test/hardlink.t/ya.make
index 899de38f8c..970e1a324c 100644
--- a/contrib/libs/liburing/test/hardlink.t/ya.make
+++ b/contrib/libs/liburing/test/hardlink.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/ignore-single-mmap.c b/contrib/libs/liburing/test/ignore-single-mmap.c
new file mode 100644
index 0000000000..2790b871d3
--- /dev/null
+++ b/contrib/libs/liburing/test/ignore-single-mmap.c
@@ -0,0 +1,49 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * 6.10-rc merge window had a bug where the rewritten mmap support caused
+ * rings allocated with > 1 page, but asking for smaller mappings, would
+ * cause -EFAULT to be returned rather than a succesful map. This hit
+ * applications either using an ancient liburing with IORING_FEAT_SINGLE_MMAP
+ * support, or application just ignoring that feature flag and still doing
+ * 3 mmap operations to map the ring.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "../src/syscall.h"
+#include "liburing.h"
+#include "helpers.h"
+
+#define ENTRIES 128
+
+int main(int argc, char *argv[])
+{
+ struct io_uring_params p = { };
+ void *ptr;
+ int fd;
+
+ if (argc > 1)
+ return T_EXIT_SKIP;
+
+ fd = __sys_io_uring_setup(ENTRIES, &p);
+ if (fd < 0)
+ return T_EXIT_SKIP;
+
+ if (!(p.features & IORING_FEAT_SINGLE_MMAP)) {
+ close(fd);
+ return T_EXIT_SKIP;
+ }
+
+ ptr = __sys_mmap(0, ENTRIES * sizeof(unsigned), PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_POPULATE, fd,
+ IORING_OFF_SQ_RING);
+ if (!IS_ERR(ptr)) {
+ close(fd);
+ return T_EXIT_PASS;
+ }
+
+ fprintf(stderr, "ring sqe array mmap: %d\n", PTR_ERR(ptr));
+ return T_EXIT_FAIL;
+}
diff --git a/contrib/libs/liburing/test/ignore-single-mmap.t/ya.make b/contrib/libs/liburing/test/ignore-single-mmap.t/ya.make
new file mode 100644
index 0000000000..3942706db9
--- /dev/null
+++ b/contrib/libs/liburing/test/ignore-single-mmap.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ helpers.c
+ ignore-single-mmap.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/init-mem.c b/contrib/libs/liburing/test/init-mem.c
new file mode 100644
index 0000000000..1909e2ac5f
--- /dev/null
+++ b/contrib/libs/liburing/test/init-mem.c
@@ -0,0 +1,165 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * Description: Check that io_uring_queue_init_mem() doesn't underestimate
+ * the memory required for various size rings.
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include <linux/mman.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netinet/udp.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <error.h>
+
+#include "liburing.h"
+#include "helpers.h"
+
+#define PRE_RED 0x5aa55aa55aa55aa5ULL
+#define POST_RED 0xa55aa55aa55aa55aULL
+
+struct ctx {
+ struct io_uring ring;
+ void *ring_mem;
+ void *mem;
+ unsigned long long *pre;
+ unsigned long long *post;
+};
+
+struct q_entries {
+ unsigned int sqes;
+ unsigned int cqes;
+};
+
+static int setup_ctx(struct ctx *ctx, struct q_entries *q)
+{
+ struct io_uring_params p = { };
+ int ret;
+
+ if (posix_memalign(&ctx->mem, 4096, 2*1024*1024))
+ return T_EXIT_FAIL;
+
+ ctx->pre = ctx->mem + 4096 - sizeof(unsigned long);
+ *ctx->pre = PRE_RED;
+
+ ctx->ring_mem = ctx->mem + 4096;
+ p.flags |= IORING_SETUP_CQSIZE | IORING_SETUP_NO_SQARRAY;
+ p.sq_entries = q->sqes;
+ p.cq_entries = q->cqes;
+
+ ret = io_uring_queue_init_mem(q->sqes, &ctx->ring, &p,
+ ctx->ring_mem, 2*1024*1024);
+
+ if (ret < 0) {
+ if (ret == -EINVAL)
+ return T_EXIT_SKIP;
+ fprintf(stderr, "queue init: %d\n", ret);
+ return T_EXIT_FAIL;
+ }
+
+ ctx->post = ctx->ring_mem + ret;
+ *ctx->post = POST_RED;
+ return 0;
+}
+
+static void clean_ctx(struct ctx *ctx)
+{
+ io_uring_queue_exit(&ctx->ring);
+}
+
+static int check_red(struct ctx *ctx, unsigned long i)
+{
+ int fail = 0;
+
+ if (*ctx->pre != PRE_RED) {
+ printf("pre redzone=%llx at i=%lu\n", *ctx->pre, i);
+ fail = 1;
+ }
+ if (*ctx->post != POST_RED) {
+ printf("post redzone=%llx at i=%lu\n", *ctx->post, i);
+ fail = 1;
+ }
+ return fail;
+}
+
+static int test(struct q_entries *q)
+{
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ struct ctx ctx = { };
+ unsigned long i, ud;
+ int j, ret, batch;
+
+ ret = setup_ctx(&ctx, q);
+ if (ret == T_EXIT_SKIP)
+ return T_EXIT_SKIP;
+ else if (ret != T_EXIT_PASS)
+ return ret;
+
+ batch = 64;
+ if (batch > q->sqes)
+ batch = q->sqes;
+
+ i = ud = 0;
+ while (i < q->cqes * 2) {
+ if (check_red(&ctx, i))
+ return T_EXIT_FAIL;
+ for (j = 0; j < batch; j++) {
+ sqe = io_uring_get_sqe(&ctx.ring);
+ io_uring_prep_nop(sqe);
+ sqe->user_data = j + (unsigned long) i;
+ }
+ io_uring_submit(&ctx.ring);
+ for (j = 0; j < batch; j++) {
+ ret = io_uring_wait_cqe(&ctx.ring, &cqe);
+ if (ret)
+ goto err;
+ if (cqe->user_data != ud) {
+ fprintf(stderr, "ud=%lu, wanted %lu\n", (unsigned long) cqe->user_data, ud);
+ goto err;
+ }
+ ud++;
+ io_uring_cqe_seen(&ctx.ring, cqe);
+ }
+ i += batch;
+ }
+
+ clean_ctx(&ctx);
+ return T_EXIT_PASS;
+err:
+ clean_ctx(&ctx);
+ return T_EXIT_FAIL;
+}
+
+int main(int argc, char *argv[])
+{
+ struct q_entries q_entries[] = {
+ { 256, 16384 },
+ { 32, 4096 },
+ { 128, 8192 },
+ { 4096, 32768 },
+ { 1, 8 },
+ { 2, 1024 },
+ };
+ int i, ret;
+
+ if (argc > 1)
+ return T_EXIT_SKIP;
+
+ for (i = 0; i < ARRAY_SIZE(q_entries); i++) {
+ ret = test(&q_entries[i]);
+ if (ret == T_EXIT_SKIP) {
+ return T_EXIT_SKIP;
+ } else if (ret != T_EXIT_PASS) {
+ fprintf(stderr, "Failed at %d/%d\n", q_entries[i].sqes,
+ q_entries[i].cqes);
+ return T_EXIT_FAIL;
+ }
+ }
+
+ return T_EXIT_PASS;
+}
diff --git a/contrib/libs/liburing/test/init-mem.t/ya.make b/contrib/libs/liburing/test/init-mem.t/ya.make
new file mode 100644
index 0000000000..c60cfe5615
--- /dev/null
+++ b/contrib/libs/liburing/test/init-mem.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ helpers.c
+ init-mem.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/io-cancel.c b/contrib/libs/liburing/test/io-cancel.c
index 8d769ea704..16a385f44b 100644
--- a/contrib/libs/liburing/test/io-cancel.c
+++ b/contrib/libs/liburing/test/io-cancel.c
@@ -94,7 +94,7 @@ static int wait_io(struct io_uring *ring, unsigned nr_io, int do_partial)
if (do_partial && cqe->user_data) {
if (!(cqe->user_data & 1)) {
if (cqe->res != BS) {
- fprintf(stderr, "IO %d wasn't cancelled but got error %d\n", (unsigned) cqe->user_data, cqe->res);
+ fprintf(stderr, "IO %d wasn't canceled but got error %d\n", (unsigned) cqe->user_data, cqe->res);
goto err;
}
}
@@ -148,7 +148,7 @@ err:
/*
* Test cancels. If 'do_partial' is set, then we only attempt to cancel half of
- * the submitted IO. This is done to verify that cancelling one piece of IO doesn't
+ * the submitted IO. This is done to verify that canceling one piece of IO doesn't
* impact others.
*/
static int test_io_cancel(const char *file, int do_write, int do_partial,
@@ -272,7 +272,7 @@ static int test_dont_cancel_another_ring(void)
ret = io_uring_wait_cqe_timeout(&ring1, &cqe, &ts);
if (ret != -ETIME) {
- fprintf(stderr, "read got cancelled or wait failed\n");
+ fprintf(stderr, "read got canceled or wait failed\n");
return 1;
}
io_uring_cqe_seen(&ring1, cqe);
@@ -348,18 +348,21 @@ static int test_cancel_req_across_fork(void)
case 1:
if (cqe->res != -EINTR &&
cqe->res != -ECANCELED) {
- fprintf(stderr, "%i %i\n", (int)cqe->user_data, cqe->res);
+ fprintf(stderr, "user_data %i res %i\n",
+ (unsigned)cqe->user_data, cqe->res);
exit(1);
}
break;
case 2:
if (cqe->res != -EALREADY && cqe->res) {
- fprintf(stderr, "%i %i\n", (int)cqe->user_data, cqe->res);
+ fprintf(stderr, "user_data %i res %i\n",
+ (unsigned)cqe->user_data, cqe->res);
exit(1);
}
break;
default:
- fprintf(stderr, "%i %i\n", (int)cqe->user_data, cqe->res);
+ fprintf(stderr, "user_data %i res %i\n",
+ (unsigned)cqe->user_data, cqe->res);
exit(1);
}
@@ -452,7 +455,8 @@ static int test_cancel_inflight_exit(void)
if ((cqe->user_data == 1 && cqe->res != -ECANCELED) ||
(cqe->user_data == 2 && cqe->res != -ECANCELED) ||
(cqe->user_data == 3 && cqe->res != -ETIME)) {
- fprintf(stderr, "%i %i\n", (int)cqe->user_data, cqe->res);
+ fprintf(stderr, "user_data %i res %i\n",
+ (unsigned)cqe->user_data, cqe->res);
return 1;
}
io_uring_cqe_seen(&ring, cqe);
@@ -498,7 +502,7 @@ static int test_sqpoll_cancel_iowq_requests(void)
sleep(1);
io_uring_queue_exit(&ring);
- /* close the write end, so if ring is cancelled properly read() fails*/
+ /* close the write end, so if ring is canceled properly read() fails*/
close(fds[1]);
ret = read(fds[0], buffer, 10);
close(fds[0]);
diff --git a/contrib/libs/liburing/test/io-cancel.t/ya.make b/contrib/libs/liburing/test/io-cancel.t/ya.make
index 3d3cdc6ccf..12379a4a76 100644
--- a/contrib/libs/liburing/test/io-cancel.t/ya.make
+++ b/contrib/libs/liburing/test/io-cancel.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/io_uring_enter.c b/contrib/libs/liburing/test/io_uring_enter.c
index 7c73d0a403..4204ef5cae 100644
--- a/contrib/libs/liburing/test/io_uring_enter.c
+++ b/contrib/libs/liburing/test/io_uring_enter.c
@@ -170,7 +170,7 @@ static void submit_io(struct io_uring *ring, unsigned nr)
ret = io_uring_submit(ring);
unlink(template);
if (ret < 0) {
- perror("io_uring_enter");
+ fprintf(stderr, "io_uring_queue_enter: %s\n", strerror(-ret));
exit(1);
}
}
@@ -195,7 +195,7 @@ int main(int argc, char **argv)
ret = t_io_uring_init_sqarray(IORING_MAX_ENTRIES_FALLBACK,
&ring, &p);
if (ret < 0) {
- perror("io_uring_queue_init");
+ fprintf(stderr, "queue_init: %s\n", strerror(-ret));
exit(T_EXIT_FAIL);
}
mask = sq->ring_mask;
diff --git a/contrib/libs/liburing/test/io_uring_enter.t/ya.make b/contrib/libs/liburing/test/io_uring_enter.t/ya.make
index a60d6cca13..83a0199127 100644
--- a/contrib/libs/liburing/test/io_uring_enter.t/ya.make
+++ b/contrib/libs/liburing/test/io_uring_enter.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/io_uring_passthrough.t/ya.make b/contrib/libs/liburing/test/io_uring_passthrough.t/ya.make
index de4aae6aaa..63a2078929 100644
--- a/contrib/libs/liburing/test/io_uring_passthrough.t/ya.make
+++ b/contrib/libs/liburing/test/io_uring_passthrough.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/io_uring_register.t/ya.make b/contrib/libs/liburing/test/io_uring_register.t/ya.make
index c38e994623..1d46c47686 100644
--- a/contrib/libs/liburing/test/io_uring_register.t/ya.make
+++ b/contrib/libs/liburing/test/io_uring_register.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/io_uring_setup.t/ya.make b/contrib/libs/liburing/test/io_uring_setup.t/ya.make
index 42a94f6032..e98edd9af6 100644
--- a/contrib/libs/liburing/test/io_uring_setup.t/ya.make
+++ b/contrib/libs/liburing/test/io_uring_setup.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/iopoll-leak.t/ya.make b/contrib/libs/liburing/test/iopoll-leak.t/ya.make
index 98102a9341..f6c3268667 100644
--- a/contrib/libs/liburing/test/iopoll-leak.t/ya.make
+++ b/contrib/libs/liburing/test/iopoll-leak.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/iopoll-overflow.t/ya.make b/contrib/libs/liburing/test/iopoll-overflow.t/ya.make
index e0a58ef4c1..ee34ce968d 100644
--- a/contrib/libs/liburing/test/iopoll-overflow.t/ya.make
+++ b/contrib/libs/liburing/test/iopoll-overflow.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/iopoll.t/ya.make b/contrib/libs/liburing/test/iopoll.t/ya.make
index 804acca663..fd11b7ce20 100644
--- a/contrib/libs/liburing/test/iopoll.t/ya.make
+++ b/contrib/libs/liburing/test/iopoll.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/lfs-openat-write.t/ya.make b/contrib/libs/liburing/test/lfs-openat-write.t/ya.make
index 35111ead56..f577ca7b03 100644
--- a/contrib/libs/liburing/test/lfs-openat-write.t/ya.make
+++ b/contrib/libs/liburing/test/lfs-openat-write.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/lfs-openat.t/ya.make b/contrib/libs/liburing/test/lfs-openat.t/ya.make
index 32b2f778c0..f0bc0c2b73 100644
--- a/contrib/libs/liburing/test/lfs-openat.t/ya.make
+++ b/contrib/libs/liburing/test/lfs-openat.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/link-timeout.t/ya.make b/contrib/libs/liburing/test/link-timeout.t/ya.make
index d912679544..31f04f1799 100644
--- a/contrib/libs/liburing/test/link-timeout.t/ya.make
+++ b/contrib/libs/liburing/test/link-timeout.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/link.t/ya.make b/contrib/libs/liburing/test/link.t/ya.make
index db142c20d2..31a9afdcfc 100644
--- a/contrib/libs/liburing/test/link.t/ya.make
+++ b/contrib/libs/liburing/test/link.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/link_drain.t/ya.make b/contrib/libs/liburing/test/link_drain.t/ya.make
index 1fcb074fc1..8951552fda 100644
--- a/contrib/libs/liburing/test/link_drain.t/ya.make
+++ b/contrib/libs/liburing/test/link_drain.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/madvise.t/ya.make b/contrib/libs/liburing/test/madvise.t/ya.make
index 61479e87c8..d0ac4fdc9f 100644
--- a/contrib/libs/liburing/test/madvise.t/ya.make
+++ b/contrib/libs/liburing/test/madvise.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/mkdir.t/ya.make b/contrib/libs/liburing/test/mkdir.t/ya.make
index 96e55f5d3d..87fefb42d5 100644
--- a/contrib/libs/liburing/test/mkdir.t/ya.make
+++ b/contrib/libs/liburing/test/mkdir.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/msg-ring-fd.c b/contrib/libs/liburing/test/msg-ring-fd.c
index 84a7d24f5c..7c68906424 100644
--- a/contrib/libs/liburing/test/msg-ring-fd.c
+++ b/contrib/libs/liburing/test/msg-ring-fd.c
@@ -17,6 +17,7 @@
static int no_msg;
static int no_sparse;
+static int no_fd_pass;
struct data {
pthread_t thread;
@@ -89,6 +90,9 @@ static int test_remote(struct io_uring *src, int ring_flags)
void *tret;
int i;
+ if (no_fd_pass)
+ return 0;
+
pthread_barrier_init(&d.barrier, NULL, 2);
d.ring_flags = ring_flags;
pthread_create(&d.thread, NULL, thread_fn, &d);
@@ -161,6 +165,9 @@ static int test_local(struct io_uring *src, struct io_uring *dst)
char buf[32], dst_buf[32];
int i;
+ if (no_fd_pass)
+ return 0;
+
fd = -1;
ret = io_uring_register_files(dst, &fd, 1);
if (ret) {
@@ -203,7 +210,9 @@ static int test_local(struct io_uring *src, struct io_uring *dst)
fprintf(stderr, "wait_cqe: %d\n", ret);
return 1;
}
- if (cqe->res < 0) {
+ if (cqe->user_data == 2 && cqe->res == -EINVAL) {
+ no_fd_pass = 1;
+ } else if (cqe->res < 0) {
fprintf(stderr, "cqe res %d\n", cqe->res);
return 1;
}
@@ -214,6 +223,9 @@ static int test_local(struct io_uring *src, struct io_uring *dst)
io_uring_cqe_seen(src, cqe);
}
+ if (no_fd_pass)
+ goto out;
+
ret = io_uring_wait_cqe(dst, &cqe);
if (ret) {
fprintf(stderr, "wait_cqe dst: %d\n", ret);
@@ -250,6 +262,7 @@ static int test_local(struct io_uring *src, struct io_uring *dst)
return 1;
}
+out:
close(fds[0]);
close(fds[1]);
io_uring_unregister_files(src);
diff --git a/contrib/libs/liburing/test/msg-ring-fd.t/ya.make b/contrib/libs/liburing/test/msg-ring-fd.t/ya.make
index 2fd37b146b..e62d69d037 100644
--- a/contrib/libs/liburing/test/msg-ring-fd.t/ya.make
+++ b/contrib/libs/liburing/test/msg-ring-fd.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/msg-ring-flags.t/ya.make b/contrib/libs/liburing/test/msg-ring-flags.t/ya.make
index af6168d21f..ba23560940 100644
--- a/contrib/libs/liburing/test/msg-ring-flags.t/ya.make
+++ b/contrib/libs/liburing/test/msg-ring-flags.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/msg-ring-overflow.t/ya.make b/contrib/libs/liburing/test/msg-ring-overflow.t/ya.make
index c62325ce15..cb95daef71 100644
--- a/contrib/libs/liburing/test/msg-ring-overflow.t/ya.make
+++ b/contrib/libs/liburing/test/msg-ring-overflow.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/msg-ring.c b/contrib/libs/liburing/test/msg-ring.c
index ef9e3b1f85..843ba1f8ef 100644
--- a/contrib/libs/liburing/test/msg-ring.c
+++ b/contrib/libs/liburing/test/msg-ring.c
@@ -75,19 +75,25 @@ err:
struct data {
struct io_uring *ring;
+ unsigned int flags;
+ pthread_barrier_t startup;
pthread_barrier_t barrier;
};
static void *wait_cqe_fn(void *__data)
{
struct data *d = __data;
- struct io_uring *ring = d->ring;
struct io_uring_cqe *cqe;
+ struct io_uring ring;
int ret;
+ io_uring_queue_init(4, &ring, d->flags);
+ d->ring = &ring;
+ pthread_barrier_wait(&d->startup);
+
pthread_barrier_wait(&d->barrier);
- ret = io_uring_wait_cqe(ring, &cqe);
+ ret = io_uring_wait_cqe(&ring, &cqe);
if (ret) {
fprintf(stderr, "wait cqe %d\n", ret);
goto err;
@@ -102,15 +108,18 @@ static void *wait_cqe_fn(void *__data)
goto err;
}
- io_uring_cqe_seen(ring, cqe);
+ io_uring_cqe_seen(&ring, cqe);
+ io_uring_queue_exit(&ring);
return NULL;
err:
- io_uring_cqe_seen(ring, cqe);
+ io_uring_cqe_seen(&ring, cqe);
+ io_uring_queue_exit(&ring);
return (void *) (unsigned long) 1;
}
-static int test_remote(struct io_uring *ring, struct io_uring *target)
+static int test_remote(struct io_uring *ring, unsigned int ring_flags)
{
+ struct io_uring *target;
pthread_t thread;
void *tret;
struct io_uring_cqe *cqe;
@@ -118,10 +127,14 @@ static int test_remote(struct io_uring *ring, struct io_uring *target)
struct data d;
int ret;
- d.ring = target;
+ d.flags = ring_flags;
pthread_barrier_init(&d.barrier, NULL, 2);
+ pthread_barrier_init(&d.startup, NULL, 2);
pthread_create(&thread, NULL, wait_cqe_fn, &d);
+ pthread_barrier_wait(&d.startup);
+ target = d.ring;
+
sqe = io_uring_get_sqe(ring);
if (!sqe) {
fprintf(stderr, "get sqe failed\n");
@@ -146,10 +159,12 @@ static int test_remote(struct io_uring *ring, struct io_uring *target)
}
if (cqe->res != 0) {
fprintf(stderr, "cqe res %d\n", cqe->res);
+ io_uring_cqe_seen(ring, cqe);
return -1;
}
if (cqe->user_data != 1) {
fprintf(stderr, "user_data %llx\n", (long long) cqe->user_data);
+ io_uring_cqe_seen(ring, cqe);
return -1;
}
@@ -376,7 +391,7 @@ static int test(int ring_flags)
}
}
- ret = test_remote(&ring, &ring2);
+ ret = test_remote(&ring, ring_flags);
if (ret) {
fprintf(stderr, "test_remote failed\n");
return T_EXIT_FAIL;
diff --git a/contrib/libs/liburing/test/msg-ring.t/ya.make b/contrib/libs/liburing/test/msg-ring.t/ya.make
index de2aa99c31..a1038229eb 100644
--- a/contrib/libs/liburing/test/msg-ring.t/ya.make
+++ b/contrib/libs/liburing/test/msg-ring.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/multicqes_drain.c b/contrib/libs/liburing/test/multicqes_drain.c
index 43880c0b18..2974597da3 100644
--- a/contrib/libs/liburing/test/multicqes_drain.c
+++ b/contrib/libs/liburing/test/multicqes_drain.c
@@ -39,8 +39,8 @@ struct sqe_info {
* sqe_flags: combination of sqe flags
* multi_sqes: record the user_data/index of all the multishot sqes
* cnt: how many entries there are in multi_sqes
- * we can leverage multi_sqes array for cancellation: we randomly pick
- * up an entry in multi_sqes when form a cancellation sqe.
+ * we can leverage multi_sqes array for cancelation: we randomly pick
+ * up an entry in multi_sqes when form a cancelation sqe.
* multi_cap: limitation of number of multishot sqes
*/
static const unsigned sqe_flags[4] = {
@@ -110,7 +110,7 @@ static __u8 generate_flags(int sqe_op)
{
__u8 flags = 0;
/*
- * drain sqe must be put after multishot sqes cancelled
+ * drain sqe must be put after multishot sqes canceled
*/
do {
flags = sqe_flags[rand() % 4];
@@ -125,7 +125,7 @@ static __u8 generate_flags(int sqe_op)
/*
* avoid below case:
* sqe0(multishot, link)->sqe1(nop, link)->sqe2(nop)->sqe3(cancel_sqe0)
- * sqe3 may execute before sqe0 so that sqe0 isn't cancelled
+ * sqe3 may execute before sqe0 so that sqe0 isn't canceled
*/
if (sqe_op == multi)
flags &= ~IOSQE_IO_LINK;
@@ -266,7 +266,7 @@ static int test_generic_drain(struct io_uring *ring)
}
}
/*
- * for multishot sqes, record them only when it is cancelled
+ * for multishot sqes, record them only when it is canceled
*/
if ((si[index].op != multi) || (cqe_res[j] == -ECANCELED))
compl_bits |= (1ULL << index);
diff --git a/contrib/libs/liburing/test/multicqes_drain.t/ya.make b/contrib/libs/liburing/test/multicqes_drain.t/ya.make
index 9ebc4ab0ce..f14f880b47 100644
--- a/contrib/libs/liburing/test/multicqes_drain.t/ya.make
+++ b/contrib/libs/liburing/test/multicqes_drain.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/no-mmap-inval.c b/contrib/libs/liburing/test/no-mmap-inval.c
index e340311ac3..44d3be97d5 100644
--- a/contrib/libs/liburing/test/no-mmap-inval.c
+++ b/contrib/libs/liburing/test/no-mmap-inval.c
@@ -34,7 +34,7 @@ int main(int argc, char *argv[])
if (ret == -EINVAL) {
/* kernel doesn't support SETUP_NO_MMAP */
return T_EXIT_SKIP;
- } else if (ret && ret != -EFAULT) {
+ } else if (ret && (ret != -EFAULT && ret != -ENOMEM)) {
fprintf(stderr, "Got %d, wanted -EFAULT\n", ret);
return T_EXIT_FAIL;
}
diff --git a/contrib/libs/liburing/test/no-mmap-inval.t/ya.make b/contrib/libs/liburing/test/no-mmap-inval.t/ya.make
index 37e438629b..9ec20bebad 100644
--- a/contrib/libs/liburing/test/no-mmap-inval.t/ya.make
+++ b/contrib/libs/liburing/test/no-mmap-inval.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/nolibc.t/ya.make b/contrib/libs/liburing/test/nolibc.t/ya.make
index c24e84010c..7f57ccae4b 100644
--- a/contrib/libs/liburing/test/nolibc.t/ya.make
+++ b/contrib/libs/liburing/test/nolibc.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/nop-all-sizes.t/ya.make b/contrib/libs/liburing/test/nop-all-sizes.t/ya.make
index 1f2df01de6..35fc683f9f 100644
--- a/contrib/libs/liburing/test/nop-all-sizes.t/ya.make
+++ b/contrib/libs/liburing/test/nop-all-sizes.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/nop.t/ya.make b/contrib/libs/liburing/test/nop.t/ya.make
index 8eccd15969..df373fd678 100644
--- a/contrib/libs/liburing/test/nop.t/ya.make
+++ b/contrib/libs/liburing/test/nop.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/ooo-file-unreg.c b/contrib/libs/liburing/test/ooo-file-unreg.c
new file mode 100644
index 0000000000..ee5faaf4f8
--- /dev/null
+++ b/contrib/libs/liburing/test/ooo-file-unreg.c
@@ -0,0 +1,83 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * Description: Test that out-of-order file updates with inflight requests
+ * work as expected.
+ *
+ */
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/poll.h>
+
+#include "liburing.h"
+#include "helpers.h"
+
+int main(int argc, char *argv[])
+{
+ struct io_uring_sqe *sqe;
+ int res, fds[2], sockid;
+ struct io_uring ring;
+
+ if (argc > 1)
+ return T_EXIT_SKIP;
+
+ res = io_uring_queue_init(1, &ring, 0);
+ if (res) {
+ fprintf(stderr, "queue_init: %d\n", res);
+ return T_EXIT_FAIL;
+ }
+
+ res = io_uring_register_files_sparse(&ring, 2);
+ if (res) {
+ if (res == -EINVAL)
+ return T_EXIT_SKIP;
+ fprintf(stderr, "sparse reg: %d\n", res);
+ return T_EXIT_FAIL;
+ }
+
+ fds[0] = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fds[0] < 0) {
+ perror("socket");
+ return T_EXIT_FAIL;
+ }
+ fds[1] = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fds[1] < 0) {
+ perror("socket");
+ return T_EXIT_FAIL;
+ }
+
+ res = io_uring_register_files_update(&ring, 0, fds, 2);
+ if (res != 2) {
+ fprintf(stderr, "files updates; %d\n", res);
+ return T_EXIT_FAIL;
+ }
+
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_poll_add(sqe, 0, POLLIN);
+ sqe->flags = IOSQE_FIXED_FILE;
+ io_uring_submit(&ring);
+
+ close(fds[0]);
+ close(fds[1]);
+
+ sockid = -1;
+ res = io_uring_register_files_update(&ring, 1, &sockid, 1);
+ if (res != 1) {
+ fprintf(stderr, "files updates; %d\n", res);
+ return T_EXIT_FAIL;
+ }
+
+ sockid = -1;
+ res = io_uring_register_files_update(&ring, 0, &sockid, 1);
+ if (res != 1) {
+ fprintf(stderr, "files updates; %d\n", res);
+ return T_EXIT_FAIL;
+ }
+
+ sleep(1);
+ io_uring_queue_exit(&ring);
+ return T_EXIT_PASS;
+}
diff --git a/contrib/libs/liburing/test/ooo-file-unreg.t/ya.make b/contrib/libs/liburing/test/ooo-file-unreg.t/ya.make
new file mode 100644
index 0000000000..8df08c00b9
--- /dev/null
+++ b/contrib/libs/liburing/test/ooo-file-unreg.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ helpers.c
+ ooo-file-unreg.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/open-close.t/ya.make b/contrib/libs/liburing/test/open-close.t/ya.make
index aa584ce874..1c96f6a744 100644
--- a/contrib/libs/liburing/test/open-close.t/ya.make
+++ b/contrib/libs/liburing/test/open-close.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/open-direct-link.t/ya.make b/contrib/libs/liburing/test/open-direct-link.t/ya.make
index 4027551744..a526297eca 100644
--- a/contrib/libs/liburing/test/open-direct-link.t/ya.make
+++ b/contrib/libs/liburing/test/open-direct-link.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/open-direct-pick.t/ya.make b/contrib/libs/liburing/test/open-direct-pick.t/ya.make
index ab2caa9468..385643a111 100644
--- a/contrib/libs/liburing/test/open-direct-pick.t/ya.make
+++ b/contrib/libs/liburing/test/open-direct-pick.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/openat2.t/ya.make b/contrib/libs/liburing/test/openat2.t/ya.make
index 8063d9d52a..b7c98e6e2e 100644
--- a/contrib/libs/liburing/test/openat2.t/ya.make
+++ b/contrib/libs/liburing/test/openat2.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/personality.t/ya.make b/contrib/libs/liburing/test/personality.t/ya.make
index 78b11586ae..5d2750936e 100644
--- a/contrib/libs/liburing/test/personality.t/ya.make
+++ b/contrib/libs/liburing/test/personality.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/pipe-bug.t/ya.make b/contrib/libs/liburing/test/pipe-bug.t/ya.make
index 0a27f30c2e..b4a71cf37e 100644
--- a/contrib/libs/liburing/test/pipe-bug.t/ya.make
+++ b/contrib/libs/liburing/test/pipe-bug.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/pipe-eof.t/ya.make b/contrib/libs/liburing/test/pipe-eof.t/ya.make
index 108759b4e4..b53c087814 100644
--- a/contrib/libs/liburing/test/pipe-eof.t/ya.make
+++ b/contrib/libs/liburing/test/pipe-eof.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/pipe-reuse.t/ya.make b/contrib/libs/liburing/test/pipe-reuse.t/ya.make
index 9bb534150d..f393155c37 100644
--- a/contrib/libs/liburing/test/pipe-reuse.t/ya.make
+++ b/contrib/libs/liburing/test/pipe-reuse.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-cancel-all.t/ya.make b/contrib/libs/liburing/test/poll-cancel-all.t/ya.make
index e69de7562a..d868fa9fb5 100644
--- a/contrib/libs/liburing/test/poll-cancel-all.t/ya.make
+++ b/contrib/libs/liburing/test/poll-cancel-all.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-cancel-ton.t/ya.make b/contrib/libs/liburing/test/poll-cancel-ton.t/ya.make
index 6aa6b3dcfc..254f5d774b 100644
--- a/contrib/libs/liburing/test/poll-cancel-ton.t/ya.make
+++ b/contrib/libs/liburing/test/poll-cancel-ton.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-cancel.c b/contrib/libs/liburing/test/poll-cancel.c
index 2d953b5676..a6589e8da4 100644
--- a/contrib/libs/liburing/test/poll-cancel.c
+++ b/contrib/libs/liburing/test/poll-cancel.c
@@ -155,11 +155,11 @@ static int __test_poll_cancel_with_timeouts(void)
return 1;
}
- /* test timeout-offset triggering path during cancellation */
+ /* test timeout-offset triggering path during cancelation */
sqe = io_uring_get_sqe(&ring);
io_uring_prep_timeout(sqe, &ts, off_nr, 0);
- /* poll ring2 to trigger cancellation on exit() */
+ /* poll ring2 to trigger cancelation on exit() */
sqe = io_uring_get_sqe(&ring);
io_uring_prep_poll_add(sqe, ring2.ring_fd, POLLIN);
sqe->flags |= IOSQE_IO_LINK;
diff --git a/contrib/libs/liburing/test/poll-cancel.t/ya.make b/contrib/libs/liburing/test/poll-cancel.t/ya.make
index b351415a75..7f35cc137e 100644
--- a/contrib/libs/liburing/test/poll-cancel.t/ya.make
+++ b/contrib/libs/liburing/test/poll-cancel.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-link.t/ya.make b/contrib/libs/liburing/test/poll-link.t/ya.make
index 59462033d3..9d6b445155 100644
--- a/contrib/libs/liburing/test/poll-link.t/ya.make
+++ b/contrib/libs/liburing/test/poll-link.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-many.t/ya.make b/contrib/libs/liburing/test/poll-many.t/ya.make
index 65bef1d2cf..67d9a682f6 100644
--- a/contrib/libs/liburing/test/poll-many.t/ya.make
+++ b/contrib/libs/liburing/test/poll-many.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-mshot-overflow.t/ya.make b/contrib/libs/liburing/test/poll-mshot-overflow.t/ya.make
index a33bb59053..ccc141a99b 100644
--- a/contrib/libs/liburing/test/poll-mshot-overflow.t/ya.make
+++ b/contrib/libs/liburing/test/poll-mshot-overflow.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-mshot-update.t/ya.make b/contrib/libs/liburing/test/poll-mshot-update.t/ya.make
index 4778d30dc5..3453c214ee 100644
--- a/contrib/libs/liburing/test/poll-mshot-update.t/ya.make
+++ b/contrib/libs/liburing/test/poll-mshot-update.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-race-mshot.t/ya.make b/contrib/libs/liburing/test/poll-race-mshot.t/ya.make
index a6cb990f7e..6fdf2c8491 100644
--- a/contrib/libs/liburing/test/poll-race-mshot.t/ya.make
+++ b/contrib/libs/liburing/test/poll-race-mshot.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-race.t/ya.make b/contrib/libs/liburing/test/poll-race.t/ya.make
index 623800d8f5..1fdc2798b0 100644
--- a/contrib/libs/liburing/test/poll-race.t/ya.make
+++ b/contrib/libs/liburing/test/poll-race.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-ring.t/ya.make b/contrib/libs/liburing/test/poll-ring.t/ya.make
index 9324f9467b..248be1c132 100644
--- a/contrib/libs/liburing/test/poll-ring.t/ya.make
+++ b/contrib/libs/liburing/test/poll-ring.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll-v-poll.t/ya.make b/contrib/libs/liburing/test/poll-v-poll.t/ya.make
index 9e38b3b746..b48c0ff287 100644
--- a/contrib/libs/liburing/test/poll-v-poll.t/ya.make
+++ b/contrib/libs/liburing/test/poll-v-poll.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/poll.t/ya.make b/contrib/libs/liburing/test/poll.t/ya.make
index 9343d92a45..809283fd40 100644
--- a/contrib/libs/liburing/test/poll.t/ya.make
+++ b/contrib/libs/liburing/test/poll.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/probe.t/ya.make b/contrib/libs/liburing/test/probe.t/ya.make
index 76eb74e499..abc6c4a41e 100644
--- a/contrib/libs/liburing/test/probe.t/ya.make
+++ b/contrib/libs/liburing/test/probe.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/read-before-exit.t/ya.make b/contrib/libs/liburing/test/read-before-exit.t/ya.make
index 9c3d8be8c5..d762a60d86 100644
--- a/contrib/libs/liburing/test/read-before-exit.t/ya.make
+++ b/contrib/libs/liburing/test/read-before-exit.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/read-mshot-empty.t/ya.make b/contrib/libs/liburing/test/read-mshot-empty.t/ya.make
index 95414a1800..bf50a15474 100644
--- a/contrib/libs/liburing/test/read-mshot-empty.t/ya.make
+++ b/contrib/libs/liburing/test/read-mshot-empty.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/read-mshot.t/ya.make b/contrib/libs/liburing/test/read-mshot.t/ya.make
index fe851e0f16..a760a7efbd 100644
--- a/contrib/libs/liburing/test/read-mshot.t/ya.make
+++ b/contrib/libs/liburing/test/read-mshot.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/read-write.t/ya.make b/contrib/libs/liburing/test/read-write.t/ya.make
index ab6591454f..25de751b18 100644
--- a/contrib/libs/liburing/test/read-write.t/ya.make
+++ b/contrib/libs/liburing/test/read-write.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/recv-msgall-stream.t/ya.make b/contrib/libs/liburing/test/recv-msgall-stream.t/ya.make
index 28abf655e4..428cb35d61 100644
--- a/contrib/libs/liburing/test/recv-msgall-stream.t/ya.make
+++ b/contrib/libs/liburing/test/recv-msgall-stream.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/recv-msgall.t/ya.make b/contrib/libs/liburing/test/recv-msgall.t/ya.make
index 0536130257..6a779b4378 100644
--- a/contrib/libs/liburing/test/recv-msgall.t/ya.make
+++ b/contrib/libs/liburing/test/recv-msgall.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/recv-multishot.t/ya.make b/contrib/libs/liburing/test/recv-multishot.t/ya.make
index c32fa366ae..4196930356 100644
--- a/contrib/libs/liburing/test/recv-multishot.t/ya.make
+++ b/contrib/libs/liburing/test/recv-multishot.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/recvsend_bundle.c b/contrib/libs/liburing/test/recvsend_bundle.c
new file mode 100644
index 0000000000..8d4305e847
--- /dev/null
+++ b/contrib/libs/liburing/test/recvsend_bundle.c
@@ -0,0 +1,692 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * Simple test case showing using send and recv bundles
+ */
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <pthread.h>
+
+#define MSG_SIZE 128
+#define NR_MIN_MSGS 4
+#define NR_MAX_MSGS 32
+#define SEQ_SIZE (MSG_SIZE / sizeof(unsigned long))
+
+static int nr_msgs;
+static int use_tcp;
+
+#define RECV_BIDS 8192
+#define RECV_BID_MASK (RECV_BIDS - 1)
+
+#include "liburing.h"
+#include "helpers.h"
+
+#define PORT 10202
+#define HOST "127.0.0.1"
+
+static int use_port = PORT;
+
+#define SEND_BGID 7
+#define RECV_BGID 8
+
+static int no_send_mshot;
+
+struct recv_data {
+ pthread_barrier_t connect;
+ pthread_barrier_t startup;
+ pthread_barrier_t barrier;
+ pthread_barrier_t finish;
+ unsigned long seq;
+ int recv_bytes;
+ int accept_fd;
+ int abort;
+ unsigned int max_sends;
+ int to_eagain;
+ void *recv_buf;
+
+ int send_bundle;
+ int recv_bundle;
+};
+
+static int arm_recv(struct io_uring *ring, struct recv_data *rd)
+{
+ struct io_uring_sqe *sqe;
+ int ret;
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_recv_multishot(sqe, rd->accept_fd, NULL, 0, 0);
+ if (rd->recv_bundle && use_tcp)
+ sqe->ioprio |= IORING_RECVSEND_BUNDLE;
+ sqe->buf_group = RECV_BGID;
+ sqe->flags |= IOSQE_BUFFER_SELECT;
+ sqe->user_data = 2;
+
+ ret = io_uring_submit(ring);
+ if (ret != 1) {
+ fprintf(stderr, "submit failed: %d\n", ret);
+ return 1;
+ }
+
+ return 0;
+}
+
+static int recv_prep(struct io_uring *ring, struct recv_data *rd, int *sock)
+{
+ struct sockaddr_in saddr;
+ int sockfd, ret, val, use_fd;
+ socklen_t socklen;
+
+ memset(&saddr, 0, sizeof(saddr));
+ saddr.sin_family = AF_INET;
+ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ saddr.sin_port = htons(use_port);
+
+ if (use_tcp)
+ sockfd = socket(AF_INET, SOCK_STREAM, 0);
+ else
+ sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (sockfd < 0) {
+ perror("socket");
+ return 1;
+ }
+
+ val = 1;
+ setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+
+ ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
+ if (ret < 0) {
+ perror("bind");
+ goto err;
+ }
+
+ if (use_tcp) {
+ ret = listen(sockfd, 1);
+ if (ret < 0) {
+ perror("listen");
+ goto err;
+ }
+
+ pthread_barrier_wait(&rd->connect);
+
+ socklen = sizeof(saddr);
+ use_fd = accept(sockfd, (struct sockaddr *)&saddr, &socklen);
+ if (use_fd < 0) {
+ perror("accept");
+ goto err;
+ }
+ } else {
+ use_fd = sockfd;
+ pthread_barrier_wait(&rd->connect);
+ }
+
+ rd->accept_fd = use_fd;
+ pthread_barrier_wait(&rd->startup);
+ pthread_barrier_wait(&rd->barrier);
+
+ if (arm_recv(ring, rd))
+ goto err;
+
+ *sock = sockfd;
+ return 0;
+err:
+ close(sockfd);
+ return 1;
+}
+
+static int verify_seq(struct recv_data *rd, void *verify_ptr, int verify_sz,
+ int start_bid)
+{
+ unsigned long *seqp;
+ int seq_size = verify_sz / sizeof(unsigned long);
+ int i;
+
+ seqp = verify_ptr;
+ for (i = 0; i < seq_size; i++) {
+ if (rd->seq != *seqp) {
+ fprintf(stderr, "bid=%d, got seq %lu, wanted %lu, offset %d\n", start_bid, *seqp, rd->seq, i);
+ return 0;
+ }
+ seqp++;
+ rd->seq++;
+ }
+
+ return 1;
+}
+
+static int recv_get_cqe(struct io_uring *ring, struct recv_data *rd,
+ struct io_uring_cqe **cqe)
+{
+ struct __kernel_timespec ts = { .tv_sec = 0, .tv_nsec = 100000000LL };
+ int ret;
+
+ do {
+ ret = io_uring_wait_cqe_timeout(ring, cqe, &ts);
+ if (!ret)
+ return 0;
+ if (ret == -ETIME) {
+ if (rd->abort)
+ break;
+ continue;
+ }
+ fprintf(stderr, "wait recv: %d\n", ret);
+ break;
+ } while (1);
+
+ return 1;
+}
+
+static int do_recv(struct io_uring *ring, struct recv_data *rd)
+{
+ struct io_uring_cqe *cqe;
+ int bid, next_bid = 0;
+ void *verify_ptr;
+ int verify_sz = 0;
+ int verify_bid = 0;
+
+ verify_ptr = malloc(rd->recv_bytes);
+
+ do {
+ if (recv_get_cqe(ring, rd, &cqe))
+ break;
+ if (cqe->res == -EINVAL) {
+ fprintf(stdout, "recv not supported, skipping\n");
+ return 0;
+ }
+ if (cqe->res < 0) {
+ fprintf(stderr, "failed recv cqe: %d\n", cqe->res);
+ goto err;
+ }
+ if (!(cqe->flags & IORING_CQE_F_BUFFER)) {
+ fprintf(stderr, "no buffer set in recv\n");
+ goto err;
+ }
+ bid = cqe->flags >> IORING_CQE_BUFFER_SHIFT;
+ if (bid != next_bid) {
+ fprintf(stderr, "got bid %d, wanted %d\n", bid, next_bid);
+ goto err;
+ }
+ if (!rd->recv_bundle && cqe->res != MSG_SIZE) {
+ fprintf(stderr, "recv got wrong length: %d\n", cqe->res);
+ goto err;
+ }
+ if (!(verify_sz % MSG_SIZE)) {
+ if (!verify_seq(rd, verify_ptr, verify_sz, verify_bid))
+ goto err;
+ verify_bid += verify_sz / MSG_SIZE;
+ verify_bid &= RECV_BID_MASK;
+ verify_sz = 0;
+ } else {
+ memcpy(verify_ptr + verify_sz, rd->recv_buf + (bid * MSG_SIZE), cqe->res);
+ verify_sz += cqe->res;
+ }
+ next_bid = bid + ((cqe->res + MSG_SIZE - 1) / MSG_SIZE);
+ next_bid &= RECV_BID_MASK;
+ rd->recv_bytes -= cqe->res;
+ io_uring_cqe_seen(ring, cqe);
+ if (!(cqe->flags & IORING_CQE_F_MORE) && rd->recv_bytes) {
+ if (arm_recv(ring, rd))
+ goto err;
+ }
+ } while (rd->recv_bytes);
+
+ if (verify_sz && !(verify_sz % MSG_SIZE) &&
+ !verify_seq(rd, verify_ptr, verify_sz, verify_bid))
+ goto err;
+
+ pthread_barrier_wait(&rd->finish);
+ return 0;
+err:
+ pthread_barrier_wait(&rd->finish);
+ return 1;
+}
+
+static void *recv_fn(void *data)
+{
+ struct recv_data *rd = data;
+ struct io_uring_params p = { };
+ struct io_uring ring;
+ struct io_uring_buf_ring *br;
+ void *buf, *ptr;
+ int ret, sock, i;
+
+ p.cq_entries = 4096;
+ p.flags = IORING_SETUP_CQSIZE;
+ ret = t_create_ring_params(16, &ring, &p);
+ if (ret == T_SETUP_SKIP) {
+ ret = 0;
+ goto err;
+ } else if (ret < 0) {
+ goto err;
+ }
+
+ if (posix_memalign(&buf, 4096, MSG_SIZE * RECV_BIDS))
+ goto err;
+
+ br = io_uring_setup_buf_ring(&ring, RECV_BIDS, RECV_BGID, 0, &ret);
+ if (!br) {
+ fprintf(stderr, "failed setting up recv ring %d\n", ret);
+ goto err;
+ }
+
+ ptr = buf;
+ for (i = 0; i < RECV_BIDS; i++) {
+ io_uring_buf_ring_add(br, ptr, MSG_SIZE, i, RECV_BID_MASK, i);
+ ptr += MSG_SIZE;
+ }
+ io_uring_buf_ring_advance(br, RECV_BIDS);
+ rd->recv_buf = buf;
+
+ ret = recv_prep(&ring, rd, &sock);
+ if (ret) {
+ fprintf(stderr, "recv_prep failed: %d\n", ret);
+ goto err;
+ }
+
+ ret = do_recv(&ring, rd);
+
+ close(sock);
+ close(rd->accept_fd);
+ io_uring_queue_exit(&ring);
+err:
+ return (void *)(intptr_t)ret;
+}
+
+static int __do_send_bundle(struct recv_data *rd, struct io_uring *ring, int sockfd)
+{
+ struct io_uring_cqe *cqe;
+ struct io_uring_sqe *sqe;
+ int bytes_needed = MSG_SIZE * nr_msgs;
+ int i, ret;
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_send_bundle(sqe, sockfd, 0, 0);
+ sqe->flags |= IOSQE_BUFFER_SELECT;
+ sqe->buf_group = SEND_BGID;
+ sqe->user_data = 1;
+
+ ret = io_uring_submit(ring);
+ if (ret != 1)
+ return 1;
+
+ pthread_barrier_wait(&rd->barrier);
+
+ for (i = 0; i < nr_msgs; i++) {
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "wait send: %d\n", ret);
+ return 1;
+ }
+ if (!i && cqe->res == -EINVAL) {
+ rd->abort = 1;
+ no_send_mshot = 1;
+ break;
+ }
+ if (cqe->res < 0) {
+ fprintf(stderr, "bad send cqe res: %d\n", cqe->res);
+ return 1;
+ }
+ bytes_needed -= cqe->res;
+ if (!bytes_needed) {
+ io_uring_cqe_seen(ring, cqe);
+ break;
+ }
+ if (!(cqe->flags & IORING_CQE_F_MORE)) {
+ fprintf(stderr, "expected more, but MORE not set\n");
+ return 1;
+ }
+ io_uring_cqe_seen(ring, cqe);
+ }
+
+ return 0;
+}
+
+static int __do_send(struct recv_data *rd, struct io_uring *ring, int sockfd)
+{
+ struct io_uring_cqe *cqe;
+ struct io_uring_sqe *sqe;
+ int bytes_needed = MSG_SIZE * nr_msgs;
+ int i, ret;
+
+ for (i = 0; i < nr_msgs; i++) {
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_send(sqe, sockfd, NULL, 0, 0);
+ sqe->user_data = 10 + i;
+ sqe->flags |= IOSQE_BUFFER_SELECT;
+ sqe->buf_group = SEND_BGID;
+
+ ret = io_uring_submit(ring);
+ if (ret != 1)
+ return 1;
+
+ if (!i)
+ pthread_barrier_wait(&rd->barrier);
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "send wait cqe %d\n", ret);
+ return 1;
+ }
+
+ if (!i && cqe->res == -EINVAL) {
+ rd->abort = 1;
+ no_send_mshot = 1;
+ break;
+ }
+ if (cqe->res != MSG_SIZE) {
+ fprintf(stderr, "send failed cqe: %d\n", cqe->res);
+ return 1;
+ }
+ if (cqe->res < 0) {
+ fprintf(stderr, "bad send cqe res: %d\n", cqe->res);
+ return 1;
+ }
+ bytes_needed -= cqe->res;
+ io_uring_cqe_seen(ring, cqe);
+ if (!bytes_needed)
+ break;
+ }
+
+ return 0;
+}
+
+static int do_send(struct recv_data *rd)
+{
+ struct sockaddr_in saddr;
+ struct io_uring ring;
+ unsigned long seq_buf[SEQ_SIZE], send_seq;
+ struct io_uring_params p = { };
+ struct io_uring_buf_ring *br;
+ int sockfd, ret, len, i;
+ socklen_t optlen;
+ void *buf, *ptr;
+
+ ret = io_uring_queue_init_params(16, &ring, &p);
+ if (ret) {
+ fprintf(stderr, "queue init failed: %d\n", ret);
+ return 1;
+ }
+ if (!(p.features & IORING_FEAT_RECVSEND_BUNDLE)) {
+ no_send_mshot = 1;
+ return 0;
+ }
+
+ if (posix_memalign(&buf, 4096, MSG_SIZE * nr_msgs))
+ return 1;
+
+ br = io_uring_setup_buf_ring(&ring, nr_msgs, SEND_BGID, 0, &ret);
+ if (!br) {
+ if (ret == -EINVAL) {
+ fprintf(stderr, "einval on br setup\n");
+ return 0;
+ }
+ fprintf(stderr, "failed setting up send ring %d\n", ret);
+ return 1;
+ }
+
+ ptr = buf;
+ for (i = 0; i < nr_msgs; i++) {
+ io_uring_buf_ring_add(br, ptr, MSG_SIZE, i, nr_msgs - 1, i);
+ ptr += MSG_SIZE;
+ }
+ io_uring_buf_ring_advance(br, nr_msgs);
+
+ memset(&saddr, 0, sizeof(saddr));
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = htons(use_port);
+ inet_pton(AF_INET, HOST, &saddr.sin_addr);
+
+ if (use_tcp)
+ sockfd = socket(AF_INET, SOCK_STREAM, 0);
+ else
+ sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (sockfd < 0) {
+ perror("socket");
+ goto err2;
+ }
+
+ pthread_barrier_wait(&rd->connect);
+
+ ret = connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
+ if (ret < 0) {
+ perror("connect");
+ goto err;
+ }
+
+ pthread_barrier_wait(&rd->startup);
+
+ optlen = sizeof(len);
+ len = 1024 * MSG_SIZE;
+ setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &len, optlen);
+
+ /* almost fill queue, leave room for one message */
+ send_seq = 0;
+ rd->to_eagain = 0;
+ while (rd->max_sends && rd->max_sends--) {
+ for (i = 0; i < SEQ_SIZE; i++)
+ seq_buf[i] = send_seq++;
+
+ ret = send(sockfd, seq_buf, sizeof(seq_buf), MSG_DONTWAIT);
+ if (ret < 0) {
+ if (errno == EAGAIN) {
+ send_seq -= SEQ_SIZE;
+ break;
+ }
+ perror("send");
+ return 1;
+ } else if (ret != sizeof(seq_buf)) {
+ fprintf(stderr, "short %d send\n", ret);
+ return 1;
+ }
+
+ rd->to_eagain++;
+ rd->recv_bytes += sizeof(seq_buf);
+ }
+
+ ptr = buf;
+ for (i = 0; i < nr_msgs; i++) {
+ unsigned long *pseq = ptr;
+ int j;
+
+ for (j = 0; j < SEQ_SIZE; j++)
+ pseq[j] = send_seq++;
+ ptr += MSG_SIZE;
+ }
+
+ /* prepare more messages, sending with bundle */
+ rd->recv_bytes += (nr_msgs * MSG_SIZE);
+ if (rd->send_bundle && use_tcp)
+ ret = __do_send_bundle(rd, &ring, sockfd);
+ else
+ ret = __do_send(rd, &ring, sockfd);
+ if (ret)
+ goto err;
+
+ pthread_barrier_wait(&rd->finish);
+
+ close(sockfd);
+ io_uring_queue_exit(&ring);
+ return 0;
+
+err:
+ close(sockfd);
+err2:
+ io_uring_queue_exit(&ring);
+ pthread_barrier_wait(&rd->finish);
+ return 1;
+}
+
+static int test(int backlog, unsigned int max_sends, int *to_eagain,
+ int send_bundle, int recv_bundle)
+{
+ pthread_t recv_thread;
+ struct recv_data rd;
+ int ret;
+ void *retval;
+
+ /* backlog not reliable on UDP, skip it */
+ if ((backlog || max_sends) && !use_tcp)
+ return T_EXIT_PASS;
+
+ memset(&rd, 0, sizeof(rd));
+ pthread_barrier_init(&rd.connect, NULL, 2);
+ pthread_barrier_init(&rd.startup, NULL, 2);
+ pthread_barrier_init(&rd.barrier, NULL, 2);
+ pthread_barrier_init(&rd.finish, NULL, 2);
+ rd.max_sends = max_sends;
+ if (to_eagain)
+ *to_eagain = 0;
+
+ rd.send_bundle = send_bundle;
+ rd.recv_bundle = recv_bundle;
+
+ ret = pthread_create(&recv_thread, NULL, recv_fn, &rd);
+ if (ret) {
+ fprintf(stderr, "Thread create failed: %d\n", ret);
+ return 1;
+ }
+
+ ret = do_send(&rd);
+ if (no_send_mshot)
+ return 0;
+
+ if (ret)
+ return ret;
+
+ pthread_join(recv_thread, &retval);
+ if (to_eagain)
+ *to_eagain = rd.to_eagain;
+ return (intptr_t)retval;
+}
+
+static int run_tests(int is_udp)
+{
+ int ret, eagain_hit;
+
+ nr_msgs = NR_MIN_MSGS;
+
+ /* test basic send bundle first */
+ ret = test(0, 0, NULL, 0, 0);
+ if (ret) {
+ fprintf(stderr, "test a failed\n");
+ return T_EXIT_FAIL;
+ }
+ if (no_send_mshot)
+ return T_EXIT_SKIP;
+
+ /* test recv bundle */
+ ret = test(0, 0, NULL, 0, 1);
+ if (ret) {
+ fprintf(stderr, "test b failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ /* test bundling recv and send */
+ ret = test(0, 0, NULL, 1, 1);
+ if (ret) {
+ fprintf(stderr, "test c failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ /* test bundling with full socket */
+ ret = test(1, 1000000, &eagain_hit, 1, 1);
+ if (ret) {
+ fprintf(stderr, "test d failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ /* test bundling with almost full socket */
+ ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 1, 1);
+ if (ret) {
+ fprintf(stderr, "test e failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ /* test recv bundle with almost full socket */
+ ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 0, 1);
+ if (ret) {
+ fprintf(stderr, "test f failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ if (is_udp)
+ return T_EXIT_PASS;
+
+ /* test send bundle with almost full socket */
+ ret = test(1, eagain_hit - (nr_msgs / 2), &eagain_hit, 1, 0);
+ if (ret) {
+ fprintf(stderr, "test g failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ /* now repeat the last three tests, but with > FAST_UIOV segments */
+ nr_msgs = NR_MAX_MSGS;
+
+ /* test bundling with almost full socket */
+ ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 1, 1);
+ if (ret) {
+ fprintf(stderr, "test h failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ /* test recv bundle with almost full socket */
+ ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 0, 1);
+ if (ret) {
+ fprintf(stderr, "test i failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ /* test send bundle with almost full socket */
+ ret = test(1, eagain_hit - (nr_msgs / 2), &eagain_hit, 1, 0);
+ if (ret) {
+ fprintf(stderr, "test j failed\n");
+ return T_EXIT_FAIL;
+ }
+
+ return T_EXIT_PASS;
+}
+
+static int test_tcp(void)
+{
+ int ret;
+
+ use_tcp = 1;
+ ret = run_tests(false);
+ if (ret == T_EXIT_FAIL)
+ fprintf(stderr, "TCP test case failed\n");
+ return ret;
+}
+
+static int test_udp(void)
+{
+ int ret;
+
+ use_tcp = 0;
+ use_port++;
+ ret = run_tests(true);
+ if (ret == T_EXIT_FAIL)
+ fprintf(stderr, "UDP test case failed\n");
+ return ret;
+}
+
+int main(int argc, char *argv[])
+{
+ int ret;
+
+ if (argc > 1)
+ return T_EXIT_SKIP;
+
+ ret = test_tcp();
+ if (ret != T_EXIT_PASS)
+ return ret;
+
+ ret = test_udp();
+ if (ret != T_EXIT_PASS)
+ return ret;
+
+ return T_EXIT_PASS;
+}
diff --git a/contrib/libs/liburing/test/recvsend_bundle.t/ya.make b/contrib/libs/liburing/test/recvsend_bundle.t/ya.make
new file mode 100644
index 0000000000..d4928a810d
--- /dev/null
+++ b/contrib/libs/liburing/test/recvsend_bundle.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ helpers.c
+ recvsend_bundle.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/reg-fd-only.t/ya.make b/contrib/libs/liburing/test/reg-fd-only.t/ya.make
index 195e9896b6..373599e6c3 100644
--- a/contrib/libs/liburing/test/reg-fd-only.t/ya.make
+++ b/contrib/libs/liburing/test/reg-fd-only.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/reg-hint.t/ya.make b/contrib/libs/liburing/test/reg-hint.t/ya.make
index 930139eff6..1aaaff7170 100644
--- a/contrib/libs/liburing/test/reg-hint.t/ya.make
+++ b/contrib/libs/liburing/test/reg-hint.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/reg-reg-ring.t/ya.make b/contrib/libs/liburing/test/reg-reg-ring.t/ya.make
index 151beee463..09fb918298 100644
--- a/contrib/libs/liburing/test/reg-reg-ring.t/ya.make
+++ b/contrib/libs/liburing/test/reg-reg-ring.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/regbuf-merge.t/ya.make b/contrib/libs/liburing/test/regbuf-merge.t/ya.make
index b5ab2297a3..1a108c6c3e 100644
--- a/contrib/libs/liburing/test/regbuf-merge.t/ya.make
+++ b/contrib/libs/liburing/test/regbuf-merge.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/register-restrictions.t/ya.make b/contrib/libs/liburing/test/register-restrictions.t/ya.make
index bdb10012d2..6e5e8b92ee 100644
--- a/contrib/libs/liburing/test/register-restrictions.t/ya.make
+++ b/contrib/libs/liburing/test/register-restrictions.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/rename.t/ya.make b/contrib/libs/liburing/test/rename.t/ya.make
index e2c515d2f1..2c782d7d0a 100644
--- a/contrib/libs/liburing/test/rename.t/ya.make
+++ b/contrib/libs/liburing/test/rename.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/ring-leak.t/ya.make b/contrib/libs/liburing/test/ring-leak.t/ya.make
index 56f4dba6ee..bb0c0ded49 100644
--- a/contrib/libs/liburing/test/ring-leak.t/ya.make
+++ b/contrib/libs/liburing/test/ring-leak.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/ring-leak2.t/ya.make b/contrib/libs/liburing/test/ring-leak2.t/ya.make
index e805f0c20c..720bef28bc 100644
--- a/contrib/libs/liburing/test/ring-leak2.t/ya.make
+++ b/contrib/libs/liburing/test/ring-leak2.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/ringbuf-read.t/ya.make b/contrib/libs/liburing/test/ringbuf-read.t/ya.make
index a7566c0963..894e741045 100644
--- a/contrib/libs/liburing/test/ringbuf-read.t/ya.make
+++ b/contrib/libs/liburing/test/ringbuf-read.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/ringbuf-status.t/ya.make b/contrib/libs/liburing/test/ringbuf-status.t/ya.make
index 8ad9c1be50..5c45952a94 100644
--- a/contrib/libs/liburing/test/ringbuf-status.t/ya.make
+++ b/contrib/libs/liburing/test/ringbuf-status.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/rsrc_tags.t/ya.make b/contrib/libs/liburing/test/rsrc_tags.t/ya.make
index 766bd30f7c..7ad3a073e8 100644
--- a/contrib/libs/liburing/test/rsrc_tags.t/ya.make
+++ b/contrib/libs/liburing/test/rsrc_tags.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/rw_merge_test.t/ya.make b/contrib/libs/liburing/test/rw_merge_test.t/ya.make
index b0daa7fdd7..408f4de290 100644
--- a/contrib/libs/liburing/test/rw_merge_test.t/ya.make
+++ b/contrib/libs/liburing/test/rw_merge_test.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/self.t/ya.make b/contrib/libs/liburing/test/self.t/ya.make
index ac135e284f..d5a5f0ddc6 100644
--- a/contrib/libs/liburing/test/self.t/ya.make
+++ b/contrib/libs/liburing/test/self.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/send-zerocopy.c b/contrib/libs/liburing/test/send-zerocopy.c
index dab707d1e5..75149d55d3 100644
--- a/contrib/libs/liburing/test/send-zerocopy.c
+++ b/contrib/libs/liburing/test/send-zerocopy.c
@@ -72,6 +72,7 @@ static struct iovec buffers_iov[__BUF_NR];
static bool has_sendzc;
static bool has_sendmsg;
+static bool hit_enomem;
static int probe_zc_support(void)
{
@@ -537,6 +538,17 @@ static int do_test_inet_send(struct io_uring *ring, int sock_client, int sock_se
if (cqe->user_data == nr_reqs - 1)
expected = chunk_size_last;
if (cqe->res != expected) {
+ if (cqe->res == -ENOMEM) {
+ if (!hit_enomem) {
+ fprintf(stderr, "Hit -ENOMEM. "
+ "Increase ulimit -l "
+ "limit for a complete "
+ "test run. Skipping "
+ "parts.\n");
+ hit_enomem = 1;
+ }
+ return 0;
+ }
fprintf(stderr, "invalid cqe->res %d expected %d\n",
cqe->res, expected);
return 1;
diff --git a/contrib/libs/liburing/test/send-zerocopy.t/ya.make b/contrib/libs/liburing/test/send-zerocopy.t/ya.make
index 049dd20e8b..8488fd09ad 100644
--- a/contrib/libs/liburing/test/send-zerocopy.t/ya.make
+++ b/contrib/libs/liburing/test/send-zerocopy.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/send_recv.c b/contrib/libs/liburing/test/send_recv.c
index 5bf929ba16..a5c78c42d3 100644
--- a/contrib/libs/liburing/test/send_recv.c
+++ b/contrib/libs/liburing/test/send_recv.c
@@ -24,7 +24,7 @@ static char str[] = "This is a test of send and recv over io_uring!";
#define HOST "127.0.0.1"
static int recv_prep(struct io_uring *ring, struct iovec *iov, int *sock,
- int registerfiles)
+ int registerfiles, int async, int provide)
{
struct sockaddr_in saddr;
struct io_uring_sqe *sqe;
@@ -65,6 +65,10 @@ static int recv_prep(struct io_uring *ring, struct iovec *iov, int *sock,
io_uring_prep_recv(sqe, use_fd, iov->iov_base, iov->iov_len, 0);
if (registerfiles)
sqe->flags |= IOSQE_FIXED_FILE;
+ if (async)
+ sqe->flags |= IOSQE_ASYNC;
+ if (provide)
+ sqe->flags |= IOSQE_BUFFER_SELECT;
sqe->user_data = 2;
ret = io_uring_submit(ring);
@@ -80,7 +84,7 @@ err:
return 1;
}
-static int do_recv(struct io_uring *ring, struct iovec *iov)
+static int do_recv(struct io_uring *ring, struct iovec *iov, int enobufs)
{
struct io_uring_cqe *cqe;
int ret;
@@ -88,11 +92,18 @@ static int do_recv(struct io_uring *ring, struct iovec *iov)
ret = io_uring_wait_cqe(ring, &cqe);
if (ret) {
fprintf(stdout, "wait_cqe: %d\n", ret);
- goto err;
+ return 1;
}
if (cqe->res == -EINVAL) {
fprintf(stdout, "recv not supported, skipping\n");
- return 0;
+ goto out;
+ }
+ if (cqe->res == -ENOBUFS && enobufs) {
+ if (cqe->flags & IORING_CQE_F_SOCK_NONEMPTY) {
+ fprintf(stdout, "NONEMPTY set on -ENOBUFS\n");
+ goto err;
+ }
+ goto out;
}
if (cqe->res < 0) {
fprintf(stderr, "failed cqe: %d\n", cqe->res);
@@ -110,8 +121,11 @@ static int do_recv(struct io_uring *ring, struct iovec *iov)
goto err;
}
+out:
+ io_uring_cqe_seen(ring, cqe);
return 0;
err:
+ io_uring_cqe_seen(ring, cqe);
return 1;
}
@@ -119,6 +133,8 @@ struct recv_data {
pthread_mutex_t mutex;
int use_sqthread;
int registerfiles;
+ int async;
+ int provide;
};
static void *recv_fn(void *data)
@@ -153,13 +169,14 @@ static void *recv_fn(void *data)
}
}
- ret = recv_prep(&ring, &iov, &sock, rd->registerfiles);
+ ret = recv_prep(&ring, &iov, &sock, rd->registerfiles, rd->async,
+ rd->provide);
if (ret) {
fprintf(stderr, "recv_prep failed: %d\n", ret);
goto err;
}
pthread_mutex_unlock(&rd->mutex);
- ret = do_recv(&ring, &iov);
+ ret = do_recv(&ring, &iov, rd->provide);
close(sock);
io_uring_queue_exit(&ring);
@@ -233,7 +250,7 @@ err2:
return 1;
}
-static int test(int use_sqthread, int regfiles)
+static int test(int use_sqthread, int regfiles, int async, int provide)
{
pthread_mutexattr_t attr;
pthread_t recv_thread;
@@ -247,6 +264,8 @@ static int test(int use_sqthread, int regfiles)
pthread_mutex_lock(&rd.mutex);
rd.use_sqthread = use_sqthread;
rd.registerfiles = regfiles;
+ rd.async = async;
+ rd.provide = provide;
ret = pthread_create(&recv_thread, NULL, recv_fn, &rd);
if (ret) {
@@ -318,21 +337,75 @@ int main(int argc, char *argv[])
return ret;
}
- ret = test(0, 0);
+ ret = test(0, 0, 1, 1);
+ if (ret) {
+ fprintf(stderr, "test sqthread=0 1 1 failed\n");
+ return ret;
+ }
+
+ ret = test(1, 1, 1, 1);
+ if (ret) {
+ fprintf(stderr, "test sqthread=1 reg=1 1 1 failed\n");
+ return ret;
+ }
+
+ ret = test(1, 0, 1, 1);
+ if (ret) {
+ fprintf(stderr, "test sqthread=1 reg=0 1 1 failed\n");
+ return ret;
+ }
+
+ ret = test(0, 0, 0, 1);
+ if (ret) {
+ fprintf(stderr, "test sqthread=0 0 1 failed\n");
+ return ret;
+ }
+
+ ret = test(1, 1, 0, 1);
+ if (ret) {
+ fprintf(stderr, "test sqthread=1 reg=1 0 1 failed\n");
+ return ret;
+ }
+
+ ret = test(1, 0, 0, 1);
+ if (ret) {
+ fprintf(stderr, "test sqthread=1 reg=0 0 1 failed\n");
+ return ret;
+ }
+
+ ret = test(0, 0, 1, 0);
+ if (ret) {
+ fprintf(stderr, "test sqthread=0 0 1 failed\n");
+ return ret;
+ }
+
+ ret = test(1, 1, 1, 0);
+ if (ret) {
+ fprintf(stderr, "test sqthread=1 reg=1 1 0 failed\n");
+ return ret;
+ }
+
+ ret = test(1, 0, 1, 0);
+ if (ret) {
+ fprintf(stderr, "test sqthread=1 reg=0 1 0 failed\n");
+ return ret;
+ }
+
+ ret = test(0, 0, 0, 0);
if (ret) {
- fprintf(stderr, "test sqthread=0 failed\n");
+ fprintf(stderr, "test sqthread=0 0 0 failed\n");
return ret;
}
- ret = test(1, 1);
+ ret = test(1, 1, 0, 0);
if (ret) {
- fprintf(stderr, "test sqthread=1 reg=1 failed\n");
+ fprintf(stderr, "test sqthread=1 reg=1 0 0 failed\n");
return ret;
}
- ret = test(1, 0);
+ ret = test(1, 0, 0, 0);
if (ret) {
- fprintf(stderr, "test sqthread=1 reg=0 failed\n");
+ fprintf(stderr, "test sqthread=1 reg=0 0 0 failed\n");
return ret;
}
diff --git a/contrib/libs/liburing/test/send_recv.t/ya.make b/contrib/libs/liburing/test/send_recv.t/ya.make
index aa534fe667..9ebfd4beb7 100644
--- a/contrib/libs/liburing/test/send_recv.t/ya.make
+++ b/contrib/libs/liburing/test/send_recv.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/send_recvmsg.t/ya.make b/contrib/libs/liburing/test/send_recvmsg.t/ya.make
index 6f4f2e3591..819cfe1e8f 100644
--- a/contrib/libs/liburing/test/send_recvmsg.t/ya.make
+++ b/contrib/libs/liburing/test/send_recvmsg.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/shared-wq.t/ya.make b/contrib/libs/liburing/test/shared-wq.t/ya.make
index 0538f7b07b..7d6ec12f79 100644
--- a/contrib/libs/liburing/test/shared-wq.t/ya.make
+++ b/contrib/libs/liburing/test/shared-wq.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/short-read.t/ya.make b/contrib/libs/liburing/test/short-read.t/ya.make
index 010324515c..20b7807f6a 100644
--- a/contrib/libs/liburing/test/short-read.t/ya.make
+++ b/contrib/libs/liburing/test/short-read.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/shutdown.t/ya.make b/contrib/libs/liburing/test/shutdown.t/ya.make
index e99ccee83f..4f388e64a6 100644
--- a/contrib/libs/liburing/test/shutdown.t/ya.make
+++ b/contrib/libs/liburing/test/shutdown.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sigfd-deadlock.t/ya.make b/contrib/libs/liburing/test/sigfd-deadlock.t/ya.make
index 7dae5c63f3..923d05efa3 100644
--- a/contrib/libs/liburing/test/sigfd-deadlock.t/ya.make
+++ b/contrib/libs/liburing/test/sigfd-deadlock.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/single-issuer.t/ya.make b/contrib/libs/liburing/test/single-issuer.t/ya.make
index 4dc1e6fb9a..22b9933c40 100644
--- a/contrib/libs/liburing/test/single-issuer.t/ya.make
+++ b/contrib/libs/liburing/test/single-issuer.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/skip-cqe.t/ya.make b/contrib/libs/liburing/test/skip-cqe.t/ya.make
index 3e173bc25e..b2d5c9ae5a 100644
--- a/contrib/libs/liburing/test/skip-cqe.t/ya.make
+++ b/contrib/libs/liburing/test/skip-cqe.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/socket-getsetsock-cmd.c b/contrib/libs/liburing/test/socket-getsetsock-cmd.c
index 275ac66537..3512983f21 100644
--- a/contrib/libs/liburing/test/socket-getsetsock-cmd.c
+++ b/contrib/libs/liburing/test/socket-getsetsock-cmd.c
@@ -54,7 +54,8 @@ static struct io_uring create_ring(void)
static int submit_cmd_sqe(struct io_uring *ring, int32_t fd,
int op, int level, int optname,
- void *optval, int optlen)
+ void *optval, int optlen,
+ bool async)
{
struct io_uring_sqe *sqe;
int err;
@@ -66,6 +67,8 @@ static int submit_cmd_sqe(struct io_uring *ring, int32_t fd,
io_uring_prep_cmd_sock(sqe, op, fd, level, optname, optval, optlen);
sqe->user_data = USERDATA;
+ if (async)
+ sqe->flags |= IOSQE_ASYNC;
/* Submitting SQE */
err = io_uring_submit_and_wait(ring, 1);
@@ -93,7 +96,7 @@ static int receive_cqe(struct io_uring *ring)
* Run getsock operation using SO_RCVBUF using io_uring cmd operation and
* getsockopt(2) and compare the results.
*/
-static int run_get_rcvbuf(struct io_uring *ring, struct fds *sockfds)
+static int run_get_rcvbuf(struct io_uring *ring, struct fds *sockfds, bool async)
{
int sval, uval, ulen, err;
unsigned int slen;
@@ -105,7 +108,7 @@ static int run_get_rcvbuf(struct io_uring *ring, struct fds *sockfds)
/* get through io_uring cmd */
err = submit_cmd_sqe(ring, sockfds->rx, SOCKET_URING_OP_GETSOCKOPT,
- SOL_SOCKET, SO_RCVBUF, &uval, ulen);
+ SOL_SOCKET, SO_RCVBUF, &uval, ulen, async);
assert(err == 1);
/* Wait for the CQE */
@@ -134,7 +137,7 @@ static int run_get_rcvbuf(struct io_uring *ring, struct fds *sockfds)
* Run getsock operation using SO_PEERNAME using io_uring cmd operation
* and getsockopt(2) and compare the results.
*/
-static int run_get_peername(struct io_uring *ring, struct fds *sockfds)
+static int run_get_peername(struct io_uring *ring, struct fds *sockfds, bool async)
{
struct sockaddr sval, uval = {};
socklen_t slen = sizeof(sval);
@@ -147,7 +150,7 @@ static int run_get_peername(struct io_uring *ring, struct fds *sockfds)
/* Getting SO_PEERNAME */
err = submit_cmd_sqe(ring, sockfds->rx, SOCKET_URING_OP_GETSOCKOPT,
- SOL_SOCKET, SO_PEERNAME, &uval, ulen);
+ SOL_SOCKET, SO_PEERNAME, &uval, ulen, async);
assert(err == 1);
/* Wait for the CQE */
@@ -179,20 +182,27 @@ static int run_getsockopt_test(struct io_uring *ring, struct fds *sockfds)
{
int err;
- fprintf(stderr, "Testing getsockopt SO_PEERNAME\n");
- err = run_get_peername(ring, sockfds);
+ err = run_get_peername(ring, sockfds, false);
if (err)
return err;
- fprintf(stderr, "Testing getsockopt SO_RCVBUF\n");
- return run_get_rcvbuf(ring, sockfds);
+ err = run_get_peername(ring, sockfds, true);
+ if (err)
+ return err;
+
+ err = run_get_rcvbuf(ring, sockfds, false);
+ if (err)
+ return err;
+
+ return run_get_rcvbuf(ring, sockfds, true);
}
/*
* Given a `val` value, set it in SO_REUSEPORT using io_uring cmd, and read using
* getsockopt(2), and make sure they match.
*/
-static int run_setsockopt_reuseport(struct io_uring *ring, struct fds *sockfds, int val)
+static int run_setsockopt_reuseport(struct io_uring *ring, struct fds *sockfds,
+ int val, bool async)
{
unsigned int slen, ulen;
int sval, uval = val;
@@ -203,7 +213,7 @@ static int run_setsockopt_reuseport(struct io_uring *ring, struct fds *sockfds,
/* Setting SO_REUSEPORT */
err = submit_cmd_sqe(ring, sockfds->rx, SOCKET_URING_OP_SETSOCKOPT,
- SOL_SOCKET, SO_REUSEPORT, &uval, ulen);
+ SOL_SOCKET, SO_REUSEPORT, &uval, ulen, async);
assert(err == 1);
err = receive_cqe(ring);
@@ -225,7 +235,8 @@ static int run_setsockopt_reuseport(struct io_uring *ring, struct fds *sockfds,
* Given a `val` value, set the TCP_USER_TIMEOUT using io_uring and read using
* getsockopt(2). Make sure they match
*/
-static int run_setsockopt_usertimeout(struct io_uring *ring, struct fds *sockfds, int val)
+static int run_setsockopt_usertimeout(struct io_uring *ring, struct fds *sockfds,
+ int val, bool async)
{
int optname = TCP_USER_TIMEOUT;
int level = IPPROTO_TCP;
@@ -239,7 +250,7 @@ static int run_setsockopt_usertimeout(struct io_uring *ring, struct fds *sockfds
/* Setting timeout */
err = submit_cmd_sqe(ring, sockfds->rx, SOCKET_URING_OP_SETSOCKOPT,
- level, optname, &uval, ulen);
+ level, optname, &uval, ulen, async);
assert(err == 1);
err = receive_cqe(ring);
@@ -262,19 +273,22 @@ static int run_setsockopt_usertimeout(struct io_uring *ring, struct fds *sockfds
static int run_setsockopt_test(struct io_uring *ring, struct fds *sockfds)
{
int err, i;
+ int j;
- fprintf(stderr, "Testing setsockopt SOL_SOCKET/SO_REUSEPORT\n");
- for (i = 0; i <= 1; i++) {
- err = run_setsockopt_reuseport(ring, sockfds, i);
- if (err)
- return err;
- }
+ for (j = 0; j < 2; j++) {
+ bool async = j & 1;
- fprintf(stderr, "Testing setsockopt IPPROTO_TCP/TCP_FASTOPEN\n");
- for (i = 1; i <= 10; i++) {
- err = run_setsockopt_usertimeout(ring, sockfds, i);
- if (err)
- return err;
+ for (i = 0; i <= 1; i++) {
+ err = run_setsockopt_reuseport(ring, sockfds, i, async);
+ if (err)
+ return err;
+ }
+
+ for (i = 1; i <= 10; i++) {
+ err = run_setsockopt_usertimeout(ring, sockfds, i, async);
+ if (err)
+ return err;
+ }
}
return err;
diff --git a/contrib/libs/liburing/test/socket-getsetsock-cmd.t/ya.make b/contrib/libs/liburing/test/socket-getsetsock-cmd.t/ya.make
index cfb50a091f..17a58600d7 100644
--- a/contrib/libs/liburing/test/socket-getsetsock-cmd.t/ya.make
+++ b/contrib/libs/liburing/test/socket-getsetsock-cmd.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/socket-io-cmd.t/ya.make b/contrib/libs/liburing/test/socket-io-cmd.t/ya.make
index 0d95a370f2..1bef521386 100644
--- a/contrib/libs/liburing/test/socket-io-cmd.t/ya.make
+++ b/contrib/libs/liburing/test/socket-io-cmd.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/socket-rw-eagain.t/ya.make b/contrib/libs/liburing/test/socket-rw-eagain.t/ya.make
index d6c6124cec..b8be4cd81a 100644
--- a/contrib/libs/liburing/test/socket-rw-eagain.t/ya.make
+++ b/contrib/libs/liburing/test/socket-rw-eagain.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/socket-rw-offset.t/ya.make b/contrib/libs/liburing/test/socket-rw-offset.t/ya.make
index 8274260532..58f6331b37 100644
--- a/contrib/libs/liburing/test/socket-rw-offset.t/ya.make
+++ b/contrib/libs/liburing/test/socket-rw-offset.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/socket-rw.t/ya.make b/contrib/libs/liburing/test/socket-rw.t/ya.make
index 1b276d2ade..df06bc4449 100644
--- a/contrib/libs/liburing/test/socket-rw.t/ya.make
+++ b/contrib/libs/liburing/test/socket-rw.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/socket.t/ya.make b/contrib/libs/liburing/test/socket.t/ya.make
index c5598df6c4..598bf99516 100644
--- a/contrib/libs/liburing/test/socket.t/ya.make
+++ b/contrib/libs/liburing/test/socket.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/splice.t/ya.make b/contrib/libs/liburing/test/splice.t/ya.make
index 1fe1ab6f95..2dc1ee706a 100644
--- a/contrib/libs/liburing/test/splice.t/ya.make
+++ b/contrib/libs/liburing/test/splice.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sq-full-cpp.t/ya.make b/contrib/libs/liburing/test/sq-full-cpp.t/ya.make
index 26e1aafe13..5a4d26b61a 100644
--- a/contrib/libs/liburing/test/sq-full-cpp.t/ya.make
+++ b/contrib/libs/liburing/test/sq-full-cpp.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sq-full.t/ya.make b/contrib/libs/liburing/test/sq-full.t/ya.make
index 14f2839dbc..baa4eb0cf5 100644
--- a/contrib/libs/liburing/test/sq-full.t/ya.make
+++ b/contrib/libs/liburing/test/sq-full.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sq-poll-dup.t/ya.make b/contrib/libs/liburing/test/sq-poll-dup.t/ya.make
index ecd16fb29e..9e86468e20 100644
--- a/contrib/libs/liburing/test/sq-poll-dup.t/ya.make
+++ b/contrib/libs/liburing/test/sq-poll-dup.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sq-poll-kthread.t/ya.make b/contrib/libs/liburing/test/sq-poll-kthread.t/ya.make
index 3457033f1b..61be5885c7 100644
--- a/contrib/libs/liburing/test/sq-poll-kthread.t/ya.make
+++ b/contrib/libs/liburing/test/sq-poll-kthread.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sq-poll-share.t/ya.make b/contrib/libs/liburing/test/sq-poll-share.t/ya.make
index 7594905de6..7b739bc0f6 100644
--- a/contrib/libs/liburing/test/sq-poll-share.t/ya.make
+++ b/contrib/libs/liburing/test/sq-poll-share.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sq-space_left.t/ya.make b/contrib/libs/liburing/test/sq-space_left.t/ya.make
index d2796f2a0b..f23eec434a 100644
--- a/contrib/libs/liburing/test/sq-space_left.t/ya.make
+++ b/contrib/libs/liburing/test/sq-space_left.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sqpoll-disable-exit.t/ya.make b/contrib/libs/liburing/test/sqpoll-disable-exit.t/ya.make
index 19017498ea..69163bf995 100644
--- a/contrib/libs/liburing/test/sqpoll-disable-exit.t/ya.make
+++ b/contrib/libs/liburing/test/sqpoll-disable-exit.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sqpoll-exec.c b/contrib/libs/liburing/test/sqpoll-exec.c
new file mode 100644
index 0000000000..069171b272
--- /dev/null
+++ b/contrib/libs/liburing/test/sqpoll-exec.c
@@ -0,0 +1,133 @@
+#include "../config-host.h"
+/* SPDX-License-Identifier: MIT */
+/*
+ * Description: Check that closing a file with SQPOLL has it immediately closed
+ * upon receiving the CQE for the close. The 6.9 kernel had a bug
+ * where SQPOLL would not run kernel wide task_work when running the
+ * private task_work, which would defer the close if this was the
+ * final close of the file.
+ */
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "helpers.h"
+#include "liburing.h"
+
+static int fill_exec_target(char *dst, char *path)
+{
+ struct stat sb;
+
+ /*
+ * Should either be ./exec-target.t or test/exec-target.t
+ */
+ sprintf(dst, "%s", path);
+ return stat(dst, &sb);
+}
+
+static int test_exec(struct io_uring *ring, char * const argv[])
+{
+ char prog_path[PATH_MAX];
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ int ret, wstatus, fd;
+ pid_t p;
+
+ if (fill_exec_target(prog_path, "./exec-target.t") &&
+ fill_exec_target(prog_path, "test/exec-target.t")) {
+ fprintf(stdout, "Can't find exec-target, skipping\n");
+ return 0;
+ }
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_openat(sqe, AT_FDCWD, prog_path, O_WRONLY, 0);
+ sqe->user_data = 0;
+
+ io_uring_submit(ring);
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "wait cqe %d\n", ret);
+ return 1;
+ }
+ if (cqe->res < 0) {
+ fprintf(stderr, "open: %d\n", cqe->res);
+ return 1;
+ }
+ fd = cqe->res;
+ io_uring_cqe_seen(ring, cqe);
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_close(sqe, fd);
+ sqe->user_data = 1;
+
+ io_uring_submit(ring);
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "wait cqe %d\n", ret);
+ return 1;
+ }
+ if (cqe->res < 0) {
+ fprintf(stderr, "close: %d\n", cqe->res);
+ return 1;
+ }
+ io_uring_cqe_seen(ring, cqe);
+
+ p = fork();
+ if (p == -1) {
+ fprintf(stderr, "fork() failed\n");
+ return 1;
+ }
+
+ if (p == 0) {
+ /* file should be closed, try exec'ing it */
+ ret = execve(prog_path, argv, NULL);
+ if (ret) {
+ fprintf(stderr, "exec failed: %s\n", strerror(errno));
+ exit(1);
+ }
+ }
+
+ if (waitpid(p, &wstatus, 0) == (pid_t)-1) {
+ perror("waitpid()");
+ return 1;
+ }
+ if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus))
+ return 1;
+
+ return 0;
+}
+
+int main(int argc, char * const argv[])
+{
+ struct io_uring_params p = { .flags = IORING_SETUP_SQPOLL, };
+ struct io_uring ring;
+ int ret, i;
+
+ if (argc > 1)
+ return T_EXIT_SKIP;
+
+ ret = t_create_ring_params(8, &ring, &p);
+ if (ret == T_SETUP_SKIP)
+ return T_EXIT_SKIP;
+ else if (ret != T_SETUP_OK)
+ return T_EXIT_FAIL;
+
+ for (i = 0; i < 20; i++) {
+ ret = test_exec(&ring, argv);
+ if (ret) {
+ fprintf(stderr, "test_exec failed\n");
+ return ret;
+ }
+ }
+
+ return T_EXIT_PASS;
+}
diff --git a/contrib/libs/liburing/test/sqpoll-exec.t/ya.make b/contrib/libs/liburing/test/sqpoll-exec.t/ya.make
new file mode 100644
index 0000000000..7c98e7a947
--- /dev/null
+++ b/contrib/libs/liburing/test/sqpoll-exec.t/ya.make
@@ -0,0 +1,35 @@
+# Generated by devtools/yamaker.
+
+PROGRAM()
+
+WITHOUT_LICENSE_TEXTS()
+
+VERSION(2.7)
+
+LICENSE(MIT)
+
+PEERDIR(
+ contrib/libs/liburing
+)
+
+ADDINCL(
+ contrib/libs/liburing/src/include
+)
+
+NO_COMPILER_WARNINGS()
+
+NO_RUNTIME()
+
+CFLAGS(
+ -DLIBURING_BUILD_TEST
+ -D__SANE_USERSPACE_TYPES__
+)
+
+SRCDIR(contrib/libs/liburing/test)
+
+SRCS(
+ helpers.c
+ sqpoll-exec.c
+)
+
+END()
diff --git a/contrib/libs/liburing/test/sqpoll-exit-hang.t/ya.make b/contrib/libs/liburing/test/sqpoll-exit-hang.t/ya.make
index ace1abebdd..c3fdac8493 100644
--- a/contrib/libs/liburing/test/sqpoll-exit-hang.t/ya.make
+++ b/contrib/libs/liburing/test/sqpoll-exit-hang.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sqpoll-sleep.t/ya.make b/contrib/libs/liburing/test/sqpoll-sleep.t/ya.make
index 3319f3a922..ccf2774f1d 100644
--- a/contrib/libs/liburing/test/sqpoll-sleep.t/ya.make
+++ b/contrib/libs/liburing/test/sqpoll-sleep.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/stdout.t/ya.make b/contrib/libs/liburing/test/stdout.t/ya.make
index 5fe98974f1..53a1c134cc 100644
--- a/contrib/libs/liburing/test/stdout.t/ya.make
+++ b/contrib/libs/liburing/test/stdout.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/submit-and-wait.t/ya.make b/contrib/libs/liburing/test/submit-and-wait.t/ya.make
index ed3d422e6d..63234cd835 100644
--- a/contrib/libs/liburing/test/submit-and-wait.t/ya.make
+++ b/contrib/libs/liburing/test/submit-and-wait.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/submit-link-fail.t/ya.make b/contrib/libs/liburing/test/submit-link-fail.t/ya.make
index ff0304284b..342296fe78 100644
--- a/contrib/libs/liburing/test/submit-link-fail.t/ya.make
+++ b/contrib/libs/liburing/test/submit-link-fail.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/submit-reuse.t/ya.make b/contrib/libs/liburing/test/submit-reuse.t/ya.make
index a230e5db4d..05b78c046d 100644
--- a/contrib/libs/liburing/test/submit-reuse.t/ya.make
+++ b/contrib/libs/liburing/test/submit-reuse.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/symlink.t/ya.make b/contrib/libs/liburing/test/symlink.t/ya.make
index 334bc6be8a..781a2bacff 100644
--- a/contrib/libs/liburing/test/symlink.t/ya.make
+++ b/contrib/libs/liburing/test/symlink.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/sync-cancel.t/ya.make b/contrib/libs/liburing/test/sync-cancel.t/ya.make
index 565e12e143..d6a5a15318 100644
--- a/contrib/libs/liburing/test/sync-cancel.t/ya.make
+++ b/contrib/libs/liburing/test/sync-cancel.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/teardowns.t/ya.make b/contrib/libs/liburing/test/teardowns.t/ya.make
index 9572eafd2b..f227ee9f18 100644
--- a/contrib/libs/liburing/test/teardowns.t/ya.make
+++ b/contrib/libs/liburing/test/teardowns.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/thread-exit.t/ya.make b/contrib/libs/liburing/test/thread-exit.t/ya.make
index 36a413aead..eefdfcf3f1 100644
--- a/contrib/libs/liburing/test/thread-exit.t/ya.make
+++ b/contrib/libs/liburing/test/thread-exit.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/timeout-new.t/ya.make b/contrib/libs/liburing/test/timeout-new.t/ya.make
index 4996ca45c2..1303f2cf15 100644
--- a/contrib/libs/liburing/test/timeout-new.t/ya.make
+++ b/contrib/libs/liburing/test/timeout-new.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/timeout.c b/contrib/libs/liburing/test/timeout.c
index d43c15db17..8e3c7bdf7c 100644
--- a/contrib/libs/liburing/test/timeout.c
+++ b/contrib/libs/liburing/test/timeout.c
@@ -1234,7 +1234,7 @@ static int test_timeout_link_cancel(void)
exit(1);
}
- /* trigger full cancellation */
+ /* trigger full cancelation */
ret = execl(prog_path, prog_path, NULL);
if (ret) {
fprintf(stderr, "exec failed %i\n", errno);
diff --git a/contrib/libs/liburing/test/timeout.t/ya.make b/contrib/libs/liburing/test/timeout.t/ya.make
index 59de54895c..3b26c010dd 100644
--- a/contrib/libs/liburing/test/timeout.t/ya.make
+++ b/contrib/libs/liburing/test/timeout.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/truncate.t/ya.make b/contrib/libs/liburing/test/truncate.t/ya.make
index b347333a79..6a4e13ab41 100644
--- a/contrib/libs/liburing/test/truncate.t/ya.make
+++ b/contrib/libs/liburing/test/truncate.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/tty-write-dpoll.t/ya.make b/contrib/libs/liburing/test/tty-write-dpoll.t/ya.make
index b870c76dbd..f51141ac1e 100644
--- a/contrib/libs/liburing/test/tty-write-dpoll.t/ya.make
+++ b/contrib/libs/liburing/test/tty-write-dpoll.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/unlink.t/ya.make b/contrib/libs/liburing/test/unlink.t/ya.make
index 1e299f0c2a..8c6bf7cdc3 100644
--- a/contrib/libs/liburing/test/unlink.t/ya.make
+++ b/contrib/libs/liburing/test/unlink.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/version.t/ya.make b/contrib/libs/liburing/test/version.t/ya.make
index 53fbb57536..8f387e4ca4 100644
--- a/contrib/libs/liburing/test/version.t/ya.make
+++ b/contrib/libs/liburing/test/version.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/waitid.t/ya.make b/contrib/libs/liburing/test/waitid.t/ya.make
index cd026f76fd..d1b66baa8b 100644
--- a/contrib/libs/liburing/test/waitid.t/ya.make
+++ b/contrib/libs/liburing/test/waitid.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/wakeup-hang.t/ya.make b/contrib/libs/liburing/test/wakeup-hang.t/ya.make
index cb952544e5..32f72dadef 100644
--- a/contrib/libs/liburing/test/wakeup-hang.t/ya.make
+++ b/contrib/libs/liburing/test/wakeup-hang.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/wq-aff.t/ya.make b/contrib/libs/liburing/test/wq-aff.t/ya.make
index afe992a717..fc8c72502a 100644
--- a/contrib/libs/liburing/test/wq-aff.t/ya.make
+++ b/contrib/libs/liburing/test/wq-aff.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/test/xattr.t/ya.make b/contrib/libs/liburing/test/xattr.t/ya.make
index 75bde60951..9a4d76006a 100644
--- a/contrib/libs/liburing/test/xattr.t/ya.make
+++ b/contrib/libs/liburing/test/xattr.t/ya.make
@@ -4,7 +4,7 @@ PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(2.6)
+VERSION(2.7)
LICENSE(MIT)
diff --git a/contrib/libs/liburing/ya.make b/contrib/libs/liburing/ya.make
index 691e937324..9ee5aee27d 100644
--- a/contrib/libs/liburing/ya.make
+++ b/contrib/libs/liburing/ya.make
@@ -2,9 +2,9 @@
LIBRARY()
-VERSION(2.6)
+VERSION(2.7)
-ORIGINAL_SOURCE(https://github.com/axboe/liburing/archive/liburing-2.6.tar.gz)
+ORIGINAL_SOURCE(https://github.com/axboe/liburing/archive/liburing-2.7.tar.gz)
LICENSE(
"(GPL-2.0-only WITH Linux-syscall-note OR MIT)" AND
@@ -47,12 +47,14 @@ RECURSE(
test/a0908ae19763.t
test/a4c0b3decb33.t
test/accept-link.t
+ test/accept-non-empty.t
test/accept-reuse.t
test/accept-test.t
test/accept.t
test/across-fork.t
test/b19062a56726.t
test/b5837bd5311d.t
+ test/bind-listen.t
test/buf-ring-nommap.t
test/buf-ring-put.t
test/buf-ring.t
@@ -95,12 +97,15 @@ RECURSE(
test/files-exit-hang-timeout.t
test/fixed-buf-iter.t
test/fixed-buf-merge.t
+ test/fixed-hugepage.t
test/fixed-link.t
test/fixed-reuse.t
test/fpos.t
test/fsync.t
test/futex.t
test/hardlink.t
+ test/ignore-single-mmap.t
+ test/init-mem.t
test/io-cancel.t
test/io_uring_enter.t
test/io_uring_passthrough.t
@@ -125,6 +130,7 @@ RECURSE(
test/nolibc.t
test/nop-all-sizes.t
test/nop.t
+ test/ooo-file-unreg.t
test/open-close.t
test/open-direct-link.t
test/open-direct-pick.t
@@ -153,6 +159,7 @@ RECURSE(
test/recv-msgall-stream.t
test/recv-msgall.t
test/recv-multishot.t
+ test/recvsend_bundle.t
test/reg-fd-only.t
test/reg-hint.t
test/reg-reg-ring.t
@@ -189,6 +196,7 @@ RECURSE(
test/sq-poll-share.t
test/sq-space_left.t
test/sqpoll-disable-exit.t
+ test/sqpoll-exec.t
test/sqpoll-exit-hang.t
test/sqpoll-sleep.t
test/stdout.t