uringmachine 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/dependabot.yml +12 -0
- data/.github/workflows/test.yml +35 -0
- data/.gitignore +59 -0
- data/.gitmodules +3 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +11 -0
- data/Rakefile +39 -0
- data/TODO.md +0 -0
- data/examples/echo_server.rb +52 -0
- data/examples/event_loop.rb +69 -0
- data/examples/fibers.rb +105 -0
- data/examples/http_server.rb +56 -0
- data/examples/http_server_multishot.rb +57 -0
- data/examples/http_server_simpler.rb +34 -0
- data/ext/um/extconf.rb +71 -0
- data/ext/um/iou.h +101 -0
- data/ext/um/op_ctx.c +138 -0
- data/ext/um/ring.c +755 -0
- data/ext/um/um.c +267 -0
- data/ext/um/um.h +97 -0
- data/ext/um/um_class.c +175 -0
- data/ext/um/um_ext.c +11 -0
- data/ext/um/um_op.c +87 -0
- data/ext/um/um_utils.c +23 -0
- data/lib/uringmachine/version.rb +3 -0
- data/lib/uringmachine.rb +8 -0
- data/test/helper.rb +70 -0
- data/test/test_iou.rb +876 -0
- data/test/test_um.rb +168 -0
- data/uringmachine.gemspec +27 -0
- data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
- data/vendor/liburing/.github/pull_request_template.md +86 -0
- data/vendor/liburing/.github/workflows/build.yml +137 -0
- data/vendor/liburing/.github/workflows/codespell.yml +25 -0
- data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
- data/vendor/liburing/.gitignore +41 -0
- data/vendor/liburing/CHANGELOG +111 -0
- data/vendor/liburing/CITATION.cff +11 -0
- data/vendor/liburing/COPYING +502 -0
- data/vendor/liburing/COPYING.GPL +339 -0
- data/vendor/liburing/LICENSE +20 -0
- data/vendor/liburing/Makefile +96 -0
- data/vendor/liburing/Makefile.common +7 -0
- data/vendor/liburing/Makefile.quiet +11 -0
- data/vendor/liburing/README +106 -0
- data/vendor/liburing/SECURITY.md +6 -0
- data/vendor/liburing/configure +624 -0
- data/vendor/liburing/debian/README.Debian +7 -0
- data/vendor/liburing/debian/changelog +38 -0
- data/vendor/liburing/debian/control +39 -0
- data/vendor/liburing/debian/copyright +49 -0
- data/vendor/liburing/debian/liburing-dev.install +4 -0
- data/vendor/liburing/debian/liburing-dev.manpages +5 -0
- data/vendor/liburing/debian/liburing2.install +1 -0
- data/vendor/liburing/debian/liburing2.symbols +56 -0
- data/vendor/liburing/debian/patches/series +1 -0
- data/vendor/liburing/debian/rules +29 -0
- data/vendor/liburing/debian/source/format +1 -0
- data/vendor/liburing/debian/source/local-options +2 -0
- data/vendor/liburing/debian/source/options +1 -0
- data/vendor/liburing/debian/watch +3 -0
- data/vendor/liburing/examples/Makefile +53 -0
- data/vendor/liburing/examples/helpers.c +62 -0
- data/vendor/liburing/examples/helpers.h +7 -0
- data/vendor/liburing/examples/io_uring-close-test.c +123 -0
- data/vendor/liburing/examples/io_uring-cp.c +282 -0
- data/vendor/liburing/examples/io_uring-test.c +112 -0
- data/vendor/liburing/examples/io_uring-udp.c +403 -0
- data/vendor/liburing/examples/link-cp.c +193 -0
- data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
- data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
- data/vendor/liburing/examples/poll-bench.c +101 -0
- data/vendor/liburing/examples/proxy.c +2461 -0
- data/vendor/liburing/examples/proxy.h +102 -0
- data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
- data/vendor/liburing/examples/send-zerocopy.c +658 -0
- data/vendor/liburing/examples/ucontext-cp.c +258 -0
- data/vendor/liburing/liburing-ffi.pc.in +12 -0
- data/vendor/liburing/liburing.pc.in +12 -0
- data/vendor/liburing/liburing.spec +66 -0
- data/vendor/liburing/make-debs.sh +55 -0
- data/vendor/liburing/src/Makefile +129 -0
- data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
- data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
- data/vendor/liburing/src/arch/generic/lib.h +17 -0
- data/vendor/liburing/src/arch/generic/syscall.h +100 -0
- data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
- data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
- data/vendor/liburing/src/arch/syscall-defs.h +94 -0
- data/vendor/liburing/src/arch/x86/lib.h +11 -0
- data/vendor/liburing/src/arch/x86/syscall.h +296 -0
- data/vendor/liburing/src/ffi.c +15 -0
- data/vendor/liburing/src/include/liburing/barrier.h +81 -0
- data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
- data/vendor/liburing/src/include/liburing.h +1602 -0
- data/vendor/liburing/src/int_flags.h +11 -0
- data/vendor/liburing/src/lib.h +52 -0
- data/vendor/liburing/src/liburing-ffi.map +211 -0
- data/vendor/liburing/src/liburing.map +104 -0
- data/vendor/liburing/src/nolibc.c +55 -0
- data/vendor/liburing/src/queue.c +468 -0
- data/vendor/liburing/src/register.c +374 -0
- data/vendor/liburing/src/setup.c +689 -0
- data/vendor/liburing/src/setup.h +9 -0
- data/vendor/liburing/src/syscall.c +29 -0
- data/vendor/liburing/src/syscall.h +53 -0
- data/vendor/liburing/src/version.c +21 -0
- data/vendor/liburing/test/232c93d07b74.c +305 -0
- data/vendor/liburing/test/35fa71a030ca.c +329 -0
- data/vendor/liburing/test/500f9fbadef8.c +91 -0
- data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
- data/vendor/liburing/test/8a9973408177.c +107 -0
- data/vendor/liburing/test/917257daa0fe.c +54 -0
- data/vendor/liburing/test/Makefile +297 -0
- data/vendor/liburing/test/a0908ae19763.c +59 -0
- data/vendor/liburing/test/a4c0b3decb33.c +181 -0
- data/vendor/liburing/test/accept-link.c +255 -0
- data/vendor/liburing/test/accept-non-empty.c +256 -0
- data/vendor/liburing/test/accept-reuse.c +163 -0
- data/vendor/liburing/test/accept-test.c +83 -0
- data/vendor/liburing/test/accept.c +919 -0
- data/vendor/liburing/test/across-fork.c +284 -0
- data/vendor/liburing/test/b19062a56726.c +54 -0
- data/vendor/liburing/test/b5837bd5311d.c +78 -0
- data/vendor/liburing/test/bind-listen.c +408 -0
- data/vendor/liburing/test/buf-ring-nommap.c +123 -0
- data/vendor/liburing/test/buf-ring-put.c +83 -0
- data/vendor/liburing/test/buf-ring.c +473 -0
- data/vendor/liburing/test/ce593a6c480a.c +139 -0
- data/vendor/liburing/test/close-opath.c +123 -0
- data/vendor/liburing/test/config +14 -0
- data/vendor/liburing/test/connect-rep.c +204 -0
- data/vendor/liburing/test/connect.c +442 -0
- data/vendor/liburing/test/coredump.c +60 -0
- data/vendor/liburing/test/cq-full.c +97 -0
- data/vendor/liburing/test/cq-overflow.c +530 -0
- data/vendor/liburing/test/cq-peek-batch.c +103 -0
- data/vendor/liburing/test/cq-ready.c +95 -0
- data/vendor/liburing/test/cq-size.c +65 -0
- data/vendor/liburing/test/d4ae271dfaae.c +96 -0
- data/vendor/liburing/test/d77a67ed5f27.c +65 -0
- data/vendor/liburing/test/defer-taskrun.c +391 -0
- data/vendor/liburing/test/defer-tw-timeout.c +173 -0
- data/vendor/liburing/test/defer.c +319 -0
- data/vendor/liburing/test/double-poll-crash.c +195 -0
- data/vendor/liburing/test/drop-submit.c +94 -0
- data/vendor/liburing/test/eeed8b54e0df.c +120 -0
- data/vendor/liburing/test/empty-eownerdead.c +45 -0
- data/vendor/liburing/test/eploop.c +74 -0
- data/vendor/liburing/test/eventfd-disable.c +179 -0
- data/vendor/liburing/test/eventfd-reg.c +77 -0
- data/vendor/liburing/test/eventfd-ring.c +98 -0
- data/vendor/liburing/test/eventfd.c +113 -0
- data/vendor/liburing/test/evloop.c +73 -0
- data/vendor/liburing/test/exec-target.c +6 -0
- data/vendor/liburing/test/exit-no-cleanup.c +117 -0
- data/vendor/liburing/test/fadvise.c +202 -0
- data/vendor/liburing/test/fallocate.c +265 -0
- data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
- data/vendor/liburing/test/fd-install.c +500 -0
- data/vendor/liburing/test/fd-pass.c +237 -0
- data/vendor/liburing/test/fdinfo.c +419 -0
- data/vendor/liburing/test/file-register.c +1189 -0
- data/vendor/liburing/test/file-update.c +231 -0
- data/vendor/liburing/test/file-verify.c +654 -0
- data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
- data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
- data/vendor/liburing/test/fixed-buf-iter.c +115 -0
- data/vendor/liburing/test/fixed-buf-merge.c +101 -0
- data/vendor/liburing/test/fixed-hugepage.c +411 -0
- data/vendor/liburing/test/fixed-link.c +90 -0
- data/vendor/liburing/test/fixed-reuse.c +160 -0
- data/vendor/liburing/test/fpos.c +255 -0
- data/vendor/liburing/test/fsnotify.c +118 -0
- data/vendor/liburing/test/fsync.c +224 -0
- data/vendor/liburing/test/futex.c +571 -0
- data/vendor/liburing/test/hardlink.c +170 -0
- data/vendor/liburing/test/helpers.c +318 -0
- data/vendor/liburing/test/helpers.h +108 -0
- data/vendor/liburing/test/ignore-single-mmap.c +48 -0
- data/vendor/liburing/test/init-mem.c +164 -0
- data/vendor/liburing/test/io-cancel.c +561 -0
- data/vendor/liburing/test/io_uring_enter.c +264 -0
- data/vendor/liburing/test/io_uring_passthrough.c +482 -0
- data/vendor/liburing/test/io_uring_register.c +503 -0
- data/vendor/liburing/test/io_uring_setup.c +110 -0
- data/vendor/liburing/test/iopoll-leak.c +85 -0
- data/vendor/liburing/test/iopoll-overflow.c +118 -0
- data/vendor/liburing/test/iopoll.c +465 -0
- data/vendor/liburing/test/lfs-openat-write.c +119 -0
- data/vendor/liburing/test/lfs-openat.c +273 -0
- data/vendor/liburing/test/link-timeout.c +1108 -0
- data/vendor/liburing/test/link.c +497 -0
- data/vendor/liburing/test/link_drain.c +255 -0
- data/vendor/liburing/test/madvise.c +195 -0
- data/vendor/liburing/test/min-timeout-wait.c +354 -0
- data/vendor/liburing/test/min-timeout.c +233 -0
- data/vendor/liburing/test/mkdir.c +112 -0
- data/vendor/liburing/test/msg-ring-fd.c +331 -0
- data/vendor/liburing/test/msg-ring-flags.c +212 -0
- data/vendor/liburing/test/msg-ring-overflow.c +159 -0
- data/vendor/liburing/test/msg-ring.c +467 -0
- data/vendor/liburing/test/multicqes_drain.c +429 -0
- data/vendor/liburing/test/napi-test.c +215 -0
- data/vendor/liburing/test/napi-test.sh +48 -0
- data/vendor/liburing/test/no-mmap-inval.c +42 -0
- data/vendor/liburing/test/nolibc.c +62 -0
- data/vendor/liburing/test/nop-all-sizes.c +99 -0
- data/vendor/liburing/test/nop.c +177 -0
- data/vendor/liburing/test/nvme.h +169 -0
- data/vendor/liburing/test/ooo-file-unreg.c +82 -0
- data/vendor/liburing/test/open-close.c +261 -0
- data/vendor/liburing/test/open-direct-link.c +188 -0
- data/vendor/liburing/test/open-direct-pick.c +180 -0
- data/vendor/liburing/test/openat2.c +312 -0
- data/vendor/liburing/test/personality.c +204 -0
- data/vendor/liburing/test/pipe-bug.c +95 -0
- data/vendor/liburing/test/pipe-eof.c +83 -0
- data/vendor/liburing/test/pipe-reuse.c +105 -0
- data/vendor/liburing/test/poll-cancel-all.c +496 -0
- data/vendor/liburing/test/poll-cancel-ton.c +135 -0
- data/vendor/liburing/test/poll-cancel.c +228 -0
- data/vendor/liburing/test/poll-link.c +221 -0
- data/vendor/liburing/test/poll-many.c +230 -0
- data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
- data/vendor/liburing/test/poll-mshot-update.c +323 -0
- data/vendor/liburing/test/poll-race-mshot.c +276 -0
- data/vendor/liburing/test/poll-race.c +105 -0
- data/vendor/liburing/test/poll-ring.c +48 -0
- data/vendor/liburing/test/poll-v-poll.c +353 -0
- data/vendor/liburing/test/poll.c +327 -0
- data/vendor/liburing/test/probe.c +135 -0
- data/vendor/liburing/test/read-before-exit.c +129 -0
- data/vendor/liburing/test/read-mshot-empty.c +153 -0
- data/vendor/liburing/test/read-mshot.c +404 -0
- data/vendor/liburing/test/read-write.c +1013 -0
- data/vendor/liburing/test/recv-msgall-stream.c +398 -0
- data/vendor/liburing/test/recv-msgall.c +263 -0
- data/vendor/liburing/test/recv-multishot.c +602 -0
- data/vendor/liburing/test/recvsend_bundle.c +691 -0
- data/vendor/liburing/test/reg-fd-only.c +131 -0
- data/vendor/liburing/test/reg-hint.c +56 -0
- data/vendor/liburing/test/reg-reg-ring.c +90 -0
- data/vendor/liburing/test/regbuf-merge.c +91 -0
- data/vendor/liburing/test/register-restrictions.c +633 -0
- data/vendor/liburing/test/rename.c +132 -0
- data/vendor/liburing/test/ring-leak.c +283 -0
- data/vendor/liburing/test/ring-leak2.c +249 -0
- data/vendor/liburing/test/ringbuf-read.c +196 -0
- data/vendor/liburing/test/ringbuf-status.c +242 -0
- data/vendor/liburing/test/rsrc_tags.c +461 -0
- data/vendor/liburing/test/runtests-loop.sh +16 -0
- data/vendor/liburing/test/runtests-quiet.sh +11 -0
- data/vendor/liburing/test/runtests.sh +168 -0
- data/vendor/liburing/test/rw_merge_test.c +98 -0
- data/vendor/liburing/test/self.c +91 -0
- data/vendor/liburing/test/send-zerocopy.c +971 -0
- data/vendor/liburing/test/send_recv.c +412 -0
- data/vendor/liburing/test/send_recvmsg.c +444 -0
- data/vendor/liburing/test/shared-wq.c +84 -0
- data/vendor/liburing/test/short-read.c +75 -0
- data/vendor/liburing/test/shutdown.c +165 -0
- data/vendor/liburing/test/sigfd-deadlock.c +88 -0
- data/vendor/liburing/test/single-issuer.c +169 -0
- data/vendor/liburing/test/skip-cqe.c +428 -0
- data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
- data/vendor/liburing/test/socket-io-cmd.c +237 -0
- data/vendor/liburing/test/socket-rw-eagain.c +149 -0
- data/vendor/liburing/test/socket-rw-offset.c +149 -0
- data/vendor/liburing/test/socket-rw.c +137 -0
- data/vendor/liburing/test/socket.c +408 -0
- data/vendor/liburing/test/splice.c +512 -0
- data/vendor/liburing/test/sq-full-cpp.cc +45 -0
- data/vendor/liburing/test/sq-full.c +45 -0
- data/vendor/liburing/test/sq-poll-dup.c +211 -0
- data/vendor/liburing/test/sq-poll-kthread.c +169 -0
- data/vendor/liburing/test/sq-poll-share.c +138 -0
- data/vendor/liburing/test/sq-space_left.c +159 -0
- data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
- data/vendor/liburing/test/sqpoll-exec.c +132 -0
- data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
- data/vendor/liburing/test/sqpoll-sleep.c +69 -0
- data/vendor/liburing/test/statx.c +172 -0
- data/vendor/liburing/test/stdout.c +232 -0
- data/vendor/liburing/test/submit-and-wait.c +108 -0
- data/vendor/liburing/test/submit-link-fail.c +156 -0
- data/vendor/liburing/test/submit-reuse.c +237 -0
- data/vendor/liburing/test/symlink.c +117 -0
- data/vendor/liburing/test/sync-cancel.c +235 -0
- data/vendor/liburing/test/teardowns.c +58 -0
- data/vendor/liburing/test/test.h +36 -0
- data/vendor/liburing/test/thread-exit.c +143 -0
- data/vendor/liburing/test/timeout-new.c +256 -0
- data/vendor/liburing/test/timeout.c +1798 -0
- data/vendor/liburing/test/truncate.c +186 -0
- data/vendor/liburing/test/tty-write-dpoll.c +60 -0
- data/vendor/liburing/test/unlink.c +112 -0
- data/vendor/liburing/test/version.c +25 -0
- data/vendor/liburing/test/wait-timeout.c +287 -0
- data/vendor/liburing/test/waitid.c +373 -0
- data/vendor/liburing/test/wakeup-hang.c +162 -0
- data/vendor/liburing/test/wq-aff.c +146 -0
- data/vendor/liburing/test/xattr.c +442 -0
- metadata +412 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: test IORING_SETUP_SUBMIT_ALL
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
|
|
11
|
+
#include "liburing.h"
|
|
12
|
+
#include "helpers.h"
|
|
13
|
+
|
|
14
|
+
static int test(struct io_uring *ring, int expect_drops)
|
|
15
|
+
{
|
|
16
|
+
struct io_uring_sqe *sqe;
|
|
17
|
+
char buf[32];
|
|
18
|
+
int ret, i;
|
|
19
|
+
|
|
20
|
+
for (i = 0; i < 4; i++) {
|
|
21
|
+
sqe = io_uring_get_sqe(ring);
|
|
22
|
+
if (!sqe) {
|
|
23
|
+
fprintf(stderr, "get sqe failed\n");
|
|
24
|
+
goto err;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
io_uring_prep_nop(sqe);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* prep two invalid reads, these will fail */
|
|
31
|
+
for (i = 0; i < 2; i++) {
|
|
32
|
+
sqe = io_uring_get_sqe(ring);
|
|
33
|
+
if (!sqe) {
|
|
34
|
+
fprintf(stderr, "get sqe failed\n");
|
|
35
|
+
goto err;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
io_uring_prep_read(sqe, 128, buf, sizeof(buf), 0);
|
|
39
|
+
sqe->ioprio = (short) -1;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
ret = io_uring_submit(ring);
|
|
44
|
+
if (expect_drops) {
|
|
45
|
+
if (ret != 5) {
|
|
46
|
+
fprintf(stderr, "drops submit failed: %d\n", ret);
|
|
47
|
+
goto err;
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
if (ret != 6) {
|
|
51
|
+
fprintf(stderr, "no drops submit failed: %d\n", ret);
|
|
52
|
+
goto err;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return 0;
|
|
57
|
+
err:
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
int main(int argc, char *argv[])
|
|
62
|
+
{
|
|
63
|
+
struct io_uring ring;
|
|
64
|
+
int ret;
|
|
65
|
+
|
|
66
|
+
if (argc > 1)
|
|
67
|
+
return T_EXIT_SKIP;
|
|
68
|
+
|
|
69
|
+
ret = io_uring_queue_init(8, &ring, IORING_SETUP_SUBMIT_ALL);
|
|
70
|
+
if (ret)
|
|
71
|
+
return 0;
|
|
72
|
+
|
|
73
|
+
ret = test(&ring, 0);
|
|
74
|
+
if (ret) {
|
|
75
|
+
fprintf(stderr, "test no drops failed\n");
|
|
76
|
+
return ret;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
io_uring_queue_exit(&ring);
|
|
80
|
+
|
|
81
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
82
|
+
if (ret) {
|
|
83
|
+
fprintf(stderr, "ring setup failed\n");
|
|
84
|
+
return T_EXIT_FAIL;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
ret = test(&ring, 1);
|
|
88
|
+
if (ret) {
|
|
89
|
+
fprintf(stderr, "test drops failed\n");
|
|
90
|
+
return ret;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return T_EXIT_PASS;
|
|
94
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: -EAGAIN handling
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <string.h>
|
|
11
|
+
#include <fcntl.h>
|
|
12
|
+
|
|
13
|
+
#include "helpers.h"
|
|
14
|
+
#include "liburing.h"
|
|
15
|
+
|
|
16
|
+
#define BLOCK 4096
|
|
17
|
+
|
|
18
|
+
#ifndef RWF_NOWAIT
|
|
19
|
+
#define RWF_NOWAIT 8
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
static int get_file_fd(void)
|
|
23
|
+
{
|
|
24
|
+
ssize_t ret;
|
|
25
|
+
char *buf;
|
|
26
|
+
int fd;
|
|
27
|
+
|
|
28
|
+
fd = open("testfile", O_RDWR | O_CREAT, 0644);
|
|
29
|
+
unlink("testfile");
|
|
30
|
+
if (fd < 0) {
|
|
31
|
+
perror("open file");
|
|
32
|
+
return -1;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
buf = t_malloc(BLOCK);
|
|
36
|
+
memset(buf, 0, BLOCK);
|
|
37
|
+
ret = write(fd, buf, BLOCK);
|
|
38
|
+
if (ret != BLOCK) {
|
|
39
|
+
if (ret < 0)
|
|
40
|
+
perror("write");
|
|
41
|
+
else
|
|
42
|
+
printf("Short write\n");
|
|
43
|
+
goto err;
|
|
44
|
+
}
|
|
45
|
+
fsync(fd);
|
|
46
|
+
|
|
47
|
+
if (posix_fadvise(fd, 0, 4096, POSIX_FADV_DONTNEED)) {
|
|
48
|
+
perror("fadvise");
|
|
49
|
+
err:
|
|
50
|
+
close(fd);
|
|
51
|
+
free(buf);
|
|
52
|
+
return -1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
free(buf);
|
|
56
|
+
return fd;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
int main(int argc, char *argv[])
|
|
60
|
+
{
|
|
61
|
+
struct io_uring ring;
|
|
62
|
+
struct io_uring_sqe *sqe;
|
|
63
|
+
struct io_uring_cqe *cqe;
|
|
64
|
+
struct iovec iov;
|
|
65
|
+
int ret, fd;
|
|
66
|
+
|
|
67
|
+
if (argc > 1)
|
|
68
|
+
return T_EXIT_SKIP;
|
|
69
|
+
|
|
70
|
+
iov.iov_base = t_malloc(4096);
|
|
71
|
+
iov.iov_len = 4096;
|
|
72
|
+
|
|
73
|
+
ret = io_uring_queue_init(2, &ring, 0);
|
|
74
|
+
if (ret) {
|
|
75
|
+
printf("ring setup failed\n");
|
|
76
|
+
return T_EXIT_FAIL;
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
sqe = io_uring_get_sqe(&ring);
|
|
81
|
+
if (!sqe) {
|
|
82
|
+
printf("get sqe failed\n");
|
|
83
|
+
return T_EXIT_FAIL;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fd = get_file_fd();
|
|
87
|
+
if (fd < 0)
|
|
88
|
+
return T_EXIT_FAIL;
|
|
89
|
+
|
|
90
|
+
io_uring_prep_readv(sqe, fd, &iov, 1, 0);
|
|
91
|
+
sqe->rw_flags = RWF_NOWAIT;
|
|
92
|
+
|
|
93
|
+
ret = io_uring_submit(&ring);
|
|
94
|
+
if (ret != 1) {
|
|
95
|
+
printf("Got submit %d, expected 1\n", ret);
|
|
96
|
+
goto err;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
ret = io_uring_peek_cqe(&ring, &cqe);
|
|
100
|
+
if (ret) {
|
|
101
|
+
printf("Ring peek got %d\n", ret);
|
|
102
|
+
goto err;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
ret = T_EXIT_PASS;
|
|
106
|
+
if (cqe->res != -EAGAIN && cqe->res != 4096) {
|
|
107
|
+
if (cqe->res == -EOPNOTSUPP) {
|
|
108
|
+
ret = T_EXIT_SKIP;
|
|
109
|
+
} else {
|
|
110
|
+
printf("cqe error: %d\n", cqe->res);
|
|
111
|
+
goto err;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
close(fd);
|
|
116
|
+
return ret;
|
|
117
|
+
err:
|
|
118
|
+
close(fd);
|
|
119
|
+
return T_EXIT_FAIL;
|
|
120
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Test if entering with nothing to submit/wait for SQPOLL returns an error.
|
|
4
|
+
*/
|
|
5
|
+
#include <stdio.h>
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <string.h>
|
|
8
|
+
|
|
9
|
+
#include "liburing.h"
|
|
10
|
+
#include "helpers.h"
|
|
11
|
+
#include "../src/syscall.h"
|
|
12
|
+
|
|
13
|
+
int main(int argc, char *argv[])
|
|
14
|
+
{
|
|
15
|
+
struct io_uring_params p = {};
|
|
16
|
+
struct io_uring ring;
|
|
17
|
+
int ret;
|
|
18
|
+
|
|
19
|
+
if (argc > 1)
|
|
20
|
+
return T_EXIT_SKIP;
|
|
21
|
+
|
|
22
|
+
p.flags = IORING_SETUP_SQPOLL;
|
|
23
|
+
p.sq_thread_idle = 100;
|
|
24
|
+
|
|
25
|
+
ret = t_create_ring_params(1, &ring, &p);
|
|
26
|
+
if (ret == T_SETUP_SKIP)
|
|
27
|
+
return T_EXIT_SKIP;
|
|
28
|
+
else if (ret < 0)
|
|
29
|
+
goto err;
|
|
30
|
+
|
|
31
|
+
ret = __sys_io_uring_enter(ring.ring_fd, 0, 0, 0, NULL);
|
|
32
|
+
if (ret < 0) {
|
|
33
|
+
int __e = errno;
|
|
34
|
+
|
|
35
|
+
if (__e == EOWNERDEAD)
|
|
36
|
+
fprintf(stderr, "sqe submit unexpected failure due old kernel bug: %s\n", strerror(__e));
|
|
37
|
+
else
|
|
38
|
+
fprintf(stderr, "sqe submit unexpected failure: %s\n", strerror(__e));
|
|
39
|
+
goto err;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return T_EXIT_PASS;
|
|
43
|
+
err:
|
|
44
|
+
return T_EXIT_FAIL;
|
|
45
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Test that we don't recursively generate completion events if an io_uring
|
|
4
|
+
* fd is added to an epoll context, and the ring itself polls for events on
|
|
5
|
+
* the epollfd. Older kernels will stop on overflow, newer kernels will
|
|
6
|
+
* detect this earlier and abort correctly.
|
|
7
|
+
*/
|
|
8
|
+
#include <stdio.h>
|
|
9
|
+
#include <unistd.h>
|
|
10
|
+
#include <stdlib.h>
|
|
11
|
+
#include <sys/epoll.h>
|
|
12
|
+
#include <sys/types.h>
|
|
13
|
+
#include <poll.h>
|
|
14
|
+
#include "liburing.h"
|
|
15
|
+
#include "helpers.h"
|
|
16
|
+
|
|
17
|
+
int main(int argc, char *argv[])
|
|
18
|
+
{
|
|
19
|
+
struct io_uring ring;
|
|
20
|
+
struct io_uring_sqe *sqe;
|
|
21
|
+
struct io_uring_cqe *cqe;
|
|
22
|
+
struct epoll_event ev = { };
|
|
23
|
+
int epollfd, ret, i;
|
|
24
|
+
|
|
25
|
+
if (argc > 1)
|
|
26
|
+
return T_EXIT_SKIP;
|
|
27
|
+
|
|
28
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
29
|
+
if (ret) {
|
|
30
|
+
fprintf(stderr, "Ring init failed: %d\n", ret);
|
|
31
|
+
return T_EXIT_FAIL;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
epollfd = epoll_create1(0);
|
|
35
|
+
if (epollfd < 0) {
|
|
36
|
+
perror("epoll_create");
|
|
37
|
+
return T_EXIT_FAIL;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
ev.events = EPOLLIN;
|
|
41
|
+
ev.data.fd = ring.ring_fd;
|
|
42
|
+
ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, ring.ring_fd, &ev);
|
|
43
|
+
if (ret < 0) {
|
|
44
|
+
perror("epoll_ctl");
|
|
45
|
+
return T_EXIT_FAIL;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
sqe = io_uring_get_sqe(&ring);
|
|
49
|
+
io_uring_prep_poll_multishot(sqe, epollfd, POLLIN);
|
|
50
|
+
sqe->user_data = 1;
|
|
51
|
+
io_uring_submit(&ring);
|
|
52
|
+
|
|
53
|
+
sqe = io_uring_get_sqe(&ring);
|
|
54
|
+
sqe->user_data = 2;
|
|
55
|
+
io_uring_prep_nop(sqe);
|
|
56
|
+
io_uring_submit(&ring);
|
|
57
|
+
|
|
58
|
+
for (i = 0; i < 2; i++) {
|
|
59
|
+
ret = io_uring_wait_cqe(&ring, &cqe);
|
|
60
|
+
if (ret) {
|
|
61
|
+
fprintf(stderr, "wait_cqe ret = %d\n", ret);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
io_uring_cqe_seen(&ring, cqe);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
ret = io_uring_peek_cqe(&ring, &cqe);
|
|
68
|
+
if (!ret) {
|
|
69
|
+
fprintf(stderr, "Generated too many events\n");
|
|
70
|
+
return T_EXIT_FAIL;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return T_EXIT_PASS;
|
|
74
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: test disable/enable notifications through eventfd
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <string.h>
|
|
11
|
+
#include <fcntl.h>
|
|
12
|
+
#include <poll.h>
|
|
13
|
+
#include <sys/eventfd.h>
|
|
14
|
+
|
|
15
|
+
#include "liburing.h"
|
|
16
|
+
#include "helpers.h"
|
|
17
|
+
|
|
18
|
+
static int test(bool defer)
|
|
19
|
+
{
|
|
20
|
+
struct io_uring_params p = {};
|
|
21
|
+
struct io_uring_sqe *sqe;
|
|
22
|
+
struct io_uring_cqe *cqe;
|
|
23
|
+
struct io_uring ring;
|
|
24
|
+
uint64_t ptr;
|
|
25
|
+
struct iovec vec = {
|
|
26
|
+
.iov_base = &ptr,
|
|
27
|
+
.iov_len = sizeof(ptr)
|
|
28
|
+
};
|
|
29
|
+
int ret, evfd, i;
|
|
30
|
+
|
|
31
|
+
if (defer)
|
|
32
|
+
p.flags |= IORING_SETUP_SINGLE_ISSUER |
|
|
33
|
+
IORING_SETUP_DEFER_TASKRUN;
|
|
34
|
+
|
|
35
|
+
ret = io_uring_queue_init_params(64, &ring, &p);
|
|
36
|
+
if (ret) {
|
|
37
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
38
|
+
return T_EXIT_FAIL;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
evfd = eventfd(0, EFD_CLOEXEC);
|
|
42
|
+
if (evfd < 0) {
|
|
43
|
+
perror("eventfd");
|
|
44
|
+
return T_EXIT_FAIL;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
ret = io_uring_register_eventfd(&ring, evfd);
|
|
48
|
+
if (ret) {
|
|
49
|
+
fprintf(stderr, "failed to register evfd: %d\n", ret);
|
|
50
|
+
return T_EXIT_FAIL;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!io_uring_cq_eventfd_enabled(&ring)) {
|
|
54
|
+
fprintf(stderr, "eventfd disabled\n");
|
|
55
|
+
return T_EXIT_FAIL;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
ret = io_uring_cq_eventfd_toggle(&ring, false);
|
|
59
|
+
if (ret) {
|
|
60
|
+
fprintf(stdout, "Skipping, CQ flags not available!\n");
|
|
61
|
+
return T_EXIT_SKIP;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
sqe = io_uring_get_sqe(&ring);
|
|
65
|
+
io_uring_prep_readv(sqe, evfd, &vec, 1, 0);
|
|
66
|
+
sqe->user_data = 1;
|
|
67
|
+
|
|
68
|
+
ret = io_uring_submit(&ring);
|
|
69
|
+
if (ret != 1) {
|
|
70
|
+
fprintf(stderr, "submit: %d\n", ret);
|
|
71
|
+
return T_EXIT_FAIL;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
for (i = 0; i < 63; i++) {
|
|
75
|
+
sqe = io_uring_get_sqe(&ring);
|
|
76
|
+
io_uring_prep_nop(sqe);
|
|
77
|
+
sqe->user_data = 2;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
ret = io_uring_submit(&ring);
|
|
81
|
+
if (ret != 63) {
|
|
82
|
+
fprintf(stderr, "submit: %d\n", ret);
|
|
83
|
+
return T_EXIT_FAIL;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
for (i = 0; i < 63; i++) {
|
|
87
|
+
ret = io_uring_wait_cqe(&ring, &cqe);
|
|
88
|
+
if (ret) {
|
|
89
|
+
fprintf(stderr, "wait: %d\n", ret);
|
|
90
|
+
return T_EXIT_FAIL;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
switch (cqe->user_data) {
|
|
94
|
+
case 1: /* eventfd */
|
|
95
|
+
fprintf(stderr, "eventfd unexpected: %d\n", (int)ptr);
|
|
96
|
+
return T_EXIT_FAIL;
|
|
97
|
+
case 2:
|
|
98
|
+
if (cqe->res) {
|
|
99
|
+
fprintf(stderr, "nop: %d\n", cqe->res);
|
|
100
|
+
return T_EXIT_FAIL;
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
io_uring_cqe_seen(&ring, cqe);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
ret = io_uring_cq_eventfd_toggle(&ring, true);
|
|
108
|
+
if (ret) {
|
|
109
|
+
fprintf(stderr, "io_uring_cq_eventfd_toggle: %d\n", ret);
|
|
110
|
+
return T_EXIT_FAIL;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
sqe = io_uring_get_sqe(&ring);
|
|
114
|
+
io_uring_prep_nop(sqe);
|
|
115
|
+
sqe->user_data = 2;
|
|
116
|
+
|
|
117
|
+
ret = io_uring_submit(&ring);
|
|
118
|
+
if (ret != 1) {
|
|
119
|
+
fprintf(stderr, "submit: %d\n", ret);
|
|
120
|
+
return T_EXIT_FAIL;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
for (i = 0; i < 2; i++) {
|
|
124
|
+
ret = io_uring_wait_cqe(&ring, &cqe);
|
|
125
|
+
if (ret) {
|
|
126
|
+
fprintf(stderr, "wait: %d\n", ret);
|
|
127
|
+
return T_EXIT_FAIL;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
switch (cqe->user_data) {
|
|
131
|
+
case 1: /* eventfd */
|
|
132
|
+
if (cqe->res != sizeof(ptr)) {
|
|
133
|
+
fprintf(stderr, "read res: %d\n", cqe->res);
|
|
134
|
+
return T_EXIT_FAIL;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (ptr != 1) {
|
|
138
|
+
fprintf(stderr, "eventfd: %d\n", (int)ptr);
|
|
139
|
+
return T_EXIT_FAIL;
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
case 2:
|
|
143
|
+
if (cqe->res) {
|
|
144
|
+
fprintf(stderr, "nop: %d\n", cqe->res);
|
|
145
|
+
return T_EXIT_FAIL;
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
io_uring_cqe_seen(&ring, cqe);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
io_uring_queue_exit(&ring);
|
|
153
|
+
close(evfd);
|
|
154
|
+
return T_EXIT_PASS;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
int main(int argc, char *argv[])
|
|
158
|
+
{
|
|
159
|
+
int ret;
|
|
160
|
+
|
|
161
|
+
if (argc > 1)
|
|
162
|
+
return T_EXIT_SKIP;
|
|
163
|
+
|
|
164
|
+
ret = test(false);
|
|
165
|
+
if (ret != T_EXIT_PASS) {
|
|
166
|
+
fprintf(stderr, "%s: test(false) failed\n", argv[0]);
|
|
167
|
+
return ret;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (t_probe_defer_taskrun()) {
|
|
171
|
+
ret = test(true);
|
|
172
|
+
if (ret != T_EXIT_PASS) {
|
|
173
|
+
fprintf(stderr, "%s: test(true) failed\n", argv[0]);
|
|
174
|
+
return ret;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return ret;
|
|
179
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: test eventfd registration+unregistration
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <string.h>
|
|
11
|
+
#include <fcntl.h>
|
|
12
|
+
#include <poll.h>
|
|
13
|
+
#include <sys/eventfd.h>
|
|
14
|
+
|
|
15
|
+
#include "liburing.h"
|
|
16
|
+
#include "helpers.h"
|
|
17
|
+
|
|
18
|
+
int main(int argc, char *argv[])
|
|
19
|
+
{
|
|
20
|
+
struct io_uring_params p = {};
|
|
21
|
+
struct io_uring ring;
|
|
22
|
+
int ret, evfd[2], i;
|
|
23
|
+
|
|
24
|
+
if (argc > 1)
|
|
25
|
+
return T_EXIT_SKIP;
|
|
26
|
+
|
|
27
|
+
ret = io_uring_queue_init_params(8, &ring, &p);
|
|
28
|
+
if (ret) {
|
|
29
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
30
|
+
return T_EXIT_FAIL;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
evfd[0] = eventfd(0, EFD_CLOEXEC);
|
|
34
|
+
evfd[1] = eventfd(0, EFD_CLOEXEC);
|
|
35
|
+
if (evfd[0] < 0 || evfd[1] < 0) {
|
|
36
|
+
perror("eventfd");
|
|
37
|
+
return T_EXIT_FAIL;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
ret = io_uring_register_eventfd(&ring, evfd[0]);
|
|
41
|
+
if (ret) {
|
|
42
|
+
fprintf(stderr, "failed to register evfd: %d\n", ret);
|
|
43
|
+
return T_EXIT_FAIL;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Check that registering again will get -EBUSY */
|
|
47
|
+
ret = io_uring_register_eventfd(&ring, evfd[1]);
|
|
48
|
+
if (ret != -EBUSY) {
|
|
49
|
+
fprintf(stderr, "unexpected 2nd register: %d\n", ret);
|
|
50
|
+
return T_EXIT_FAIL;
|
|
51
|
+
}
|
|
52
|
+
close(evfd[1]);
|
|
53
|
+
|
|
54
|
+
ret = io_uring_unregister_eventfd(&ring);
|
|
55
|
+
if (ret) {
|
|
56
|
+
fprintf(stderr, "unexpected unregister: %d\n", ret);
|
|
57
|
+
return T_EXIT_FAIL;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* loop 100 registers/unregister */
|
|
61
|
+
for (i = 0; i < 100; i++) {
|
|
62
|
+
ret = io_uring_register_eventfd(&ring, evfd[0]);
|
|
63
|
+
if (ret) {
|
|
64
|
+
fprintf(stderr, "failed to register evfd: %d\n", ret);
|
|
65
|
+
return T_EXIT_FAIL;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
ret = io_uring_unregister_eventfd(&ring);
|
|
69
|
+
if (ret) {
|
|
70
|
+
fprintf(stderr, "unexpected unregister: %d\n", ret);
|
|
71
|
+
return T_EXIT_FAIL;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
close(evfd[0]);
|
|
76
|
+
return T_EXIT_PASS;
|
|
77
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: test use of eventfds with multiple rings
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <string.h>
|
|
11
|
+
#include <fcntl.h>
|
|
12
|
+
#include <poll.h>
|
|
13
|
+
#include <sys/eventfd.h>
|
|
14
|
+
|
|
15
|
+
#include "liburing.h"
|
|
16
|
+
#include "helpers.h"
|
|
17
|
+
|
|
18
|
+
int main(int argc, char *argv[])
|
|
19
|
+
{
|
|
20
|
+
struct io_uring_params p = {};
|
|
21
|
+
struct io_uring ring1, ring2;
|
|
22
|
+
struct io_uring_sqe *sqe;
|
|
23
|
+
int ret, evfd1, evfd2;
|
|
24
|
+
|
|
25
|
+
if (argc > 1)
|
|
26
|
+
return T_EXIT_SKIP;
|
|
27
|
+
|
|
28
|
+
ret = io_uring_queue_init_params(8, &ring1, &p);
|
|
29
|
+
if (ret) {
|
|
30
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
31
|
+
return T_EXIT_FAIL;
|
|
32
|
+
}
|
|
33
|
+
if (!(p.features & IORING_FEAT_CUR_PERSONALITY)) {
|
|
34
|
+
fprintf(stdout, "Skipping\n");
|
|
35
|
+
return T_EXIT_SKIP;
|
|
36
|
+
}
|
|
37
|
+
ret = io_uring_queue_init(8, &ring2, 0);
|
|
38
|
+
if (ret) {
|
|
39
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
40
|
+
return T_EXIT_FAIL;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
evfd1 = eventfd(0, EFD_CLOEXEC);
|
|
44
|
+
if (evfd1 < 0) {
|
|
45
|
+
perror("eventfd");
|
|
46
|
+
return T_EXIT_FAIL;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
evfd2 = eventfd(0, EFD_CLOEXEC);
|
|
50
|
+
if (evfd2 < 0) {
|
|
51
|
+
perror("eventfd");
|
|
52
|
+
return T_EXIT_FAIL;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
ret = io_uring_register_eventfd(&ring1, evfd1);
|
|
56
|
+
if (ret) {
|
|
57
|
+
fprintf(stderr, "failed to register evfd: %d\n", ret);
|
|
58
|
+
return T_EXIT_FAIL;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
ret = io_uring_register_eventfd(&ring2, evfd2);
|
|
62
|
+
if (ret) {
|
|
63
|
+
fprintf(stderr, "failed to register evfd: %d\n", ret);
|
|
64
|
+
return T_EXIT_FAIL;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
sqe = io_uring_get_sqe(&ring1);
|
|
68
|
+
io_uring_prep_poll_add(sqe, evfd2, POLLIN);
|
|
69
|
+
sqe->user_data = 1;
|
|
70
|
+
|
|
71
|
+
sqe = io_uring_get_sqe(&ring2);
|
|
72
|
+
io_uring_prep_poll_add(sqe, evfd1, POLLIN);
|
|
73
|
+
sqe->user_data = 1;
|
|
74
|
+
|
|
75
|
+
ret = io_uring_submit(&ring1);
|
|
76
|
+
if (ret != 1) {
|
|
77
|
+
fprintf(stderr, "submit: %d\n", ret);
|
|
78
|
+
return T_EXIT_FAIL;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
ret = io_uring_submit(&ring2);
|
|
82
|
+
if (ret != 1) {
|
|
83
|
+
fprintf(stderr, "submit: %d\n", ret);
|
|
84
|
+
return T_EXIT_FAIL;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
sqe = io_uring_get_sqe(&ring1);
|
|
88
|
+
io_uring_prep_nop(sqe);
|
|
89
|
+
sqe->user_data = 3;
|
|
90
|
+
|
|
91
|
+
ret = io_uring_submit(&ring1);
|
|
92
|
+
if (ret != 1) {
|
|
93
|
+
fprintf(stderr, "submit: %d\n", ret);
|
|
94
|
+
return T_EXIT_FAIL;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return T_EXIT_PASS;
|
|
98
|
+
}
|