iou 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.
Files changed (297) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.gitignore +59 -0
  4. data/.gitmodules +3 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +21 -0
  7. data/README.md +106 -0
  8. data/Rakefile +39 -0
  9. data/TODO.md +4 -0
  10. data/examples/echo_server.rb +52 -0
  11. data/examples/event_loop.rb +69 -0
  12. data/examples/http_server.rb +56 -0
  13. data/examples/http_server_multishot.rb +59 -0
  14. data/ext/iou/extconf.rb +71 -0
  15. data/ext/iou/iou.c +729 -0
  16. data/ext/iou/iou.h +66 -0
  17. data/ext/iou/iou_ext.c +9 -0
  18. data/ext/iou/op_spec_data.c +61 -0
  19. data/iou.gemspec +27 -0
  20. data/lib/iou/version.rb +5 -0
  21. data/lib/iou.rb +3 -0
  22. data/test/helper.rb +59 -0
  23. data/test/test_iou.rb +794 -0
  24. data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
  25. data/vendor/liburing/.github/pull_request_template.md +86 -0
  26. data/vendor/liburing/.github/workflows/build.yml +137 -0
  27. data/vendor/liburing/.github/workflows/codespell.yml +25 -0
  28. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  29. data/vendor/liburing/.gitignore +41 -0
  30. data/vendor/liburing/CHANGELOG +111 -0
  31. data/vendor/liburing/CITATION.cff +11 -0
  32. data/vendor/liburing/COPYING +502 -0
  33. data/vendor/liburing/COPYING.GPL +339 -0
  34. data/vendor/liburing/LICENSE +20 -0
  35. data/vendor/liburing/Makefile +96 -0
  36. data/vendor/liburing/Makefile.common +7 -0
  37. data/vendor/liburing/Makefile.quiet +11 -0
  38. data/vendor/liburing/README +106 -0
  39. data/vendor/liburing/SECURITY.md +6 -0
  40. data/vendor/liburing/configure +624 -0
  41. data/vendor/liburing/debian/README.Debian +7 -0
  42. data/vendor/liburing/debian/changelog +38 -0
  43. data/vendor/liburing/debian/control +39 -0
  44. data/vendor/liburing/debian/copyright +49 -0
  45. data/vendor/liburing/debian/liburing-dev.install +4 -0
  46. data/vendor/liburing/debian/liburing-dev.manpages +5 -0
  47. data/vendor/liburing/debian/liburing2.install +1 -0
  48. data/vendor/liburing/debian/liburing2.symbols +56 -0
  49. data/vendor/liburing/debian/patches/series +1 -0
  50. data/vendor/liburing/debian/rules +29 -0
  51. data/vendor/liburing/debian/source/format +1 -0
  52. data/vendor/liburing/debian/source/local-options +2 -0
  53. data/vendor/liburing/debian/source/options +1 -0
  54. data/vendor/liburing/debian/watch +3 -0
  55. data/vendor/liburing/examples/Makefile +53 -0
  56. data/vendor/liburing/examples/helpers.c +62 -0
  57. data/vendor/liburing/examples/helpers.h +7 -0
  58. data/vendor/liburing/examples/io_uring-close-test.c +123 -0
  59. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  60. data/vendor/liburing/examples/io_uring-test.c +112 -0
  61. data/vendor/liburing/examples/io_uring-udp.c +403 -0
  62. data/vendor/liburing/examples/link-cp.c +193 -0
  63. data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
  64. data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
  65. data/vendor/liburing/examples/poll-bench.c +101 -0
  66. data/vendor/liburing/examples/proxy.c +2461 -0
  67. data/vendor/liburing/examples/proxy.h +102 -0
  68. data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
  69. data/vendor/liburing/examples/send-zerocopy.c +658 -0
  70. data/vendor/liburing/examples/ucontext-cp.c +258 -0
  71. data/vendor/liburing/liburing-ffi.pc.in +12 -0
  72. data/vendor/liburing/liburing.pc.in +12 -0
  73. data/vendor/liburing/liburing.spec +66 -0
  74. data/vendor/liburing/make-debs.sh +55 -0
  75. data/vendor/liburing/src/Makefile +129 -0
  76. data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
  77. data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
  78. data/vendor/liburing/src/arch/generic/lib.h +17 -0
  79. data/vendor/liburing/src/arch/generic/syscall.h +100 -0
  80. data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
  81. data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
  82. data/vendor/liburing/src/arch/syscall-defs.h +94 -0
  83. data/vendor/liburing/src/arch/x86/lib.h +11 -0
  84. data/vendor/liburing/src/arch/x86/syscall.h +296 -0
  85. data/vendor/liburing/src/ffi.c +15 -0
  86. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  87. data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
  88. data/vendor/liburing/src/include/liburing.h +1602 -0
  89. data/vendor/liburing/src/int_flags.h +11 -0
  90. data/vendor/liburing/src/lib.h +52 -0
  91. data/vendor/liburing/src/liburing-ffi.map +211 -0
  92. data/vendor/liburing/src/liburing.map +104 -0
  93. data/vendor/liburing/src/nolibc.c +55 -0
  94. data/vendor/liburing/src/queue.c +468 -0
  95. data/vendor/liburing/src/register.c +374 -0
  96. data/vendor/liburing/src/setup.c +689 -0
  97. data/vendor/liburing/src/setup.h +9 -0
  98. data/vendor/liburing/src/syscall.c +29 -0
  99. data/vendor/liburing/src/syscall.h +53 -0
  100. data/vendor/liburing/src/version.c +21 -0
  101. data/vendor/liburing/test/232c93d07b74.c +305 -0
  102. data/vendor/liburing/test/35fa71a030ca.c +329 -0
  103. data/vendor/liburing/test/500f9fbadef8.c +91 -0
  104. data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
  105. data/vendor/liburing/test/8a9973408177.c +107 -0
  106. data/vendor/liburing/test/917257daa0fe.c +54 -0
  107. data/vendor/liburing/test/Makefile +297 -0
  108. data/vendor/liburing/test/a0908ae19763.c +59 -0
  109. data/vendor/liburing/test/a4c0b3decb33.c +181 -0
  110. data/vendor/liburing/test/accept-link.c +255 -0
  111. data/vendor/liburing/test/accept-non-empty.c +256 -0
  112. data/vendor/liburing/test/accept-reuse.c +163 -0
  113. data/vendor/liburing/test/accept-test.c +83 -0
  114. data/vendor/liburing/test/accept.c +919 -0
  115. data/vendor/liburing/test/across-fork.c +284 -0
  116. data/vendor/liburing/test/b19062a56726.c +54 -0
  117. data/vendor/liburing/test/b5837bd5311d.c +78 -0
  118. data/vendor/liburing/test/bind-listen.c +408 -0
  119. data/vendor/liburing/test/buf-ring-nommap.c +123 -0
  120. data/vendor/liburing/test/buf-ring-put.c +83 -0
  121. data/vendor/liburing/test/buf-ring.c +473 -0
  122. data/vendor/liburing/test/ce593a6c480a.c +139 -0
  123. data/vendor/liburing/test/close-opath.c +123 -0
  124. data/vendor/liburing/test/config +14 -0
  125. data/vendor/liburing/test/connect-rep.c +204 -0
  126. data/vendor/liburing/test/connect.c +442 -0
  127. data/vendor/liburing/test/coredump.c +60 -0
  128. data/vendor/liburing/test/cq-full.c +97 -0
  129. data/vendor/liburing/test/cq-overflow.c +530 -0
  130. data/vendor/liburing/test/cq-peek-batch.c +103 -0
  131. data/vendor/liburing/test/cq-ready.c +95 -0
  132. data/vendor/liburing/test/cq-size.c +65 -0
  133. data/vendor/liburing/test/d4ae271dfaae.c +96 -0
  134. data/vendor/liburing/test/d77a67ed5f27.c +65 -0
  135. data/vendor/liburing/test/defer-taskrun.c +391 -0
  136. data/vendor/liburing/test/defer-tw-timeout.c +173 -0
  137. data/vendor/liburing/test/defer.c +319 -0
  138. data/vendor/liburing/test/double-poll-crash.c +195 -0
  139. data/vendor/liburing/test/drop-submit.c +94 -0
  140. data/vendor/liburing/test/eeed8b54e0df.c +120 -0
  141. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  142. data/vendor/liburing/test/eploop.c +74 -0
  143. data/vendor/liburing/test/eventfd-disable.c +179 -0
  144. data/vendor/liburing/test/eventfd-reg.c +77 -0
  145. data/vendor/liburing/test/eventfd-ring.c +98 -0
  146. data/vendor/liburing/test/eventfd.c +113 -0
  147. data/vendor/liburing/test/evloop.c +73 -0
  148. data/vendor/liburing/test/exec-target.c +6 -0
  149. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  150. data/vendor/liburing/test/fadvise.c +202 -0
  151. data/vendor/liburing/test/fallocate.c +265 -0
  152. data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
  153. data/vendor/liburing/test/fd-install.c +500 -0
  154. data/vendor/liburing/test/fd-pass.c +237 -0
  155. data/vendor/liburing/test/fdinfo.c +419 -0
  156. data/vendor/liburing/test/file-register.c +1189 -0
  157. data/vendor/liburing/test/file-update.c +231 -0
  158. data/vendor/liburing/test/file-verify.c +654 -0
  159. data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
  160. data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
  161. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  162. data/vendor/liburing/test/fixed-buf-merge.c +101 -0
  163. data/vendor/liburing/test/fixed-hugepage.c +411 -0
  164. data/vendor/liburing/test/fixed-link.c +90 -0
  165. data/vendor/liburing/test/fixed-reuse.c +160 -0
  166. data/vendor/liburing/test/fpos.c +255 -0
  167. data/vendor/liburing/test/fsnotify.c +118 -0
  168. data/vendor/liburing/test/fsync.c +224 -0
  169. data/vendor/liburing/test/futex.c +571 -0
  170. data/vendor/liburing/test/hardlink.c +170 -0
  171. data/vendor/liburing/test/helpers.c +318 -0
  172. data/vendor/liburing/test/helpers.h +108 -0
  173. data/vendor/liburing/test/ignore-single-mmap.c +48 -0
  174. data/vendor/liburing/test/init-mem.c +164 -0
  175. data/vendor/liburing/test/io-cancel.c +561 -0
  176. data/vendor/liburing/test/io_uring_enter.c +264 -0
  177. data/vendor/liburing/test/io_uring_passthrough.c +482 -0
  178. data/vendor/liburing/test/io_uring_register.c +503 -0
  179. data/vendor/liburing/test/io_uring_setup.c +110 -0
  180. data/vendor/liburing/test/iopoll-leak.c +85 -0
  181. data/vendor/liburing/test/iopoll-overflow.c +118 -0
  182. data/vendor/liburing/test/iopoll.c +465 -0
  183. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  184. data/vendor/liburing/test/lfs-openat.c +273 -0
  185. data/vendor/liburing/test/link-timeout.c +1108 -0
  186. data/vendor/liburing/test/link.c +497 -0
  187. data/vendor/liburing/test/link_drain.c +255 -0
  188. data/vendor/liburing/test/madvise.c +195 -0
  189. data/vendor/liburing/test/min-timeout-wait.c +354 -0
  190. data/vendor/liburing/test/min-timeout.c +233 -0
  191. data/vendor/liburing/test/mkdir.c +112 -0
  192. data/vendor/liburing/test/msg-ring-fd.c +331 -0
  193. data/vendor/liburing/test/msg-ring-flags.c +212 -0
  194. data/vendor/liburing/test/msg-ring-overflow.c +159 -0
  195. data/vendor/liburing/test/msg-ring.c +467 -0
  196. data/vendor/liburing/test/multicqes_drain.c +429 -0
  197. data/vendor/liburing/test/napi-test.c +215 -0
  198. data/vendor/liburing/test/napi-test.sh +48 -0
  199. data/vendor/liburing/test/no-mmap-inval.c +42 -0
  200. data/vendor/liburing/test/nolibc.c +62 -0
  201. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  202. data/vendor/liburing/test/nop.c +177 -0
  203. data/vendor/liburing/test/nvme.h +169 -0
  204. data/vendor/liburing/test/ooo-file-unreg.c +82 -0
  205. data/vendor/liburing/test/open-close.c +261 -0
  206. data/vendor/liburing/test/open-direct-link.c +188 -0
  207. data/vendor/liburing/test/open-direct-pick.c +180 -0
  208. data/vendor/liburing/test/openat2.c +312 -0
  209. data/vendor/liburing/test/personality.c +204 -0
  210. data/vendor/liburing/test/pipe-bug.c +95 -0
  211. data/vendor/liburing/test/pipe-eof.c +83 -0
  212. data/vendor/liburing/test/pipe-reuse.c +105 -0
  213. data/vendor/liburing/test/poll-cancel-all.c +496 -0
  214. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  215. data/vendor/liburing/test/poll-cancel.c +228 -0
  216. data/vendor/liburing/test/poll-link.c +221 -0
  217. data/vendor/liburing/test/poll-many.c +230 -0
  218. data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
  219. data/vendor/liburing/test/poll-mshot-update.c +323 -0
  220. data/vendor/liburing/test/poll-race-mshot.c +276 -0
  221. data/vendor/liburing/test/poll-race.c +105 -0
  222. data/vendor/liburing/test/poll-ring.c +48 -0
  223. data/vendor/liburing/test/poll-v-poll.c +353 -0
  224. data/vendor/liburing/test/poll.c +327 -0
  225. data/vendor/liburing/test/probe.c +135 -0
  226. data/vendor/liburing/test/read-before-exit.c +129 -0
  227. data/vendor/liburing/test/read-mshot-empty.c +153 -0
  228. data/vendor/liburing/test/read-mshot.c +404 -0
  229. data/vendor/liburing/test/read-write.c +1013 -0
  230. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  231. data/vendor/liburing/test/recv-msgall.c +263 -0
  232. data/vendor/liburing/test/recv-multishot.c +602 -0
  233. data/vendor/liburing/test/recvsend_bundle.c +691 -0
  234. data/vendor/liburing/test/reg-fd-only.c +131 -0
  235. data/vendor/liburing/test/reg-hint.c +56 -0
  236. data/vendor/liburing/test/reg-reg-ring.c +90 -0
  237. data/vendor/liburing/test/regbuf-merge.c +91 -0
  238. data/vendor/liburing/test/register-restrictions.c +633 -0
  239. data/vendor/liburing/test/rename.c +132 -0
  240. data/vendor/liburing/test/ring-leak.c +283 -0
  241. data/vendor/liburing/test/ring-leak2.c +249 -0
  242. data/vendor/liburing/test/ringbuf-read.c +196 -0
  243. data/vendor/liburing/test/ringbuf-status.c +242 -0
  244. data/vendor/liburing/test/rsrc_tags.c +461 -0
  245. data/vendor/liburing/test/runtests-loop.sh +16 -0
  246. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  247. data/vendor/liburing/test/runtests.sh +168 -0
  248. data/vendor/liburing/test/rw_merge_test.c +98 -0
  249. data/vendor/liburing/test/self.c +91 -0
  250. data/vendor/liburing/test/send-zerocopy.c +971 -0
  251. data/vendor/liburing/test/send_recv.c +412 -0
  252. data/vendor/liburing/test/send_recvmsg.c +444 -0
  253. data/vendor/liburing/test/shared-wq.c +84 -0
  254. data/vendor/liburing/test/short-read.c +75 -0
  255. data/vendor/liburing/test/shutdown.c +165 -0
  256. data/vendor/liburing/test/sigfd-deadlock.c +88 -0
  257. data/vendor/liburing/test/single-issuer.c +169 -0
  258. data/vendor/liburing/test/skip-cqe.c +428 -0
  259. data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
  260. data/vendor/liburing/test/socket-io-cmd.c +237 -0
  261. data/vendor/liburing/test/socket-rw-eagain.c +149 -0
  262. data/vendor/liburing/test/socket-rw-offset.c +149 -0
  263. data/vendor/liburing/test/socket-rw.c +137 -0
  264. data/vendor/liburing/test/socket.c +408 -0
  265. data/vendor/liburing/test/splice.c +512 -0
  266. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  267. data/vendor/liburing/test/sq-full.c +45 -0
  268. data/vendor/liburing/test/sq-poll-dup.c +211 -0
  269. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  270. data/vendor/liburing/test/sq-poll-share.c +138 -0
  271. data/vendor/liburing/test/sq-space_left.c +159 -0
  272. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  273. data/vendor/liburing/test/sqpoll-exec.c +132 -0
  274. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  275. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  276. data/vendor/liburing/test/statx.c +172 -0
  277. data/vendor/liburing/test/stdout.c +232 -0
  278. data/vendor/liburing/test/submit-and-wait.c +108 -0
  279. data/vendor/liburing/test/submit-link-fail.c +156 -0
  280. data/vendor/liburing/test/submit-reuse.c +237 -0
  281. data/vendor/liburing/test/symlink.c +117 -0
  282. data/vendor/liburing/test/sync-cancel.c +235 -0
  283. data/vendor/liburing/test/teardowns.c +58 -0
  284. data/vendor/liburing/test/test.h +36 -0
  285. data/vendor/liburing/test/thread-exit.c +143 -0
  286. data/vendor/liburing/test/timeout-new.c +256 -0
  287. data/vendor/liburing/test/timeout.c +1798 -0
  288. data/vendor/liburing/test/truncate.c +186 -0
  289. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  290. data/vendor/liburing/test/unlink.c +112 -0
  291. data/vendor/liburing/test/version.c +25 -0
  292. data/vendor/liburing/test/wait-timeout.c +287 -0
  293. data/vendor/liburing/test/waitid.c +373 -0
  294. data/vendor/liburing/test/wakeup-hang.c +162 -0
  295. data/vendor/liburing/test/wq-aff.c +146 -0
  296. data/vendor/liburing/test/xattr.c +442 -0
  297. metadata +402 -0
