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,373 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: test waitid functionality
|
|
4
|
+
*/
|
|
5
|
+
#include <stdio.h>
|
|
6
|
+
#include <stdlib.h>
|
|
7
|
+
#include <unistd.h>
|
|
8
|
+
#include <string.h>
|
|
9
|
+
|
|
10
|
+
#include "liburing.h"
|
|
11
|
+
#include "helpers.h"
|
|
12
|
+
|
|
13
|
+
static bool no_waitid;
|
|
14
|
+
|
|
15
|
+
static void child(long usleep_time)
|
|
16
|
+
{
|
|
17
|
+
if (usleep_time)
|
|
18
|
+
usleep(usleep_time);
|
|
19
|
+
exit(0);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* Test linked timeout with child not exiting in time
|
|
24
|
+
*/
|
|
25
|
+
static int test_noexit(struct io_uring *ring)
|
|
26
|
+
{
|
|
27
|
+
struct io_uring_sqe *sqe;
|
|
28
|
+
struct io_uring_cqe *cqe;
|
|
29
|
+
struct __kernel_timespec ts;
|
|
30
|
+
siginfo_t si;
|
|
31
|
+
pid_t pid;
|
|
32
|
+
int ret, i;
|
|
33
|
+
|
|
34
|
+
pid = fork();
|
|
35
|
+
if (!pid) {
|
|
36
|
+
child(200000);
|
|
37
|
+
exit(0);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
sqe = io_uring_get_sqe(ring);
|
|
41
|
+
io_uring_prep_waitid(sqe, P_PID, pid, &si, WEXITED, 0);
|
|
42
|
+
sqe->flags |= IOSQE_IO_LINK;
|
|
43
|
+
sqe->user_data = 1;
|
|
44
|
+
|
|
45
|
+
ts.tv_sec = 0;
|
|
46
|
+
ts.tv_nsec = 100 * 1000 * 1000ULL;
|
|
47
|
+
sqe = io_uring_get_sqe(ring);
|
|
48
|
+
io_uring_prep_link_timeout(sqe, &ts, 0);
|
|
49
|
+
sqe->user_data = 2;
|
|
50
|
+
|
|
51
|
+
io_uring_submit(ring);
|
|
52
|
+
|
|
53
|
+
for (i = 0; i < 2; i++) {
|
|
54
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
55
|
+
if (ret) {
|
|
56
|
+
fprintf(stderr, "cqe wait: %d\n", ret);
|
|
57
|
+
return T_EXIT_FAIL;
|
|
58
|
+
}
|
|
59
|
+
if (cqe->user_data == 2 && cqe->res != 1) {
|
|
60
|
+
fprintf(stderr, "timeout res: %d\n", cqe->res);
|
|
61
|
+
return T_EXIT_FAIL;
|
|
62
|
+
}
|
|
63
|
+
if (cqe->user_data == 1 && cqe->res != -ECANCELED) {
|
|
64
|
+
fprintf(stderr, "waitid res: %d\n", cqe->res);
|
|
65
|
+
return T_EXIT_FAIL;
|
|
66
|
+
}
|
|
67
|
+
io_uring_cqe_seen(ring, cqe);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return T_EXIT_PASS;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* Test one child exiting, but not the one we were looking for
|
|
75
|
+
*/
|
|
76
|
+
static int test_double(struct io_uring *ring)
|
|
77
|
+
{
|
|
78
|
+
struct io_uring_sqe *sqe;
|
|
79
|
+
struct io_uring_cqe *cqe;
|
|
80
|
+
siginfo_t si;
|
|
81
|
+
pid_t p1, p2;
|
|
82
|
+
int ret;
|
|
83
|
+
|
|
84
|
+
/* p1 will exit shortly */
|
|
85
|
+
p1 = fork();
|
|
86
|
+
if (!p1) {
|
|
87
|
+
child(100000);
|
|
88
|
+
exit(0);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* p2 will linger */
|
|
92
|
+
p2 = fork();
|
|
93
|
+
if (!p2) {
|
|
94
|
+
child(200000);
|
|
95
|
+
exit(0);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
sqe = io_uring_get_sqe(ring);
|
|
99
|
+
io_uring_prep_waitid(sqe, P_PID, p2, &si, WEXITED, 0);
|
|
100
|
+
|
|
101
|
+
io_uring_submit(ring);
|
|
102
|
+
|
|
103
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
104
|
+
if (ret) {
|
|
105
|
+
fprintf(stderr, "cqe wait: %d\n", ret);
|
|
106
|
+
return T_EXIT_FAIL;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (cqe->res < 0) {
|
|
110
|
+
fprintf(stderr, "cqe res: %d\n", cqe->res);
|
|
111
|
+
return T_EXIT_FAIL;
|
|
112
|
+
}
|
|
113
|
+
if (si.si_pid != p2) {
|
|
114
|
+
fprintf(stderr, "expected pid %d, got %d\n", p2, si.si_pid);
|
|
115
|
+
return T_EXIT_FAIL;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
io_uring_cqe_seen(ring, cqe);
|
|
119
|
+
return T_EXIT_PASS;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* Test reaping of an already exited task
|
|
124
|
+
*/
|
|
125
|
+
static int test_ready(struct io_uring *ring)
|
|
126
|
+
{
|
|
127
|
+
struct io_uring_sqe *sqe;
|
|
128
|
+
struct io_uring_cqe *cqe;
|
|
129
|
+
siginfo_t si;
|
|
130
|
+
pid_t pid;
|
|
131
|
+
int ret;
|
|
132
|
+
|
|
133
|
+
pid = fork();
|
|
134
|
+
if (!pid) {
|
|
135
|
+
child(0);
|
|
136
|
+
exit(0);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
sqe = io_uring_get_sqe(ring);
|
|
140
|
+
io_uring_prep_waitid(sqe, P_PID, pid, &si, WEXITED, 0);
|
|
141
|
+
|
|
142
|
+
io_uring_submit(ring);
|
|
143
|
+
|
|
144
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
145
|
+
if (ret) {
|
|
146
|
+
fprintf(stderr, "cqe wait: %d\n", ret);
|
|
147
|
+
return T_EXIT_FAIL;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (cqe->res < 0) {
|
|
151
|
+
fprintf(stderr, "cqe res: %d\n", cqe->res);
|
|
152
|
+
return T_EXIT_FAIL;
|
|
153
|
+
}
|
|
154
|
+
if (si.si_pid != pid) {
|
|
155
|
+
fprintf(stderr, "expected pid %d, got %d\n", pid, si.si_pid);
|
|
156
|
+
return T_EXIT_FAIL;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
io_uring_cqe_seen(ring, cqe);
|
|
160
|
+
return T_EXIT_PASS;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* Test cancelation of pending waitid
|
|
165
|
+
*/
|
|
166
|
+
static int test_cancel(struct io_uring *ring)
|
|
167
|
+
{
|
|
168
|
+
struct io_uring_sqe *sqe;
|
|
169
|
+
struct io_uring_cqe *cqe;
|
|
170
|
+
int ret, i;
|
|
171
|
+
pid_t pid;
|
|
172
|
+
|
|
173
|
+
pid = fork();
|
|
174
|
+
if (!pid) {
|
|
175
|
+
child(20000);
|
|
176
|
+
exit(0);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
sqe = io_uring_get_sqe(ring);
|
|
180
|
+
io_uring_prep_waitid(sqe, P_PID, pid, NULL, WEXITED, 0);
|
|
181
|
+
sqe->user_data = 1;
|
|
182
|
+
|
|
183
|
+
io_uring_submit(ring);
|
|
184
|
+
|
|
185
|
+
sqe = io_uring_get_sqe(ring);
|
|
186
|
+
io_uring_prep_cancel64(sqe, 1, 0);
|
|
187
|
+
sqe->user_data = 2;
|
|
188
|
+
|
|
189
|
+
io_uring_submit(ring);
|
|
190
|
+
|
|
191
|
+
for (i = 0; i < 2; i++) {
|
|
192
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
193
|
+
if (ret) {
|
|
194
|
+
fprintf(stderr, "cqe wait: %d\n", ret);
|
|
195
|
+
return T_EXIT_FAIL;
|
|
196
|
+
}
|
|
197
|
+
if (cqe->user_data == 1 && cqe->res != -ECANCELED) {
|
|
198
|
+
fprintf(stderr, "cqe res: %d\n", cqe->res);
|
|
199
|
+
return T_EXIT_FAIL;
|
|
200
|
+
}
|
|
201
|
+
if (cqe->user_data == 2 && cqe->res != 1) {
|
|
202
|
+
fprintf(stderr, "cqe res: %d\n", cqe->res);
|
|
203
|
+
return T_EXIT_FAIL;
|
|
204
|
+
}
|
|
205
|
+
io_uring_cqe_seen(ring, cqe);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return T_EXIT_PASS;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* Test cancelation of pending waitid, with expected races that either
|
|
213
|
+
* waitid trigger or cancelation will win.
|
|
214
|
+
*/
|
|
215
|
+
static int test_cancel_race(struct io_uring *ring, int async)
|
|
216
|
+
{
|
|
217
|
+
struct io_uring_sqe *sqe;
|
|
218
|
+
struct io_uring_cqe *cqe;
|
|
219
|
+
int ret, i;
|
|
220
|
+
pid_t pid;
|
|
221
|
+
|
|
222
|
+
for (i = 0; i < 10; i++) {
|
|
223
|
+
pid = fork();
|
|
224
|
+
if (!pid) {
|
|
225
|
+
child(getpid() & 1);
|
|
226
|
+
exit(0);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
sqe = io_uring_get_sqe(ring);
|
|
231
|
+
io_uring_prep_waitid(sqe, P_ALL, -1, NULL, WEXITED, 0);
|
|
232
|
+
if (async)
|
|
233
|
+
sqe->flags |= IOSQE_ASYNC;
|
|
234
|
+
sqe->user_data = 1;
|
|
235
|
+
|
|
236
|
+
io_uring_submit(ring);
|
|
237
|
+
|
|
238
|
+
sqe = io_uring_get_sqe(ring);
|
|
239
|
+
io_uring_prep_cancel64(sqe, 1, 0);
|
|
240
|
+
sqe->user_data = 2;
|
|
241
|
+
|
|
242
|
+
usleep(1);
|
|
243
|
+
|
|
244
|
+
io_uring_submit(ring);
|
|
245
|
+
|
|
246
|
+
for (i = 0; i < 2; i++) {
|
|
247
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
248
|
+
if (ret) {
|
|
249
|
+
fprintf(stderr, "cqe wait: %d\n", ret);
|
|
250
|
+
return T_EXIT_FAIL;
|
|
251
|
+
}
|
|
252
|
+
if (cqe->user_data == 1 && !(cqe->res == -ECANCELED ||
|
|
253
|
+
cqe->res == 0)) {
|
|
254
|
+
fprintf(stderr, "cqe1 res: %d\n", cqe->res);
|
|
255
|
+
return T_EXIT_FAIL;
|
|
256
|
+
}
|
|
257
|
+
if (cqe->user_data == 2 &&
|
|
258
|
+
!(cqe->res == 1 || cqe->res == 0 || cqe->res == -ENOENT ||
|
|
259
|
+
cqe->res == -EALREADY)) {
|
|
260
|
+
fprintf(stderr, "cqe2 res: %d\n", cqe->res);
|
|
261
|
+
return T_EXIT_FAIL;
|
|
262
|
+
}
|
|
263
|
+
io_uring_cqe_seen(ring, cqe);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return T_EXIT_PASS;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/*
|
|
270
|
+
* Test basic reap of child exit
|
|
271
|
+
*/
|
|
272
|
+
static int test(struct io_uring *ring)
|
|
273
|
+
{
|
|
274
|
+
struct io_uring_sqe *sqe;
|
|
275
|
+
struct io_uring_cqe *cqe;
|
|
276
|
+
siginfo_t si;
|
|
277
|
+
pid_t pid;
|
|
278
|
+
int ret;
|
|
279
|
+
|
|
280
|
+
pid = fork();
|
|
281
|
+
if (!pid) {
|
|
282
|
+
child(100);
|
|
283
|
+
exit(0);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
sqe = io_uring_get_sqe(ring);
|
|
287
|
+
io_uring_prep_waitid(sqe, P_PID, pid, &si, WEXITED, 0);
|
|
288
|
+
|
|
289
|
+
io_uring_submit(ring);
|
|
290
|
+
|
|
291
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
292
|
+
if (ret) {
|
|
293
|
+
fprintf(stderr, "cqe wait: %d\n", ret);
|
|
294
|
+
return T_EXIT_FAIL;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/* no waitid support */
|
|
298
|
+
if (cqe->res == -EINVAL) {
|
|
299
|
+
no_waitid = true;
|
|
300
|
+
return T_EXIT_SKIP;
|
|
301
|
+
}
|
|
302
|
+
if (cqe->res < 0) {
|
|
303
|
+
fprintf(stderr, "cqe res: %d\n", cqe->res);
|
|
304
|
+
return T_EXIT_FAIL;
|
|
305
|
+
}
|
|
306
|
+
if (si.si_pid != pid) {
|
|
307
|
+
fprintf(stderr, "expected pid %d, got %d\n", pid, si.si_pid);
|
|
308
|
+
return T_EXIT_FAIL;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
io_uring_cqe_seen(ring, cqe);
|
|
312
|
+
return T_EXIT_PASS;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
int main(int argc, char *argv[])
|
|
316
|
+
{
|
|
317
|
+
struct io_uring ring;
|
|
318
|
+
int ret, i;
|
|
319
|
+
|
|
320
|
+
if (argc > 1)
|
|
321
|
+
return T_EXIT_SKIP;
|
|
322
|
+
|
|
323
|
+
io_uring_queue_init(8, &ring, 0);
|
|
324
|
+
|
|
325
|
+
ret = test(&ring);
|
|
326
|
+
if (ret == T_EXIT_FAIL) {
|
|
327
|
+
fprintf(stderr, "test failed\n");
|
|
328
|
+
return T_EXIT_FAIL;
|
|
329
|
+
}
|
|
330
|
+
if (no_waitid)
|
|
331
|
+
return T_EXIT_SKIP;
|
|
332
|
+
|
|
333
|
+
ret = test_noexit(&ring);
|
|
334
|
+
if (ret == T_EXIT_FAIL) {
|
|
335
|
+
fprintf(stderr, "test_noexit failed\n");
|
|
336
|
+
return T_EXIT_FAIL;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
ret = test_noexit(&ring);
|
|
340
|
+
if (ret == T_EXIT_FAIL) {
|
|
341
|
+
fprintf(stderr, "test_noexit failed\n");
|
|
342
|
+
return T_EXIT_FAIL;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
ret = test_double(&ring);
|
|
346
|
+
if (ret == T_EXIT_FAIL) {
|
|
347
|
+
fprintf(stderr, "test_double failed\n");
|
|
348
|
+
return T_EXIT_FAIL;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
ret = test_ready(&ring);
|
|
352
|
+
if (ret == T_EXIT_FAIL) {
|
|
353
|
+
fprintf(stderr, "test_ready failed\n");
|
|
354
|
+
return T_EXIT_FAIL;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
ret = test_cancel(&ring);
|
|
358
|
+
if (ret == T_EXIT_FAIL) {
|
|
359
|
+
fprintf(stderr, "test_cancel failed\n");
|
|
360
|
+
return T_EXIT_FAIL;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
for (i = 0; i < 1000; i++) {
|
|
364
|
+
ret = test_cancel_race(&ring, i & 1);
|
|
365
|
+
if (ret == T_EXIT_FAIL) {
|
|
366
|
+
fprintf(stderr, "test_cancel_race failed\n");
|
|
367
|
+
return T_EXIT_FAIL;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
io_uring_queue_exit(&ring);
|
|
372
|
+
return T_EXIT_PASS;
|
|
373
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
#include <sys/eventfd.h>
|
|
3
|
+
#include <unistd.h>
|
|
4
|
+
#include <stdio.h>
|
|
5
|
+
#include <stdlib.h>
|
|
6
|
+
#include <string.h>
|
|
7
|
+
#include <pthread.h>
|
|
8
|
+
#include <fcntl.h>
|
|
9
|
+
#include <poll.h>
|
|
10
|
+
#include <sys/time.h>
|
|
11
|
+
#include "liburing.h"
|
|
12
|
+
|
|
13
|
+
struct thread_data {
|
|
14
|
+
struct io_uring *ring;
|
|
15
|
+
int write_fd;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
static void error_exit(char *message)
|
|
19
|
+
{
|
|
20
|
+
perror(message);
|
|
21
|
+
exit(1);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
static void *listener_thread(void *data)
|
|
25
|
+
{
|
|
26
|
+
struct thread_data *td = data;
|
|
27
|
+
struct io_uring_cqe *cqe;
|
|
28
|
+
int ret;
|
|
29
|
+
|
|
30
|
+
ret = io_uring_wait_cqe(td->ring, &cqe);
|
|
31
|
+
if (ret < 0) {
|
|
32
|
+
fprintf(stderr, "Error waiting for completion: %s\n",
|
|
33
|
+
strerror(-ret));
|
|
34
|
+
goto err;
|
|
35
|
+
}
|
|
36
|
+
if (cqe->res < 0) {
|
|
37
|
+
fprintf(stderr, "Error in async operation: %s\n", strerror(-cqe->res));
|
|
38
|
+
goto err;
|
|
39
|
+
}
|
|
40
|
+
io_uring_cqe_seen(td->ring, cqe);
|
|
41
|
+
return NULL;
|
|
42
|
+
err:
|
|
43
|
+
return (void *) 1;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static void *wakeup_io_uring(void *data)
|
|
47
|
+
{
|
|
48
|
+
struct thread_data *td = data;
|
|
49
|
+
int res;
|
|
50
|
+
|
|
51
|
+
res = eventfd_write(td->write_fd, (eventfd_t) 1L);
|
|
52
|
+
if (res < 0) {
|
|
53
|
+
perror("eventfd_write");
|
|
54
|
+
return (void *) 1;
|
|
55
|
+
}
|
|
56
|
+
return NULL;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static int test_pipes(void)
|
|
60
|
+
{
|
|
61
|
+
struct io_uring_sqe *sqe;
|
|
62
|
+
struct thread_data td;
|
|
63
|
+
struct io_uring ring;
|
|
64
|
+
pthread_t t1, t2;
|
|
65
|
+
int ret, fds[2];
|
|
66
|
+
void *pret;
|
|
67
|
+
|
|
68
|
+
if (pipe(fds) < 0)
|
|
69
|
+
error_exit("eventfd");
|
|
70
|
+
|
|
71
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
72
|
+
if (ret) {
|
|
73
|
+
fprintf(stderr, "Unable to setup io_uring: %s\n", strerror(-ret));
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
td.write_fd = fds[1];
|
|
78
|
+
td.ring = ˚
|
|
79
|
+
|
|
80
|
+
sqe = io_uring_get_sqe(&ring);
|
|
81
|
+
io_uring_prep_poll_add(sqe, fds[0], POLLIN);
|
|
82
|
+
sqe->user_data = 2;
|
|
83
|
+
ret = io_uring_submit(&ring);
|
|
84
|
+
if (ret != 1) {
|
|
85
|
+
fprintf(stderr, "ring_submit=%d\n", ret);
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
pthread_create(&t1, NULL, listener_thread, &td);
|
|
90
|
+
|
|
91
|
+
sleep(1);
|
|
92
|
+
|
|
93
|
+
pthread_create(&t2, NULL, wakeup_io_uring, &td);
|
|
94
|
+
pthread_join(t1, &pret);
|
|
95
|
+
|
|
96
|
+
io_uring_queue_exit(&ring);
|
|
97
|
+
return pret != NULL;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
static int test_eventfd(void)
|
|
101
|
+
{
|
|
102
|
+
struct io_uring_sqe *sqe;
|
|
103
|
+
struct thread_data td;
|
|
104
|
+
struct io_uring ring;
|
|
105
|
+
pthread_t t1, t2;
|
|
106
|
+
int efd, ret;
|
|
107
|
+
void *pret;
|
|
108
|
+
|
|
109
|
+
efd = eventfd(0, 0);
|
|
110
|
+
if (efd < 0)
|
|
111
|
+
error_exit("eventfd");
|
|
112
|
+
|
|
113
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
114
|
+
if (ret) {
|
|
115
|
+
fprintf(stderr, "Unable to setup io_uring: %s\n", strerror(-ret));
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
td.write_fd = efd;
|
|
120
|
+
td.ring = ˚
|
|
121
|
+
|
|
122
|
+
sqe = io_uring_get_sqe(&ring);
|
|
123
|
+
io_uring_prep_poll_add(sqe, efd, POLLIN);
|
|
124
|
+
sqe->user_data = 2;
|
|
125
|
+
ret = io_uring_submit(&ring);
|
|
126
|
+
if (ret != 1) {
|
|
127
|
+
fprintf(stderr, "ring_submit=%d\n", ret);
|
|
128
|
+
return 1;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
pthread_create(&t1, NULL, listener_thread, &td);
|
|
132
|
+
|
|
133
|
+
sleep(1);
|
|
134
|
+
|
|
135
|
+
pthread_create(&t2, NULL, wakeup_io_uring, &td);
|
|
136
|
+
pthread_join(t1, &pret);
|
|
137
|
+
|
|
138
|
+
io_uring_queue_exit(&ring);
|
|
139
|
+
return pret != NULL;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
int main(int argc, char *argv[])
|
|
143
|
+
{
|
|
144
|
+
int ret;
|
|
145
|
+
|
|
146
|
+
if (argc > 1)
|
|
147
|
+
return 0;
|
|
148
|
+
|
|
149
|
+
ret = test_pipes();
|
|
150
|
+
if (ret) {
|
|
151
|
+
fprintf(stderr, "test_pipe failed\n");
|
|
152
|
+
return ret;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
ret = test_eventfd();
|
|
156
|
+
if (ret) {
|
|
157
|
+
fprintf(stderr, "test_eventfd failed\n");
|
|
158
|
+
return ret;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: test that io-wq affinity is correctly set for SQPOLL
|
|
4
|
+
*/
|
|
5
|
+
#include <stdio.h>
|
|
6
|
+
#include <unistd.h>
|
|
7
|
+
#include <fcntl.h>
|
|
8
|
+
#include <stdlib.h>
|
|
9
|
+
#include <string.h>
|
|
10
|
+
|
|
11
|
+
#include "liburing.h"
|
|
12
|
+
#include "helpers.h"
|
|
13
|
+
|
|
14
|
+
#define IOWQ_CPU 0
|
|
15
|
+
#define SQPOLL_CPU 1
|
|
16
|
+
|
|
17
|
+
static int verify_comm(pid_t pid, const char *name, int cpu)
|
|
18
|
+
{
|
|
19
|
+
char comm[64], buf[64];
|
|
20
|
+
cpu_set_t set;
|
|
21
|
+
int fd, ret;
|
|
22
|
+
|
|
23
|
+
sprintf(comm, "/proc/%d/comm", pid);
|
|
24
|
+
fd = open(comm, O_RDONLY);
|
|
25
|
+
if (fd < 0) {
|
|
26
|
+
perror("open");
|
|
27
|
+
return T_EXIT_SKIP;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ret = read(fd, buf, sizeof(buf));
|
|
31
|
+
if (ret < 0) {
|
|
32
|
+
close(fd);
|
|
33
|
+
return T_EXIT_SKIP;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (strncmp(buf, name, strlen(name) - 1)) {
|
|
37
|
+
close(fd);
|
|
38
|
+
return T_EXIT_SKIP;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
close(fd);
|
|
42
|
+
|
|
43
|
+
ret = sched_getaffinity(pid, sizeof(set), &set);
|
|
44
|
+
if (ret < 0) {
|
|
45
|
+
perror("sched_getaffinity");
|
|
46
|
+
return T_EXIT_SKIP;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (CPU_COUNT(&set) != 1) {
|
|
50
|
+
fprintf(stderr, "More than one CPU set in mask\n");
|
|
51
|
+
return T_EXIT_FAIL;
|
|
52
|
+
}
|
|
53
|
+
if (!CPU_ISSET(cpu, &set)) {
|
|
54
|
+
fprintf(stderr, "Wrong CPU set in mask\n");
|
|
55
|
+
return T_EXIT_FAIL;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return T_EXIT_PASS;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static int verify_affinity(pid_t pid, int sqpoll)
|
|
62
|
+
{
|
|
63
|
+
pid_t wq_pid, sqpoll_pid = -1;
|
|
64
|
+
char name[64];
|
|
65
|
+
int ret;
|
|
66
|
+
|
|
67
|
+
wq_pid = pid + 2;
|
|
68
|
+
if (sqpoll)
|
|
69
|
+
sqpoll_pid = pid + 1;
|
|
70
|
+
|
|
71
|
+
/* verify we had the pids right */
|
|
72
|
+
sprintf(name, "iou-wrk-%d", pid);
|
|
73
|
+
ret = verify_comm(wq_pid, name, IOWQ_CPU);
|
|
74
|
+
if (ret != T_EXIT_PASS)
|
|
75
|
+
return ret;
|
|
76
|
+
|
|
77
|
+
if (sqpoll_pid != -1) {
|
|
78
|
+
sprintf(name, "iou-sqp-%d", pid);
|
|
79
|
+
ret = verify_comm(sqpoll_pid, name, SQPOLL_CPU);
|
|
80
|
+
if (ret != T_EXIT_PASS)
|
|
81
|
+
return ret;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return T_EXIT_PASS;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static int test(int sqpoll)
|
|
88
|
+
{
|
|
89
|
+
struct io_uring_params p = { };
|
|
90
|
+
struct io_uring ring;
|
|
91
|
+
struct io_uring_sqe *sqe;
|
|
92
|
+
char buf[64];
|
|
93
|
+
int fds[2], ret;
|
|
94
|
+
cpu_set_t set;
|
|
95
|
+
|
|
96
|
+
if (sqpoll) {
|
|
97
|
+
p.flags = IORING_SETUP_SQPOLL | IORING_SETUP_SQ_AFF;
|
|
98
|
+
p.sq_thread_cpu = SQPOLL_CPU;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
io_uring_queue_init_params(8, &ring, &p);
|
|
102
|
+
|
|
103
|
+
CPU_ZERO(&set);
|
|
104
|
+
CPU_SET(IOWQ_CPU, &set);
|
|
105
|
+
|
|
106
|
+
ret = io_uring_register_iowq_aff(&ring, sizeof(set), &set);
|
|
107
|
+
if (ret) {
|
|
108
|
+
fprintf(stderr, "register aff: %d\n", ret);
|
|
109
|
+
return T_EXIT_FAIL;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (pipe(fds) < 0) {
|
|
113
|
+
perror("pipe");
|
|
114
|
+
return T_EXIT_FAIL;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
sqe = io_uring_get_sqe(&ring);
|
|
118
|
+
io_uring_prep_read(sqe, fds[0], buf, sizeof(buf), 0);
|
|
119
|
+
sqe->flags |= IOSQE_ASYNC;
|
|
120
|
+
|
|
121
|
+
io_uring_submit(&ring);
|
|
122
|
+
|
|
123
|
+
usleep(10000);
|
|
124
|
+
|
|
125
|
+
ret = verify_affinity(getpid(), sqpoll);
|
|
126
|
+
io_uring_queue_exit(&ring);
|
|
127
|
+
return ret;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
int main(int argc, char *argv[])
|
|
131
|
+
{
|
|
132
|
+
int ret;
|
|
133
|
+
|
|
134
|
+
if (argc > 1)
|
|
135
|
+
return T_EXIT_SKIP;
|
|
136
|
+
|
|
137
|
+
ret = test(1);
|
|
138
|
+
if (ret == T_EXIT_SKIP) {
|
|
139
|
+
return T_EXIT_SKIP;
|
|
140
|
+
} else if (ret != T_EXIT_PASS) {
|
|
141
|
+
fprintf(stderr, "test sqpoll failed\n");
|
|
142
|
+
return T_EXIT_FAIL;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return T_EXIT_PASS;
|
|
146
|
+
}
|