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,186 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: run various truncate tests
|
|
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 <sys/stat.h>
|
|
13
|
+
#include <sys/ioctl.h>
|
|
14
|
+
|
|
15
|
+
#include "liburing.h"
|
|
16
|
+
#include "helpers.h"
|
|
17
|
+
|
|
18
|
+
#define TWO_GIG_SIZE ((loff_t)2 * 1024 * 1024 * 1024)
|
|
19
|
+
#define ONE_GIG_SIZE ((loff_t)1024 * 1024 * 1024)
|
|
20
|
+
#define HALF_GIG_SIZE ((loff_t)512 * 1024 * 1024)
|
|
21
|
+
|
|
22
|
+
static int test_truncate(struct io_uring *ring, int fd)
|
|
23
|
+
{
|
|
24
|
+
struct io_uring_cqe *cqe;
|
|
25
|
+
struct io_uring_sqe *sqe;
|
|
26
|
+
int ret = -1;
|
|
27
|
+
|
|
28
|
+
sqe = io_uring_get_sqe(ring);
|
|
29
|
+
if (!sqe) {
|
|
30
|
+
fprintf(stderr, "get sqe failed\n");
|
|
31
|
+
return T_EXIT_FAIL;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
memset(sqe, 0, sizeof(*sqe));
|
|
35
|
+
|
|
36
|
+
io_uring_prep_rw(IORING_OP_FTRUNCATE, sqe, fd, "fail", 0, 4);
|
|
37
|
+
|
|
38
|
+
ret = io_uring_submit(ring);
|
|
39
|
+
if (ret <= 0) {
|
|
40
|
+
fprintf(stderr, "sqe submit failed: %d\n", ret);
|
|
41
|
+
return T_EXIT_FAIL;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
45
|
+
if (ret < 0) {
|
|
46
|
+
fprintf(stderr, "wait completion %d\n", ret);
|
|
47
|
+
return T_EXIT_FAIL;
|
|
48
|
+
}
|
|
49
|
+
ret = cqe->res;
|
|
50
|
+
io_uring_cqe_seen(ring, cqe);
|
|
51
|
+
if (ret == -EINVAL)
|
|
52
|
+
return T_EXIT_PASS;
|
|
53
|
+
|
|
54
|
+
fprintf(stderr, "unexpected truncate res %d\n", ret);
|
|
55
|
+
return T_EXIT_FAIL;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static int test_ftruncate(struct io_uring *ring, int fd, loff_t len)
|
|
59
|
+
{
|
|
60
|
+
struct io_uring_cqe *cqe;
|
|
61
|
+
struct io_uring_sqe *sqe;
|
|
62
|
+
int ret;
|
|
63
|
+
|
|
64
|
+
sqe = io_uring_get_sqe(ring);
|
|
65
|
+
if (!sqe) {
|
|
66
|
+
fprintf(stderr, "get sqe failed\n");
|
|
67
|
+
goto err;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
memset(sqe, 0, sizeof(*sqe));
|
|
71
|
+
|
|
72
|
+
io_uring_prep_ftruncate(sqe, fd, len);
|
|
73
|
+
|
|
74
|
+
ret = io_uring_submit(ring);
|
|
75
|
+
if (ret <= 0) {
|
|
76
|
+
fprintf(stderr, "sqe submit failed: %d\n", ret);
|
|
77
|
+
goto err;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
81
|
+
if (ret < 0) {
|
|
82
|
+
fprintf(stderr, "wait completion %d\n", ret);
|
|
83
|
+
goto err;
|
|
84
|
+
}
|
|
85
|
+
ret = cqe->res;
|
|
86
|
+
io_uring_cqe_seen(ring, cqe);
|
|
87
|
+
return ret;
|
|
88
|
+
err:
|
|
89
|
+
return 1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static int get_file_size(int fd, loff_t *size)
|
|
93
|
+
{
|
|
94
|
+
struct stat st;
|
|
95
|
+
|
|
96
|
+
if (fstat(fd, &st) < 0) {
|
|
97
|
+
perror("fstat");
|
|
98
|
+
return -1;
|
|
99
|
+
}
|
|
100
|
+
if (S_ISREG(st.st_mode)) {
|
|
101
|
+
*size = st.st_size;
|
|
102
|
+
return 0;
|
|
103
|
+
} else if (S_ISBLK(st.st_mode)) {
|
|
104
|
+
unsigned long long bytes;
|
|
105
|
+
|
|
106
|
+
if (ioctl(fd, BLKGETSIZE64, &bytes) != 0) {
|
|
107
|
+
perror("ioctl");
|
|
108
|
+
return -1;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
*size = bytes;
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return -1;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
int main(int argc, char *argv[])
|
|
119
|
+
{
|
|
120
|
+
struct io_uring ring;
|
|
121
|
+
char path[32] = ".truncate.XXXXXX";
|
|
122
|
+
int ret;
|
|
123
|
+
int fd;
|
|
124
|
+
int i;
|
|
125
|
+
loff_t size;
|
|
126
|
+
loff_t test_sizes[3];
|
|
127
|
+
|
|
128
|
+
if (argc > 1)
|
|
129
|
+
return T_EXIT_SKIP;
|
|
130
|
+
|
|
131
|
+
ret = io_uring_queue_init(1, &ring, 0);
|
|
132
|
+
if (ret) {
|
|
133
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
134
|
+
return T_EXIT_FAIL;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fd = mkostemp(path, O_WRONLY | O_CREAT | O_TRUNC);
|
|
138
|
+
if (fd < 0) {
|
|
139
|
+
perror("mkostemp");
|
|
140
|
+
return T_EXIT_FAIL;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
test_sizes[0] = TWO_GIG_SIZE;
|
|
144
|
+
test_sizes[1] = ONE_GIG_SIZE;
|
|
145
|
+
test_sizes[2] = HALF_GIG_SIZE;
|
|
146
|
+
|
|
147
|
+
for (i = 0; i < 3; i++) {
|
|
148
|
+
ret = test_ftruncate(&ring, fd, test_sizes[i]);
|
|
149
|
+
if (ret < 0) {
|
|
150
|
+
if (ret == -EBADF || ret == -EINVAL) {
|
|
151
|
+
if (i == 0) {
|
|
152
|
+
fprintf(stdout, "Ftruncate not supported, skipping\n");
|
|
153
|
+
ret = T_EXIT_SKIP;
|
|
154
|
+
goto out;
|
|
155
|
+
}
|
|
156
|
+
goto err;
|
|
157
|
+
}
|
|
158
|
+
fprintf(stderr, "ftruncate: %s\n", strerror(-ret));
|
|
159
|
+
goto err;
|
|
160
|
+
} else if (ret) {
|
|
161
|
+
fprintf(stderr, "unexpected cqe->res %d\n", ret);
|
|
162
|
+
goto err;
|
|
163
|
+
}
|
|
164
|
+
if (get_file_size(fd, &size))
|
|
165
|
+
goto err;
|
|
166
|
+
if (size != test_sizes[i]) {
|
|
167
|
+
fprintf(stderr, "fail %d size=%llu, %llu\n", i,
|
|
168
|
+
(unsigned long long) size,
|
|
169
|
+
(unsigned long long) test_sizes[i]);
|
|
170
|
+
goto err;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
ret = test_truncate(&ring, fd);
|
|
175
|
+
if (ret != T_EXIT_PASS)
|
|
176
|
+
goto err;
|
|
177
|
+
|
|
178
|
+
out:
|
|
179
|
+
unlink(path);
|
|
180
|
+
close(fd);
|
|
181
|
+
return T_EXIT_PASS;
|
|
182
|
+
err:
|
|
183
|
+
unlink(path);
|
|
184
|
+
close(fd);
|
|
185
|
+
return T_EXIT_FAIL;
|
|
186
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Test double poll tty write. A test case for the regression fixed by:
|
|
4
|
+
*
|
|
5
|
+
* commit 6e295a664efd083ac9a5c1a8130c45be1db0cde7
|
|
6
|
+
* Author: Jens Axboe <axboe@kernel.dk>
|
|
7
|
+
* Date: Tue Mar 22 13:11:28 2022 -0600
|
|
8
|
+
*
|
|
9
|
+
* io_uring: fix assuming triggered poll waitqueue is the single poll
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
#include <errno.h>
|
|
13
|
+
#include <stdio.h>
|
|
14
|
+
#include <string.h>
|
|
15
|
+
#include <unistd.h>
|
|
16
|
+
#include <fcntl.h>
|
|
17
|
+
|
|
18
|
+
#include "liburing.h"
|
|
19
|
+
#include "helpers.h"
|
|
20
|
+
|
|
21
|
+
#define SQES 128
|
|
22
|
+
#define BUFSIZE 512
|
|
23
|
+
|
|
24
|
+
int main(int argc, char *argv[])
|
|
25
|
+
{
|
|
26
|
+
static char buf[BUFSIZE];
|
|
27
|
+
struct iovec vecs[SQES];
|
|
28
|
+
struct io_uring ring;
|
|
29
|
+
int ret, i, fd;
|
|
30
|
+
|
|
31
|
+
if (argc > 1)
|
|
32
|
+
return 0;
|
|
33
|
+
|
|
34
|
+
fd = open("/dev/ttyS0", O_RDWR | O_NONBLOCK);
|
|
35
|
+
if (fd < 0)
|
|
36
|
+
return 0;
|
|
37
|
+
|
|
38
|
+
ret = t_create_ring(SQES, &ring, 0);
|
|
39
|
+
if (ret == T_SETUP_SKIP)
|
|
40
|
+
return 0;
|
|
41
|
+
else if (ret < 0)
|
|
42
|
+
return 1;
|
|
43
|
+
|
|
44
|
+
for (i = 0; i < SQES; i++) {
|
|
45
|
+
struct io_uring_sqe *sqe;
|
|
46
|
+
|
|
47
|
+
sqe = io_uring_get_sqe(&ring);
|
|
48
|
+
vecs[i].iov_base = buf;
|
|
49
|
+
vecs[i].iov_len = sizeof(buf);
|
|
50
|
+
io_uring_prep_writev(sqe, fd, &vecs[i], 1, 0);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
ret = io_uring_submit(&ring);
|
|
54
|
+
if (ret != SQES) {
|
|
55
|
+
fprintf(stderr, "submit: %d\n", ret);
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: run various unlink tests
|
|
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 <sys/stat.h>
|
|
13
|
+
|
|
14
|
+
#include "liburing.h"
|
|
15
|
+
|
|
16
|
+
static int test_unlink(struct io_uring *ring, const char *old)
|
|
17
|
+
{
|
|
18
|
+
struct io_uring_cqe *cqe;
|
|
19
|
+
struct io_uring_sqe *sqe;
|
|
20
|
+
int ret;
|
|
21
|
+
|
|
22
|
+
sqe = io_uring_get_sqe(ring);
|
|
23
|
+
if (!sqe) {
|
|
24
|
+
fprintf(stderr, "get sqe failed\n");
|
|
25
|
+
goto err;
|
|
26
|
+
}
|
|
27
|
+
io_uring_prep_unlink(sqe, old, 0);
|
|
28
|
+
|
|
29
|
+
ret = io_uring_submit(ring);
|
|
30
|
+
if (ret <= 0) {
|
|
31
|
+
fprintf(stderr, "sqe submit failed: %d\n", ret);
|
|
32
|
+
goto err;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
36
|
+
if (ret < 0) {
|
|
37
|
+
fprintf(stderr, "wait completion %d\n", ret);
|
|
38
|
+
goto err;
|
|
39
|
+
}
|
|
40
|
+
ret = cqe->res;
|
|
41
|
+
io_uring_cqe_seen(ring, cqe);
|
|
42
|
+
return ret;
|
|
43
|
+
err:
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
static int stat_file(const char *buf)
|
|
48
|
+
{
|
|
49
|
+
struct stat sb;
|
|
50
|
+
|
|
51
|
+
if (!stat(buf, &sb))
|
|
52
|
+
return 0;
|
|
53
|
+
|
|
54
|
+
return errno;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
int main(int argc, char *argv[])
|
|
58
|
+
{
|
|
59
|
+
struct io_uring ring;
|
|
60
|
+
char buf[32] = "./XXXXXX";
|
|
61
|
+
int ret;
|
|
62
|
+
|
|
63
|
+
if (argc > 1)
|
|
64
|
+
return 0;
|
|
65
|
+
|
|
66
|
+
ret = io_uring_queue_init(1, &ring, 0);
|
|
67
|
+
if (ret) {
|
|
68
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
ret = mkstemp(buf);
|
|
73
|
+
if (ret < 0) {
|
|
74
|
+
perror("mkstemp");
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
close(ret);
|
|
78
|
+
|
|
79
|
+
if (stat_file(buf) != 0) {
|
|
80
|
+
perror("stat");
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
ret = test_unlink(&ring, buf);
|
|
85
|
+
if (ret < 0) {
|
|
86
|
+
if (ret == -EBADF || ret == -EINVAL) {
|
|
87
|
+
fprintf(stdout, "Unlink not supported, skipping\n");
|
|
88
|
+
unlink(buf);
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
fprintf(stderr, "rename: %s\n", strerror(-ret));
|
|
92
|
+
goto err;
|
|
93
|
+
} else if (ret)
|
|
94
|
+
goto err;
|
|
95
|
+
|
|
96
|
+
ret = stat_file(buf);
|
|
97
|
+
if (ret != ENOENT) {
|
|
98
|
+
fprintf(stderr, "stat got %s\n", strerror(ret));
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
ret = test_unlink(&ring, "/3/2/3/1/z/y");
|
|
103
|
+
if (ret != -ENOENT) {
|
|
104
|
+
fprintf(stderr, "invalid unlink got %s\n", strerror(-ret));
|
|
105
|
+
return 1;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return 0;
|
|
109
|
+
err:
|
|
110
|
+
unlink(buf);
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: check version macros and runtime checks work
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
#include "liburing.h"
|
|
7
|
+
#include "helpers.h"
|
|
8
|
+
|
|
9
|
+
int main(int argc, char *argv[])
|
|
10
|
+
{
|
|
11
|
+
if (IO_URING_CHECK_VERSION(io_uring_major_version(), io_uring_minor_version()))
|
|
12
|
+
return T_EXIT_FAIL;
|
|
13
|
+
|
|
14
|
+
if (io_uring_major_version() != IO_URING_VERSION_MAJOR)
|
|
15
|
+
return T_EXIT_FAIL;
|
|
16
|
+
|
|
17
|
+
if (io_uring_minor_version() != IO_URING_VERSION_MINOR)
|
|
18
|
+
return T_EXIT_FAIL;
|
|
19
|
+
|
|
20
|
+
#if IO_URING_CHECK_VERSION(IO_URING_VERSION_MAJOR, IO_URING_VERSION_MINOR)
|
|
21
|
+
return T_EXIT_FAIL;
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
return T_EXIT_PASS;
|
|
25
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: run various timeout tests
|
|
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 <sys/time.h>
|
|
13
|
+
#include <sys/wait.h>
|
|
14
|
+
#include <sys/types.h>
|
|
15
|
+
#include <sys/stat.h>
|
|
16
|
+
#include <assert.h>
|
|
17
|
+
|
|
18
|
+
#include "helpers.h"
|
|
19
|
+
#include "liburing.h"
|
|
20
|
+
#include "../src/syscall.h"
|
|
21
|
+
|
|
22
|
+
#define IO_NSEC_PER_SEC 1000000000ULL
|
|
23
|
+
|
|
24
|
+
static bool support_abs = false;
|
|
25
|
+
static bool support_clock = false;
|
|
26
|
+
|
|
27
|
+
static unsigned long long timespec_to_ns(struct timespec *ts)
|
|
28
|
+
{
|
|
29
|
+
return ts->tv_nsec + ts->tv_sec * IO_NSEC_PER_SEC;
|
|
30
|
+
}
|
|
31
|
+
static struct timespec ns_to_timespec(unsigned long long t)
|
|
32
|
+
{
|
|
33
|
+
struct timespec ts;
|
|
34
|
+
|
|
35
|
+
ts.tv_sec = t / IO_NSEC_PER_SEC;
|
|
36
|
+
ts.tv_nsec = t - ts.tv_sec * IO_NSEC_PER_SEC;
|
|
37
|
+
return ts;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static long long ns_since(struct timespec *ts)
|
|
41
|
+
{
|
|
42
|
+
struct timespec now;
|
|
43
|
+
int ret;
|
|
44
|
+
|
|
45
|
+
ret = clock_gettime(CLOCK_MONOTONIC, &now);
|
|
46
|
+
if (ret) {
|
|
47
|
+
fprintf(stderr, "clock_gettime failed\n");
|
|
48
|
+
exit(T_EXIT_FAIL);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return timespec_to_ns(&now) - timespec_to_ns(ts);
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static int t_io_uring_wait(struct io_uring *ring, int nr, unsigned enter_flags,
|
|
56
|
+
struct timespec *ts)
|
|
57
|
+
{
|
|
58
|
+
struct __kernel_timespec kts = {
|
|
59
|
+
.tv_sec = ts->tv_sec,
|
|
60
|
+
.tv_nsec = ts->tv_nsec
|
|
61
|
+
};
|
|
62
|
+
struct io_uring_getevents_arg arg = {
|
|
63
|
+
.sigmask = 0,
|
|
64
|
+
.sigmask_sz = _NSIG / 8,
|
|
65
|
+
.ts = (unsigned long) &kts
|
|
66
|
+
};
|
|
67
|
+
int ret;
|
|
68
|
+
|
|
69
|
+
enter_flags |= IORING_ENTER_GETEVENTS | IORING_ENTER_EXT_ARG;
|
|
70
|
+
ret = io_uring_enter2(ring->ring_fd, 0, nr, enter_flags,
|
|
71
|
+
(void *)&arg, sizeof(arg));
|
|
72
|
+
return ret;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static int probe_timers(void)
|
|
76
|
+
{
|
|
77
|
+
struct io_uring_clock_register cr = { .clockid = CLOCK_MONOTONIC, };
|
|
78
|
+
struct io_uring ring;
|
|
79
|
+
struct timespec ts;
|
|
80
|
+
int ret;
|
|
81
|
+
|
|
82
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
83
|
+
if (ret) {
|
|
84
|
+
fprintf(stderr, "probe ring setup failed: %d\n", ret);
|
|
85
|
+
return ret;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
ret = clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
89
|
+
if (ret) {
|
|
90
|
+
fprintf(stderr, "clock_gettime failed\n");
|
|
91
|
+
return ret;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
ret = t_io_uring_wait(&ring, 0, IORING_ENTER_ABS_TIMER, &ts);
|
|
95
|
+
if (!ret) {
|
|
96
|
+
support_abs = true;
|
|
97
|
+
} else if (ret != -EINVAL) {
|
|
98
|
+
fprintf(stderr, "wait failed %i\n", ret);
|
|
99
|
+
return ret;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
ret = io_uring_register_clock(&ring, &cr);
|
|
103
|
+
if (!ret) {
|
|
104
|
+
support_clock = true;
|
|
105
|
+
} else if (ret != -EINVAL) {
|
|
106
|
+
fprintf(stderr, "io_uring_register_clock %i\n", ret);
|
|
107
|
+
return ret;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
io_uring_queue_exit(&ring);
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static int test_timeout(bool abs, bool set_clock)
|
|
115
|
+
{
|
|
116
|
+
unsigned enter_flags = abs ? IORING_ENTER_ABS_TIMER : 0;
|
|
117
|
+
struct io_uring ring;
|
|
118
|
+
struct timespec start, end, ts;
|
|
119
|
+
long long dt;
|
|
120
|
+
int ret;
|
|
121
|
+
|
|
122
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
123
|
+
if (ret) {
|
|
124
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (set_clock) {
|
|
129
|
+
struct io_uring_clock_register cr = {};
|
|
130
|
+
|
|
131
|
+
cr.clockid = CLOCK_BOOTTIME;
|
|
132
|
+
ret = io_uring_register_clock(&ring, &cr);
|
|
133
|
+
if (ret) {
|
|
134
|
+
fprintf(stderr, "io_uring_register_clock failed\n");
|
|
135
|
+
return 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* pass current time */
|
|
140
|
+
ret = clock_gettime(CLOCK_MONOTONIC, &start);
|
|
141
|
+
assert(ret == 0);
|
|
142
|
+
|
|
143
|
+
ts = abs ? start : ns_to_timespec(0);
|
|
144
|
+
ret = t_io_uring_wait(&ring, 1, enter_flags, &ts);
|
|
145
|
+
if (ret != -ETIME) {
|
|
146
|
+
fprintf(stderr, "wait current time failed, %i\n", ret);
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (ns_since(&start) >= IO_NSEC_PER_SEC) {
|
|
151
|
+
fprintf(stderr, "current time test failed\n");
|
|
152
|
+
return 1;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (abs) {
|
|
156
|
+
/* expired time */
|
|
157
|
+
ret = clock_gettime(CLOCK_MONOTONIC, &start);
|
|
158
|
+
assert(ret == 0);
|
|
159
|
+
ts = ns_to_timespec(timespec_to_ns(&start) - IO_NSEC_PER_SEC);
|
|
160
|
+
|
|
161
|
+
ret = t_io_uring_wait(&ring, 1, enter_flags, &ts);
|
|
162
|
+
if (ret != -ETIME) {
|
|
163
|
+
fprintf(stderr, "expired timeout wait failed, %i\n", ret);
|
|
164
|
+
return 1;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
ret = clock_gettime(CLOCK_MONOTONIC, &end);
|
|
168
|
+
assert(ret == 0);
|
|
169
|
+
|
|
170
|
+
if (ns_since(&start) >= IO_NSEC_PER_SEC) {
|
|
171
|
+
fprintf(stderr, "expired timer test failed\n");
|
|
172
|
+
return 1;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* 1s wait */
|
|
177
|
+
ret = clock_gettime(CLOCK_MONOTONIC, &start);
|
|
178
|
+
assert(ret == 0);
|
|
179
|
+
|
|
180
|
+
dt = 2 * IO_NSEC_PER_SEC + (abs ? timespec_to_ns(&start) : 0);
|
|
181
|
+
ts = ns_to_timespec(dt);
|
|
182
|
+
ret = t_io_uring_wait(&ring, 1, enter_flags, &ts);
|
|
183
|
+
if (ret != -ETIME) {
|
|
184
|
+
fprintf(stderr, "wait timeout failed, %i\n", ret);
|
|
185
|
+
return 1;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
dt = ns_since(&start);
|
|
189
|
+
if (dt < IO_NSEC_PER_SEC || dt > 3 * IO_NSEC_PER_SEC) {
|
|
190
|
+
fprintf(stderr, "early wake up, %lld\n", dt);
|
|
191
|
+
return 1;
|
|
192
|
+
}
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
static int test_clock_setup(void)
|
|
197
|
+
{
|
|
198
|
+
struct io_uring ring;
|
|
199
|
+
struct io_uring_clock_register cr = {};
|
|
200
|
+
int ret;
|
|
201
|
+
|
|
202
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
203
|
+
if (ret) {
|
|
204
|
+
fprintf(stderr, "ring setup failed: %d\n", ret);
|
|
205
|
+
return T_EXIT_FAIL;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
ret = __sys_io_uring_register(ring.ring_fd, IORING_REGISTER_CLOCK, NULL, 0);
|
|
209
|
+
if (!ret) {
|
|
210
|
+
fprintf(stderr, "invalid null clock registration %i\n", ret);
|
|
211
|
+
return T_EXIT_FAIL;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
cr.clockid = -1;
|
|
215
|
+
ret = __sys_io_uring_register(ring.ring_fd, IORING_REGISTER_CLOCK, &cr, 0);
|
|
216
|
+
if (ret != -EINVAL) {
|
|
217
|
+
fprintf(stderr, "invalid clockid registration %i\n", ret);
|
|
218
|
+
return T_EXIT_FAIL;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
cr.clockid = CLOCK_MONOTONIC;
|
|
222
|
+
ret = __sys_io_uring_register(ring.ring_fd, IORING_REGISTER_CLOCK, &cr, 0);
|
|
223
|
+
if (ret) {
|
|
224
|
+
fprintf(stderr, "clock monotonic registration failed %i\n", ret);
|
|
225
|
+
return T_EXIT_FAIL;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
cr.clockid = CLOCK_BOOTTIME;
|
|
229
|
+
ret = __sys_io_uring_register(ring.ring_fd, IORING_REGISTER_CLOCK, &cr, 0);
|
|
230
|
+
if (ret) {
|
|
231
|
+
fprintf(stderr, "clock boottime registration failed %i\n", ret);
|
|
232
|
+
return T_EXIT_FAIL;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
cr.clockid = CLOCK_MONOTONIC;
|
|
236
|
+
ret = __sys_io_uring_register(ring.ring_fd, IORING_REGISTER_CLOCK, &cr, 0);
|
|
237
|
+
if (ret) {
|
|
238
|
+
fprintf(stderr, "2nd clock monotonic registration failed %i\n", ret);
|
|
239
|
+
return T_EXIT_FAIL;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
io_uring_queue_exit(&ring);
|
|
243
|
+
return 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
int main(int argc, char *argv[])
|
|
247
|
+
{
|
|
248
|
+
int ret, i;
|
|
249
|
+
|
|
250
|
+
if (argc > 1)
|
|
251
|
+
return 0;
|
|
252
|
+
|
|
253
|
+
ret = probe_timers();
|
|
254
|
+
if (ret) {
|
|
255
|
+
fprintf(stderr, "probe failed\n");
|
|
256
|
+
return T_EXIT_FAIL;
|
|
257
|
+
}
|
|
258
|
+
if (!support_abs && !support_clock)
|
|
259
|
+
return T_EXIT_SKIP;
|
|
260
|
+
|
|
261
|
+
if (support_clock) {
|
|
262
|
+
ret = test_clock_setup();
|
|
263
|
+
if (ret) {
|
|
264
|
+
fprintf(stderr, "test_clock_setup failed\n");
|
|
265
|
+
return T_EXIT_FAIL;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
for (i = 0; i < 4; i++) {
|
|
270
|
+
bool abs = i & 1;
|
|
271
|
+
bool clock = i & 2;
|
|
272
|
+
|
|
273
|
+
if (abs && !support_abs)
|
|
274
|
+
continue;
|
|
275
|
+
if (clock && !support_clock)
|
|
276
|
+
continue;
|
|
277
|
+
|
|
278
|
+
ret = test_timeout(abs, clock);
|
|
279
|
+
if (ret) {
|
|
280
|
+
fprintf(stderr, "test_timeout failed %i %i\n",
|
|
281
|
+
abs, clock);
|
|
282
|
+
return ret;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return 0;
|
|
287
|
+
}
|