@@ -0,0 +1,113 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: run various eventfd 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 <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_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 (argc > 1)
32
+ return T_EXIT_SKIP;
33
+
34
+ ret = io_uring_queue_init_params(8, &ring, &p);
35
+ if (ret) {
36
+ fprintf(stderr, "ring setup failed: %d\n", ret);
37
+ return T_EXIT_FAIL;
38
+ }
39
+ if (!(p.features & IORING_FEAT_CUR_PERSONALITY)) {
40
+ fprintf(stdout, "Skipping\n");
41
+ return T_EXIT_SKIP;
42
+ }
43
+
44
+ evfd = eventfd(0, EFD_CLOEXEC);
45
+ if (evfd < 0) {
46
+ perror("eventfd");
47
+ return T_EXIT_FAIL;
48
+ }
49
+
50
+ ret = io_uring_register_eventfd(&ring, evfd);
51
+ if (ret) {
52
+ fprintf(stderr, "failed to register evfd: %d\n", ret);
53
+ return T_EXIT_FAIL;
54
+ }
55
+
56
+ sqe = io_uring_get_sqe(&ring);
57
+ io_uring_prep_poll_add(sqe, evfd, POLLIN);
58
+ sqe->flags |= IOSQE_IO_LINK;
59
+ sqe->user_data = 1;
60
+
61
+ sqe = io_uring_get_sqe(&ring);
62
+ io_uring_prep_readv(sqe, evfd, &vec, 1, 0);
63
+ sqe->flags |= IOSQE_IO_LINK;
64
+ sqe->user_data = 2;
65
+
66
+ ret = io_uring_submit(&ring);
67
+ if (ret != 2) {
68
+ fprintf(stderr, "submit: %d\n", ret);
69
+ return T_EXIT_FAIL;
70
+ }
71
+
72
+ sqe = io_uring_get_sqe(&ring);
73
+ io_uring_prep_nop(sqe);
74
+ sqe->user_data = 3;
75
+
76
+ ret = io_uring_submit(&ring);
77
+ if (ret != 1) {
78
+ fprintf(stderr, "submit: %d\n", ret);
79
+ return T_EXIT_FAIL;
80
+ }
81
+
82
+ for (i = 0; i < 3; i++) {
83
+ ret = io_uring_wait_cqe(&ring, &cqe);
84
+ if (ret) {
85
+ fprintf(stderr, "wait: %d\n", ret);
86
+ return T_EXIT_FAIL;
87
+ }
88
+ switch (cqe->user_data) {
89
+ case 1:
90
+ /* POLLIN */
91
+ if (cqe->res != 1) {
92
+ fprintf(stderr, "poll: %d\n", cqe->res);
93
+ return T_EXIT_FAIL;
94
+ }
95
+ break;
96
+ case 2:
97
+ if (cqe->res != sizeof(ptr)) {
98
+ fprintf(stderr, "read: %d\n", cqe->res);
99
+ return T_EXIT_FAIL;
100
+ }
101
+ break;
102
+ case 3:
103
+ if (cqe->res) {
104
+ fprintf(stderr, "nop: %d\n", cqe->res);
105
+ return T_EXIT_FAIL;
106
+ }
107
+ break;
108
+ }
109
+ io_uring_cqe_seen(&ring, cqe);
110
+ }
111
+
112
+ return T_EXIT_PASS;
113
+ }
@@ -0,0 +1,73 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test that we don't recursively generate completion events if an io_uring
4
+ * has an eventfd registered that triggers on completions, and we add a poll
5
+ * request with multishot on the eventfd. Older kernels will stop on overflow,
6
+ * newer kernels will detect this earlier and abort correctly.
7
+ */
8
+ #include <errno.h>
9
+ #include <stdio.h>
10
+ #include <unistd.h>
11
+ #include <stdlib.h>
12
+ #include <sys/eventfd.h>
13
+ #include <sys/types.h>
14
+ #include <poll.h>
15
+ #include <assert.h>
16
+ #include "liburing.h"
17
+ #include "helpers.h"
18
+
19
+ int main(int argc, char *argv[])
20
+ {
21
+ struct io_uring ring;
22
+ struct io_uring_sqe *sqe;
23
+ struct io_uring_cqe *cqe;
24
+ int ret, efd, i;
25
+
26
+ if (argc > 1)
27
+ return T_EXIT_SKIP;
28
+
29
+ ret = io_uring_queue_init(8, &ring, 0);
30
+ if (ret) {
31
+ fprintf(stderr, "Ring init failed: %d\n", ret);
32
+ return T_EXIT_FAIL;
33
+ }
34
+
35
+ efd = eventfd(0, 0);
36
+ if (efd < 0) {
37
+ perror("eventfd");
38
+ return T_EXIT_FAIL;
39
+ }
40
+
41
+ ret = io_uring_register_eventfd(&ring, efd);
42
+ if (ret) {
43
+ fprintf(stderr, "Ring eventfd register failed: %d\n", ret);
44
+ return T_EXIT_FAIL;
45
+ }
46
+
47
+ sqe = io_uring_get_sqe(&ring);
48
+ io_uring_prep_poll_multishot(sqe, efd, POLLIN);
49
+ sqe->user_data = 1;
50
+ io_uring_submit(&ring);
51
+
52
+ sqe = io_uring_get_sqe(&ring);
53
+ sqe->user_data = 2;
54
+ io_uring_prep_nop(sqe);
55
+ io_uring_submit(&ring);
56
+
57
+ for (i = 0; i < 2; i++) {
58
+ ret = io_uring_wait_cqe(&ring, &cqe);
59
+ if (ret) {
60
+ fprintf(stderr, "wait_cqe ret = %d\n", ret);
61
+ break;
62
+ }
63
+ io_uring_cqe_seen(&ring, cqe);
64
+ }
65
+
66
+ ret = io_uring_peek_cqe(&ring, &cqe);
67
+ if (!ret) {
68
+ fprintf(stderr, "Generated too many events\n");
69
+ return T_EXIT_FAIL;
70
+ }
71
+
72
+ return T_EXIT_PASS;
73
+ }
@@ -0,0 +1,6 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ int main(int argc, char *argv[])
4
+ {
5
+ return 0;
6
+ }
@@ -0,0 +1,117 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test case testing exit without cleanup and io-wq work pending or queued.
4
+ *
5
+ * From Florian Fischer <florian.fl.fischer@fau.de>
6
+ * Link: https://lore.kernel.org/io-uring/20211202165606.mqryio4yzubl7ms5@pasture/
7
+ *
8
+ */
9
+ #include <assert.h>
10
+ #include <err.h>
11
+ #include <errno.h>
12
+ #include <pthread.h>
13
+ #include <semaphore.h>
14
+ #include <stdio.h>
15
+ #include <stdlib.h>
16
+ #include <sys/sysinfo.h>
17
+ #include <unistd.h>
18
+
19
+ #include "liburing.h"
20
+ #include "helpers.h"
21
+
22
+ #define IORING_ENTRIES 8
23
+
24
+ static pthread_t *threads;
25
+ static pthread_barrier_t init_barrier;
26
+ static int sleep_fd, notify_fd;
27
+ static sem_t sem;
28
+
29
+ static void *thread_func(void *arg)
30
+ {
31
+ struct io_uring ring;
32
+ int res;
33
+
34
+ res = io_uring_queue_init(IORING_ENTRIES, &ring, 0);
35
+ if (res)
36
+ err(EXIT_FAILURE, "io_uring_queue_init failed");
37
+
38
+ pthread_barrier_wait(&init_barrier);
39
+
40
+ for(;;) {
41
+ struct io_uring_cqe *cqe;
42
+ struct io_uring_sqe *sqe;
43
+ uint64_t buf;
44
+ int res;
45
+
46
+ sqe = io_uring_get_sqe(&ring);
47
+ assert(sqe);
48
+
49
+ io_uring_prep_read(sqe, sleep_fd, &buf, sizeof(buf), 0);
50
+
51
+ res = io_uring_submit_and_wait(&ring, 1);
52
+ if (res < 0)
53
+ err(EXIT_FAILURE, "io_uring_submit_and_wait failed");
54
+
55
+ res = io_uring_peek_cqe(&ring, &cqe);
56
+ assert(!res);
57
+ if (cqe->res < 0) {
58
+ errno = -cqe->res;
59
+ err(EXIT_FAILURE, "read failed");
60
+ }
61
+ assert(cqe->res == sizeof(buf));
62
+
63
+ sem_post(&sem);
64
+
65
+ io_uring_cqe_seen(&ring, cqe);
66
+ }
67
+
68
+ return NULL;
69
+ }
70
+
71
+ int main(int argc, char *argv[])
72
+ {
73
+ int res, fds[2], i, cpus;
74
+ const uint64_t n = 0x42;
75
+
76
+ if (argc > 1)
77
+ return T_EXIT_SKIP;
78
+
79
+ cpus = get_nprocs();
80
+ res = pthread_barrier_init(&init_barrier, NULL, cpus);
81
+ if (res)
82
+ err(EXIT_FAILURE, "pthread_barrier_init failed");
83
+
84
+ res = sem_init(&sem, 0, 0);
85
+ if (res)
86
+ err(EXIT_FAILURE, "sem_init failed");
87
+
88
+ threads = t_malloc(sizeof(pthread_t) * cpus);
89
+
90
+ res = pipe(fds);
91
+ if (res)
92
+ err(EXIT_FAILURE, "pipe failed");
93
+
94
+ sleep_fd = fds[0];
95
+ notify_fd = fds[1];
96
+
97
+ for (i = 0; i < cpus; i++) {
98
+ errno = pthread_create(&threads[i], NULL, thread_func, NULL);
99
+ if (errno)
100
+ err(EXIT_FAILURE, "pthread_create failed");
101
+ }
102
+
103
+ // Write #cpus notifications
104
+ for (i = 0; i < cpus; i++) {
105
+ res = write(notify_fd, &n, sizeof(n));
106
+ if (res < 0)
107
+ err(EXIT_FAILURE, "write failed");
108
+ assert(res == sizeof(n));
109
+ }
110
+
111
+ // Await that all notifications were received
112
+ for (i = 0; i < cpus; i++)
113
+ sem_wait(&sem);
114
+
115
+ // Exit without resource cleanup
116
+ exit(EXIT_SUCCESS);
117
+ }
@@ -0,0 +1,202 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: basic fadvise test
4
+ */
5
+ #include <errno.h>
6
+ #include <stdio.h>
7
+ #include <unistd.h>
8
+ #include <stdlib.h>
9
+ #include <string.h>
10
+ #include <fcntl.h>
11
+ #include <sys/types.h>
12
+ #include <sys/time.h>
13
+
14
+ #include "helpers.h"
15
+ #include "liburing.h"
16
+
17
+ #define FILE_SIZE (128 * 1024)
18
+ #define LOOPS 100
19
+ #define MIN_LOOPS 10
20
+
21
+ static unsigned long long utime_since(const struct timeval *s,
22
+ const struct timeval *e)
23
+ {
24
+ long long sec, usec;
25
+
26
+ sec = e->tv_sec - s->tv_sec;
27
+ usec = (e->tv_usec - s->tv_usec);
28
+ if (sec > 0 && usec < 0) {
29
+ sec--;
30
+ usec += 1000000;
31
+ }
32
+
33
+ sec *= 1000000;
34
+ return sec + usec;
35
+ }
36
+
37
+ static unsigned long long utime_since_now(struct timeval *tv)
38
+ {
39
+ struct timeval end;
40
+
41
+ gettimeofday(&end, NULL);
42
+ return utime_since(tv, &end);
43
+ }
44
+
45
+ static int do_fadvise(struct io_uring *ring, int fd, off_t offset, off_t len,
46
+ int advice)
47
+ {
48
+ struct io_uring_sqe *sqe;
49
+ struct io_uring_cqe *cqe;
50
+ int ret;
51
+
52
+ sqe = io_uring_get_sqe(ring);
53
+ if (!sqe) {
54
+ fprintf(stderr, "failed to get sqe\n");
55
+ return 1;
56
+ }
57
+
58
+ io_uring_prep_fadvise(sqe, fd, offset, len, advice);
59
+ sqe->user_data = advice;
60
+ ret = io_uring_submit_and_wait(ring, 1);
61
+ if (ret != 1) {
62
+ fprintf(stderr, "submit: %d\n", ret);
63
+ return 1;
64
+ }
65
+
66
+ ret = io_uring_wait_cqe(ring, &cqe);
67
+ if (ret) {
68
+ fprintf(stderr, "wait: %d\n", ret);
69
+ return 1;
70
+ }
71
+
72
+ ret = cqe->res;
73
+ if (ret == -EINVAL || ret == -EBADF) {
74
+ fprintf(stdout, "Fadvise not supported, skipping\n");
75
+ unlink(".fadvise.tmp");
76
+ exit(T_EXIT_SKIP);
77
+ } else if (ret) {
78
+ fprintf(stderr, "cqe->res=%d\n", cqe->res);
79
+ }
80
+ io_uring_cqe_seen(ring, cqe);
81
+ return ret;
82
+ }
83
+
84
+ static long do_read(int fd, char *buf)
85
+ {
86
+ struct timeval tv;
87
+ int ret;
88
+ long t;
89
+
90
+ ret = lseek(fd, 0, SEEK_SET);
91
+ if (ret) {
92
+ perror("lseek");
93
+ return -1;
94
+ }
95
+
96
+ gettimeofday(&tv, NULL);
97
+ ret = read(fd, buf, FILE_SIZE);
98
+ t = utime_since_now(&tv);
99
+ if (ret < 0) {
100
+ perror("read");
101
+ return -1;
102
+ } else if (ret != FILE_SIZE) {
103
+ fprintf(stderr, "short read1: %d\n", ret);
104
+ return -1;
105
+ }
106
+
107
+ return t;
108
+ }
109
+
110
+ static int test_fadvise(struct io_uring *ring, const char *filename)
111
+ {
112
+ unsigned long cached_read, uncached_read, cached_read2;
113
+ int fd, ret;
114
+ char *buf;
115
+
116
+ fd = open(filename, O_RDONLY);
117
+ if (fd < 0) {
118
+ perror("open");
119
+ return 1;
120
+ }
121
+
122
+ buf = t_malloc(FILE_SIZE);
123
+
124
+ cached_read = do_read(fd, buf);
125
+ if (cached_read == -1)
126
+ return 1;
127
+
128
+ ret = do_fadvise(ring, fd, 0, FILE_SIZE, POSIX_FADV_DONTNEED);
129
+ if (ret)
130
+ return 1;
131
+
132
+ uncached_read = do_read(fd, buf);
133
+ if (uncached_read == -1)
134
+ return 1;
135
+
136
+ ret = do_fadvise(ring, fd, 0, FILE_SIZE, POSIX_FADV_DONTNEED);
137
+ if (ret)
138
+ return 1;
139
+
140
+ ret = do_fadvise(ring, fd, 0, FILE_SIZE, POSIX_FADV_WILLNEED);
141
+ if (ret)
142
+ return 1;
143
+
144
+ fsync(fd);
145
+
146
+ cached_read2 = do_read(fd, buf);
147
+ if (cached_read2 == -1)
148
+ return 1;
149
+
150
+ if (cached_read < uncached_read &&
151
+ cached_read2 < uncached_read)
152
+ return 0;
153
+
154
+ return 2;
155
+ }
156
+
157
+ int main(int argc, char *argv[])
158
+ {
159
+ struct io_uring ring;
160
+ int ret, i, good, bad;
161
+ char *fname;
162
+
163
+ if (argc > 1) {
164
+ fname = argv[1];
165
+ } else {
166
+ fname = ".fadvise.tmp";
167
+ t_create_file(fname, FILE_SIZE);
168
+ }
169
+ if (io_uring_queue_init(8, &ring, 0)) {
170
+ fprintf(stderr, "ring creation failed\n");
171
+ goto err;
172
+ }
173
+
174
+ good = bad = 0;
175
+ for (i = 0; i < LOOPS; i++) {
176
+ ret = test_fadvise(&ring, fname);
177
+ if (ret == 1) {
178
+ fprintf(stderr, "read_fadvise failed\n");
179
+ goto err;
180
+ } else if (!ret)
181
+ good++;
182
+ else if (ret == 2)
183
+ bad++;
184
+ if (i >= MIN_LOOPS && !bad)
185
+ break;
186
+ }
187
+
188
+ /* too hard to reliably test, just ignore */
189
+ if ((0) && bad > good) {
190
+ fprintf(stderr, "Suspicious timings\n");
191
+ goto err;
192
+ }
193
+
194
+ if (fname != argv[1])
195
+ unlink(fname);
196
+ io_uring_queue_exit(&ring);
197
+ return T_EXIT_PASS;
198
+ err:
199
+ if (fname != argv[1])
200
+ unlink(fname);
201
+ return T_EXIT_FAIL;
202
+ }