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.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/workflows/test.yml +35 -0
  4. data/.gitignore +59 -0
  5. data/.gitmodules +3 -0
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +21 -0
  9. data/README.md +11 -0
  10. data/Rakefile +39 -0
  11. data/TODO.md +0 -0
  12. data/examples/echo_server.rb +52 -0
  13. data/examples/event_loop.rb +69 -0
  14. data/examples/fibers.rb +105 -0
  15. data/examples/http_server.rb +56 -0
  16. data/examples/http_server_multishot.rb +57 -0
  17. data/examples/http_server_simpler.rb +34 -0
  18. data/ext/um/extconf.rb +71 -0
  19. data/ext/um/iou.h +101 -0
  20. data/ext/um/op_ctx.c +138 -0
  21. data/ext/um/ring.c +755 -0
  22. data/ext/um/um.c +267 -0
  23. data/ext/um/um.h +97 -0
  24. data/ext/um/um_class.c +175 -0
  25. data/ext/um/um_ext.c +11 -0
  26. data/ext/um/um_op.c +87 -0
  27. data/ext/um/um_utils.c +23 -0
  28. data/lib/uringmachine/version.rb +3 -0
  29. data/lib/uringmachine.rb +8 -0
  30. data/test/helper.rb +70 -0
  31. data/test/test_iou.rb +876 -0
  32. data/test/test_um.rb +168 -0
  33. data/uringmachine.gemspec +27 -0
  34. data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
  35. data/vendor/liburing/.github/pull_request_template.md +86 -0
  36. data/vendor/liburing/.github/workflows/build.yml +137 -0
  37. data/vendor/liburing/.github/workflows/codespell.yml +25 -0
  38. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  39. data/vendor/liburing/.gitignore +41 -0
  40. data/vendor/liburing/CHANGELOG +111 -0
  41. data/vendor/liburing/CITATION.cff +11 -0
  42. data/vendor/liburing/COPYING +502 -0
  43. data/vendor/liburing/COPYING.GPL +339 -0
  44. data/vendor/liburing/LICENSE +20 -0
  45. data/vendor/liburing/Makefile +96 -0
  46. data/vendor/liburing/Makefile.common +7 -0
  47. data/vendor/liburing/Makefile.quiet +11 -0
  48. data/vendor/liburing/README +106 -0
  49. data/vendor/liburing/SECURITY.md +6 -0
  50. data/vendor/liburing/configure +624 -0
  51. data/vendor/liburing/debian/README.Debian +7 -0
  52. data/vendor/liburing/debian/changelog +38 -0
  53. data/vendor/liburing/debian/control +39 -0
  54. data/vendor/liburing/debian/copyright +49 -0
  55. data/vendor/liburing/debian/liburing-dev.install +4 -0
  56. data/vendor/liburing/debian/liburing-dev.manpages +5 -0
  57. data/vendor/liburing/debian/liburing2.install +1 -0
  58. data/vendor/liburing/debian/liburing2.symbols +56 -0
  59. data/vendor/liburing/debian/patches/series +1 -0
  60. data/vendor/liburing/debian/rules +29 -0
  61. data/vendor/liburing/debian/source/format +1 -0
  62. data/vendor/liburing/debian/source/local-options +2 -0
  63. data/vendor/liburing/debian/source/options +1 -0
  64. data/vendor/liburing/debian/watch +3 -0
  65. data/vendor/liburing/examples/Makefile +53 -0
  66. data/vendor/liburing/examples/helpers.c +62 -0
  67. data/vendor/liburing/examples/helpers.h +7 -0
  68. data/vendor/liburing/examples/io_uring-close-test.c +123 -0
  69. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  70. data/vendor/liburing/examples/io_uring-test.c +112 -0
  71. data/vendor/liburing/examples/io_uring-udp.c +403 -0
  72. data/vendor/liburing/examples/link-cp.c +193 -0
  73. data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
  74. data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
  75. data/vendor/liburing/examples/poll-bench.c +101 -0
  76. data/vendor/liburing/examples/proxy.c +2461 -0
  77. data/vendor/liburing/examples/proxy.h +102 -0
  78. data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
  79. data/vendor/liburing/examples/send-zerocopy.c +658 -0
  80. data/vendor/liburing/examples/ucontext-cp.c +258 -0
  81. data/vendor/liburing/liburing-ffi.pc.in +12 -0
  82. data/vendor/liburing/liburing.pc.in +12 -0
  83. data/vendor/liburing/liburing.spec +66 -0
  84. data/vendor/liburing/make-debs.sh +55 -0
  85. data/vendor/liburing/src/Makefile +129 -0
  86. data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
  87. data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
  88. data/vendor/liburing/src/arch/generic/lib.h +17 -0
  89. data/vendor/liburing/src/arch/generic/syscall.h +100 -0
  90. data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
  91. data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
  92. data/vendor/liburing/src/arch/syscall-defs.h +94 -0
  93. data/vendor/liburing/src/arch/x86/lib.h +11 -0
  94. data/vendor/liburing/src/arch/x86/syscall.h +296 -0
  95. data/vendor/liburing/src/ffi.c +15 -0
  96. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  97. data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
  98. data/vendor/liburing/src/include/liburing.h +1602 -0
  99. data/vendor/liburing/src/int_flags.h +11 -0
  100. data/vendor/liburing/src/lib.h +52 -0
  101. data/vendor/liburing/src/liburing-ffi.map +211 -0
  102. data/vendor/liburing/src/liburing.map +104 -0
  103. data/vendor/liburing/src/nolibc.c +55 -0
  104. data/vendor/liburing/src/queue.c +468 -0
  105. data/vendor/liburing/src/register.c +374 -0
  106. data/vendor/liburing/src/setup.c +689 -0
  107. data/vendor/liburing/src/setup.h +9 -0
  108. data/vendor/liburing/src/syscall.c +29 -0
  109. data/vendor/liburing/src/syscall.h +53 -0
  110. data/vendor/liburing/src/version.c +21 -0
  111. data/vendor/liburing/test/232c93d07b74.c +305 -0
  112. data/vendor/liburing/test/35fa71a030ca.c +329 -0
  113. data/vendor/liburing/test/500f9fbadef8.c +91 -0
  114. data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
  115. data/vendor/liburing/test/8a9973408177.c +107 -0
  116. data/vendor/liburing/test/917257daa0fe.c +54 -0
  117. data/vendor/liburing/test/Makefile +297 -0
  118. data/vendor/liburing/test/a0908ae19763.c +59 -0
  119. data/vendor/liburing/test/a4c0b3decb33.c +181 -0
  120. data/vendor/liburing/test/accept-link.c +255 -0
  121. data/vendor/liburing/test/accept-non-empty.c +256 -0
  122. data/vendor/liburing/test/accept-reuse.c +163 -0
  123. data/vendor/liburing/test/accept-test.c +83 -0
  124. data/vendor/liburing/test/accept.c +919 -0
  125. data/vendor/liburing/test/across-fork.c +284 -0
  126. data/vendor/liburing/test/b19062a56726.c +54 -0
  127. data/vendor/liburing/test/b5837bd5311d.c +78 -0
  128. data/vendor/liburing/test/bind-listen.c +408 -0
  129. data/vendor/liburing/test/buf-ring-nommap.c +123 -0
  130. data/vendor/liburing/test/buf-ring-put.c +83 -0
  131. data/vendor/liburing/test/buf-ring.c +473 -0
  132. data/vendor/liburing/test/ce593a6c480a.c +139 -0
  133. data/vendor/liburing/test/close-opath.c +123 -0
  134. data/vendor/liburing/test/config +14 -0
  135. data/vendor/liburing/test/connect-rep.c +204 -0
  136. data/vendor/liburing/test/connect.c +442 -0
  137. data/vendor/liburing/test/coredump.c +60 -0
  138. data/vendor/liburing/test/cq-full.c +97 -0
  139. data/vendor/liburing/test/cq-overflow.c +530 -0
  140. data/vendor/liburing/test/cq-peek-batch.c +103 -0
  141. data/vendor/liburing/test/cq-ready.c +95 -0
  142. data/vendor/liburing/test/cq-size.c +65 -0
  143. data/vendor/liburing/test/d4ae271dfaae.c +96 -0
  144. data/vendor/liburing/test/d77a67ed5f27.c +65 -0
  145. data/vendor/liburing/test/defer-taskrun.c +391 -0
  146. data/vendor/liburing/test/defer-tw-timeout.c +173 -0
  147. data/vendor/liburing/test/defer.c +319 -0
  148. data/vendor/liburing/test/double-poll-crash.c +195 -0
  149. data/vendor/liburing/test/drop-submit.c +94 -0
  150. data/vendor/liburing/test/eeed8b54e0df.c +120 -0
  151. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  152. data/vendor/liburing/test/eploop.c +74 -0
  153. data/vendor/liburing/test/eventfd-disable.c +179 -0
  154. data/vendor/liburing/test/eventfd-reg.c +77 -0
  155. data/vendor/liburing/test/eventfd-ring.c +98 -0
  156. data/vendor/liburing/test/eventfd.c +113 -0
  157. data/vendor/liburing/test/evloop.c +73 -0
  158. data/vendor/liburing/test/exec-target.c +6 -0
  159. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  160. data/vendor/liburing/test/fadvise.c +202 -0
  161. data/vendor/liburing/test/fallocate.c +265 -0
  162. data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
  163. data/vendor/liburing/test/fd-install.c +500 -0
  164. data/vendor/liburing/test/fd-pass.c +237 -0
  165. data/vendor/liburing/test/fdinfo.c +419 -0
  166. data/vendor/liburing/test/file-register.c +1189 -0
  167. data/vendor/liburing/test/file-update.c +231 -0
  168. data/vendor/liburing/test/file-verify.c +654 -0
  169. data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
  170. data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
  171. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  172. data/vendor/liburing/test/fixed-buf-merge.c +101 -0
  173. data/vendor/liburing/test/fixed-hugepage.c +411 -0
  174. data/vendor/liburing/test/fixed-link.c +90 -0
  175. data/vendor/liburing/test/fixed-reuse.c +160 -0
  176. data/vendor/liburing/test/fpos.c +255 -0
  177. data/vendor/liburing/test/fsnotify.c +118 -0
  178. data/vendor/liburing/test/fsync.c +224 -0
  179. data/vendor/liburing/test/futex.c +571 -0
  180. data/vendor/liburing/test/hardlink.c +170 -0
  181. data/vendor/liburing/test/helpers.c +318 -0
  182. data/vendor/liburing/test/helpers.h +108 -0
  183. data/vendor/liburing/test/ignore-single-mmap.c +48 -0
  184. data/vendor/liburing/test/init-mem.c +164 -0
  185. data/vendor/liburing/test/io-cancel.c +561 -0
  186. data/vendor/liburing/test/io_uring_enter.c +264 -0
  187. data/vendor/liburing/test/io_uring_passthrough.c +482 -0
  188. data/vendor/liburing/test/io_uring_register.c +503 -0
  189. data/vendor/liburing/test/io_uring_setup.c +110 -0
  190. data/vendor/liburing/test/iopoll-leak.c +85 -0
  191. data/vendor/liburing/test/iopoll-overflow.c +118 -0
  192. data/vendor/liburing/test/iopoll.c +465 -0
  193. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  194. data/vendor/liburing/test/lfs-openat.c +273 -0
  195. data/vendor/liburing/test/link-timeout.c +1108 -0
  196. data/vendor/liburing/test/link.c +497 -0
  197. data/vendor/liburing/test/link_drain.c +255 -0
  198. data/vendor/liburing/test/madvise.c +195 -0
  199. data/vendor/liburing/test/min-timeout-wait.c +354 -0
  200. data/vendor/liburing/test/min-timeout.c +233 -0
  201. data/vendor/liburing/test/mkdir.c +112 -0
  202. data/vendor/liburing/test/msg-ring-fd.c +331 -0
  203. data/vendor/liburing/test/msg-ring-flags.c +212 -0
  204. data/vendor/liburing/test/msg-ring-overflow.c +159 -0
  205. data/vendor/liburing/test/msg-ring.c +467 -0
  206. data/vendor/liburing/test/multicqes_drain.c +429 -0
  207. data/vendor/liburing/test/napi-test.c +215 -0
  208. data/vendor/liburing/test/napi-test.sh +48 -0
  209. data/vendor/liburing/test/no-mmap-inval.c +42 -0
  210. data/vendor/liburing/test/nolibc.c +62 -0
  211. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  212. data/vendor/liburing/test/nop.c +177 -0
  213. data/vendor/liburing/test/nvme.h +169 -0
  214. data/vendor/liburing/test/ooo-file-unreg.c +82 -0
  215. data/vendor/liburing/test/open-close.c +261 -0
  216. data/vendor/liburing/test/open-direct-link.c +188 -0
  217. data/vendor/liburing/test/open-direct-pick.c +180 -0
  218. data/vendor/liburing/test/openat2.c +312 -0
  219. data/vendor/liburing/test/personality.c +204 -0
  220. data/vendor/liburing/test/pipe-bug.c +95 -0
  221. data/vendor/liburing/test/pipe-eof.c +83 -0
  222. data/vendor/liburing/test/pipe-reuse.c +105 -0
  223. data/vendor/liburing/test/poll-cancel-all.c +496 -0
  224. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  225. data/vendor/liburing/test/poll-cancel.c +228 -0
  226. data/vendor/liburing/test/poll-link.c +221 -0
  227. data/vendor/liburing/test/poll-many.c +230 -0
  228. data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
  229. data/vendor/liburing/test/poll-mshot-update.c +323 -0
  230. data/vendor/liburing/test/poll-race-mshot.c +276 -0
  231. data/vendor/liburing/test/poll-race.c +105 -0
  232. data/vendor/liburing/test/poll-ring.c +48 -0
  233. data/vendor/liburing/test/poll-v-poll.c +353 -0
  234. data/vendor/liburing/test/poll.c +327 -0
  235. data/vendor/liburing/test/probe.c +135 -0
  236. data/vendor/liburing/test/read-before-exit.c +129 -0
  237. data/vendor/liburing/test/read-mshot-empty.c +153 -0
  238. data/vendor/liburing/test/read-mshot.c +404 -0
  239. data/vendor/liburing/test/read-write.c +1013 -0
  240. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  241. data/vendor/liburing/test/recv-msgall.c +263 -0
  242. data/vendor/liburing/test/recv-multishot.c +602 -0
  243. data/vendor/liburing/test/recvsend_bundle.c +691 -0
  244. data/vendor/liburing/test/reg-fd-only.c +131 -0
  245. data/vendor/liburing/test/reg-hint.c +56 -0
  246. data/vendor/liburing/test/reg-reg-ring.c +90 -0
  247. data/vendor/liburing/test/regbuf-merge.c +91 -0
  248. data/vendor/liburing/test/register-restrictions.c +633 -0
  249. data/vendor/liburing/test/rename.c +132 -0
  250. data/vendor/liburing/test/ring-leak.c +283 -0
  251. data/vendor/liburing/test/ring-leak2.c +249 -0
  252. data/vendor/liburing/test/ringbuf-read.c +196 -0
  253. data/vendor/liburing/test/ringbuf-status.c +242 -0
  254. data/vendor/liburing/test/rsrc_tags.c +461 -0
  255. data/vendor/liburing/test/runtests-loop.sh +16 -0
  256. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  257. data/vendor/liburing/test/runtests.sh +168 -0
  258. data/vendor/liburing/test/rw_merge_test.c +98 -0
  259. data/vendor/liburing/test/self.c +91 -0
  260. data/vendor/liburing/test/send-zerocopy.c +971 -0
  261. data/vendor/liburing/test/send_recv.c +412 -0
  262. data/vendor/liburing/test/send_recvmsg.c +444 -0
  263. data/vendor/liburing/test/shared-wq.c +84 -0
  264. data/vendor/liburing/test/short-read.c +75 -0
  265. data/vendor/liburing/test/shutdown.c +165 -0
  266. data/vendor/liburing/test/sigfd-deadlock.c +88 -0
  267. data/vendor/liburing/test/single-issuer.c +169 -0
  268. data/vendor/liburing/test/skip-cqe.c +428 -0
  269. data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
  270. data/vendor/liburing/test/socket-io-cmd.c +237 -0
  271. data/vendor/liburing/test/socket-rw-eagain.c +149 -0
  272. data/vendor/liburing/test/socket-rw-offset.c +149 -0
  273. data/vendor/liburing/test/socket-rw.c +137 -0
  274. data/vendor/liburing/test/socket.c +408 -0
  275. data/vendor/liburing/test/splice.c +512 -0
  276. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  277. data/vendor/liburing/test/sq-full.c +45 -0
  278. data/vendor/liburing/test/sq-poll-dup.c +211 -0
  279. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  280. data/vendor/liburing/test/sq-poll-share.c +138 -0
  281. data/vendor/liburing/test/sq-space_left.c +159 -0
  282. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  283. data/vendor/liburing/test/sqpoll-exec.c +132 -0
  284. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  285. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  286. data/vendor/liburing/test/statx.c +172 -0
  287. data/vendor/liburing/test/stdout.c +232 -0
  288. data/vendor/liburing/test/submit-and-wait.c +108 -0
  289. data/vendor/liburing/test/submit-link-fail.c +156 -0
  290. data/vendor/liburing/test/submit-reuse.c +237 -0
  291. data/vendor/liburing/test/symlink.c +117 -0
  292. data/vendor/liburing/test/sync-cancel.c +235 -0
  293. data/vendor/liburing/test/teardowns.c +58 -0
  294. data/vendor/liburing/test/test.h +36 -0
  295. data/vendor/liburing/test/thread-exit.c +143 -0
  296. data/vendor/liburing/test/timeout-new.c +256 -0
  297. data/vendor/liburing/test/timeout.c +1798 -0
  298. data/vendor/liburing/test/truncate.c +186 -0
  299. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  300. data/vendor/liburing/test/unlink.c +112 -0
  301. data/vendor/liburing/test/version.c +25 -0
  302. data/vendor/liburing/test/wait-timeout.c +287 -0
  303. data/vendor/liburing/test/waitid.c +373 -0
  304. data/vendor/liburing/test/wakeup-hang.c +162 -0
  305. data/vendor/liburing/test/wq-aff.c +146 -0
  306. data/vendor/liburing/test/xattr.c +442 -0
  307. metadata +412 -0
@@ -0,0 +1,135 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test IORING_REGISTER_PROBE
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
+
12
+ #include "helpers.h"
13
+ #include "liburing.h"
14
+
15
+ static int no_probe;
16
+
17
+ static int verify_probe(struct io_uring_probe *p, int full)
18
+ {
19
+ if (!full && p->ops_len) {
20
+ fprintf(stderr, "Got ops_len=%u\n", p->ops_len);
21
+ return 1;
22
+ }
23
+ if (!p->last_op) {
24
+ fprintf(stderr, "Got last_op=%u\n", p->last_op);
25
+ return 1;
26
+ }
27
+ if (!full)
28
+ return 0;
29
+ /* check a few ops that must be supported */
30
+ if (!(p->ops[IORING_OP_NOP].flags & IO_URING_OP_SUPPORTED)) {
31
+ fprintf(stderr, "NOP not supported!?\n");
32
+ return 1;
33
+ }
34
+ if (!(p->ops[IORING_OP_READV].flags & IO_URING_OP_SUPPORTED)) {
35
+ fprintf(stderr, "READV not supported!?\n");
36
+ return 1;
37
+ }
38
+ if (!(p->ops[IORING_OP_WRITE].flags & IO_URING_OP_SUPPORTED)) {
39
+ fprintf(stderr, "WRITE not supported!?\n");
40
+ return 1;
41
+ }
42
+
43
+ return 0;
44
+ }
45
+
46
+ static int test_probe_helper(struct io_uring *ring)
47
+ {
48
+ int ret;
49
+ struct io_uring_probe *p;
50
+
51
+ p = io_uring_get_probe_ring(ring);
52
+ if (!p) {
53
+ fprintf(stderr, "Failed getting probe data\n");
54
+ return 1;
55
+ }
56
+
57
+ ret = verify_probe(p, 1);
58
+ io_uring_free_probe(p);
59
+ return ret;
60
+ }
61
+
62
+ static int test_probe(struct io_uring *ring)
63
+ {
64
+ struct io_uring_probe *p;
65
+ size_t len;
66
+ int ret;
67
+
68
+ len = sizeof(*p) + 256 * sizeof(struct io_uring_probe_op);
69
+ p = t_calloc(1, len);
70
+ ret = io_uring_register_probe(ring, p, 0);
71
+ if (ret == -EINVAL) {
72
+ fprintf(stdout, "Probe not supported, skipping\n");
73
+ no_probe = 1;
74
+ goto out;
75
+ } else if (ret) {
76
+ fprintf(stdout, "Probe returned %d\n", ret);
77
+ goto err;
78
+ }
79
+
80
+ if (verify_probe(p, 0))
81
+ goto err;
82
+
83
+ /* now grab for all entries */
84
+ memset(p, 0, len);
85
+ ret = io_uring_register_probe(ring, p, 256);
86
+ if (ret == -EINVAL) {
87
+ fprintf(stdout, "Probe not supported, skipping\n");
88
+ goto err;
89
+ } else if (ret) {
90
+ fprintf(stdout, "Probe returned %d\n", ret);
91
+ goto err;
92
+ }
93
+
94
+ if (verify_probe(p, 1))
95
+ goto err;
96
+
97
+ out:
98
+ free(p);
99
+ return 0;
100
+ err:
101
+ free(p);
102
+ return 1;
103
+ }
104
+
105
+ int main(int argc, char *argv[])
106
+ {
107
+ struct io_uring ring;
108
+ int ret;
109
+
110
+ if (argc > 1)
111
+ return 0;
112
+
113
+ ret = io_uring_queue_init(8, &ring, 0);
114
+ if (ret) {
115
+ fprintf(stderr, "ring setup failed\n");
116
+ return 1;
117
+ }
118
+
119
+ ret = test_probe(&ring);
120
+ if (ret) {
121
+ fprintf(stderr, "test_probe failed\n");
122
+ return ret;
123
+ }
124
+ if (no_probe)
125
+ return 0;
126
+
127
+ ret = test_probe_helper(&ring);
128
+ if (ret) {
129
+ fprintf(stderr, "test_probe failed\n");
130
+ return ret;
131
+ }
132
+
133
+
134
+ return 0;
135
+ }
@@ -0,0 +1,129 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test if issuing IO from thread and immediately exiting will
4
+ * proceed correctly.
5
+ *
6
+ * Original test case from: https://github.com/axboe/liburing/issues/582
7
+ */
8
+ #include <unistd.h>
9
+ #include <pthread.h>
10
+ #include <sys/timerfd.h>
11
+ #include <string.h>
12
+ #include <stdio.h>
13
+
14
+ #include "liburing.h"
15
+ #include "helpers.h"
16
+
17
+ static int no_iopoll;
18
+
19
+ struct data {
20
+ struct io_uring *ring;
21
+ int timer_fd1;
22
+ int timer_fd2;
23
+ uint64_t buf1;
24
+ uint64_t buf2;
25
+ };
26
+
27
+ static void *submit(void *data)
28
+ {
29
+ struct io_uring_sqe *sqe;
30
+ struct data *d = data;
31
+ int ret;
32
+
33
+ sqe = io_uring_get_sqe(d->ring);
34
+ io_uring_prep_read(sqe, d->timer_fd1, &d->buf1, sizeof(d->buf1), 0);
35
+
36
+ sqe = io_uring_get_sqe(d->ring);
37
+ io_uring_prep_read(sqe, d->timer_fd2, &d->buf2, sizeof(d->buf2), 0);
38
+
39
+ ret = io_uring_submit(d->ring);
40
+ if (ret != 2) {
41
+ struct io_uring_cqe *cqe;
42
+
43
+ /*
44
+ * Kernels without submit-all-on-error behavior will
45
+ * fail submitting all, check if that's the case and
46
+ * don't error
47
+ */
48
+ ret = io_uring_peek_cqe(d->ring, &cqe);
49
+ if (!ret && cqe->res == -EOPNOTSUPP) {
50
+ no_iopoll = 1;
51
+ return NULL;
52
+ }
53
+ return (void *) (uintptr_t) 1;
54
+ }
55
+
56
+ /* Exit suddenly. */
57
+ return NULL;
58
+ }
59
+
60
+ static int test(int flags)
61
+ {
62
+ struct io_uring_params params = { .flags = flags, };
63
+ struct io_uring ring;
64
+ struct data d = { .ring = &ring, };
65
+ pthread_t thread;
66
+ void *res;
67
+ int ret;
68
+
69
+ ret = t_create_ring_params(8, &ring, &params);
70
+ if (ret == T_SETUP_SKIP)
71
+ return 0;
72
+ else if (ret != T_SETUP_OK)
73
+ return 1;
74
+
75
+ d.timer_fd1 = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
76
+ if (d.timer_fd1 < 0) {
77
+ perror("timerfd_create");
78
+ return 1;
79
+ }
80
+ d.timer_fd2 = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
81
+ if (d.timer_fd2 < 0) {
82
+ perror("timerfd_create");
83
+ return 1;
84
+ }
85
+
86
+ pthread_create(&thread, NULL, submit, &d);
87
+ pthread_join(thread, &res);
88
+
89
+ /** Wait for completions and do stuff ... **/
90
+
91
+ io_uring_queue_exit(&ring);
92
+
93
+ close(d.timer_fd1);
94
+ close(d.timer_fd2);
95
+ return !!res;
96
+ }
97
+
98
+ int main(int argc, char *argv[])
99
+ {
100
+ int ret, i;
101
+
102
+ for (i = 0; i < 1000; i++) {
103
+ ret = test(0);
104
+ if (ret) {
105
+ fprintf(stderr, "Test failed\n");
106
+ return ret;
107
+ }
108
+ }
109
+
110
+ for (i = 0; i < 1000; i++) {
111
+ ret = test(IORING_SETUP_IOPOLL);
112
+ if (ret) {
113
+ fprintf(stderr, "Test IOPOLL failed loop %d\n", ret);
114
+ return ret;
115
+ }
116
+ if (no_iopoll)
117
+ break;
118
+ }
119
+
120
+ for (i = 0; i < 100; i++) {
121
+ ret = test(IORING_SETUP_SQPOLL);
122
+ if (ret) {
123
+ fprintf(stderr, "Test SQPOLL failed\n");
124
+ return ret;
125
+ }
126
+ }
127
+
128
+ return 0;
129
+ }
@@ -0,0 +1,153 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test that multishot read correctly keeps reading until all
4
+ * data has been emptied. the original implementation failed
5
+ * to do so, if the available buffer size was less than what
6
+ * was available, hence requiring multiple reads to empty the
7
+ * file buffer.
8
+ */
9
+ #include <stdio.h>
10
+ #include <unistd.h>
11
+ #include <stdlib.h>
12
+ #include <string.h>
13
+ #include <assert.h>
14
+ #include <pthread.h>
15
+ #include <sys/time.h>
16
+
17
+ #include "liburing.h"
18
+ #include "helpers.h"
19
+
20
+ #define BGID 17
21
+ #define NR_BUFS 4
22
+ #define BR_MASK (NR_BUFS - 1)
23
+ #define BUF_SIZE 32
24
+
25
+ static int do_write(int fd, void *buf, int buf_size)
26
+ {
27
+ int ret;
28
+
29
+ ret = write(fd, buf, buf_size);
30
+ if (ret < 0) {
31
+ perror("write");
32
+ return 0;
33
+ } else if (ret != buf_size) {
34
+ fprintf(stderr, "bad write size %d\n", ret);
35
+ return 0;
36
+ }
37
+
38
+ return 1;
39
+ }
40
+
41
+ static void *thread_fn(void *data)
42
+ {
43
+ char w1[BUF_SIZE], w2[BUF_SIZE];
44
+ int *fds = data;
45
+
46
+ memset(w1, 0x11, BUF_SIZE);
47
+ memset(w2, 0x22, BUF_SIZE);
48
+
49
+ if (!do_write(fds[1], w1, BUF_SIZE))
50
+ return NULL;
51
+ if (!do_write(fds[1], w2, BUF_SIZE))
52
+ return NULL;
53
+
54
+ usleep(100000);
55
+
56
+ if (!do_write(fds[1], w1, BUF_SIZE))
57
+ return NULL;
58
+ if (!do_write(fds[1], w2, BUF_SIZE))
59
+ return NULL;
60
+
61
+ return NULL;
62
+ }
63
+
64
+ int main(int argc, char *argv[])
65
+ {
66
+ struct io_uring_buf_ring *br;
67
+ struct io_uring_sqe *sqe;
68
+ struct io_uring_cqe *cqe;
69
+ struct io_uring ring;
70
+ pthread_t thread;
71
+ int i, ret, fds[2];
72
+ void *buf, *tret;
73
+
74
+ if (argc > 1)
75
+ return T_EXIT_SKIP;
76
+
77
+ if (pipe(fds) < 0) {
78
+ perror("pipe");
79
+ return T_EXIT_FAIL;
80
+ }
81
+
82
+ ret = io_uring_queue_init(8, &ring, 0);
83
+ if (ret) {
84
+ fprintf(stderr, "queue_init: %d\n", ret);
85
+ return T_EXIT_FAIL;
86
+ }
87
+
88
+ br = io_uring_setup_buf_ring(&ring, NR_BUFS, BGID, 0, &ret);
89
+ if (!br) {
90
+ if (ret == -EINVAL)
91
+ return T_EXIT_SKIP;
92
+ fprintf(stderr, "failed buffer ring %d\n", ret);
93
+ return T_EXIT_FAIL;
94
+ }
95
+
96
+ buf = malloc(NR_BUFS * BUF_SIZE);
97
+ for (i = 0; i < NR_BUFS; i++) {
98
+ void *this_buf = buf + i * BUF_SIZE;
99
+
100
+ io_uring_buf_ring_add(br, this_buf, BUF_SIZE, i, BR_MASK, i);
101
+ }
102
+ io_uring_buf_ring_advance(br, NR_BUFS);
103
+
104
+ sqe = io_uring_get_sqe(&ring);
105
+ io_uring_prep_read_multishot(sqe, fds[0], 0, 0, BGID);
106
+
107
+ ret = io_uring_submit(&ring);
108
+ if (ret != 1) {
109
+ fprintf(stderr, "bad submit %d\n", ret);
110
+ return T_EXIT_FAIL;
111
+ }
112
+
113
+ /*
114
+ * read multishot not available would be ready as a cqe when
115
+ * submission returns, check and skip if not.
116
+ */
117
+ ret = io_uring_peek_cqe(&ring, &cqe);
118
+ if (!ret) {
119
+ if (cqe->res == -EINVAL || cqe->res == -EBADF)
120
+ return T_EXIT_SKIP;
121
+ }
122
+
123
+ pthread_create(&thread, NULL, thread_fn, fds);
124
+
125
+ for (i = 0; i < 4; i++) {
126
+ int buf_index;
127
+
128
+ ret = io_uring_wait_cqe(&ring, &cqe);
129
+ if (ret) {
130
+ fprintf(stderr, "wait %d\n", ret);
131
+ break;
132
+ }
133
+
134
+ if (cqe->res != BUF_SIZE) {
135
+ fprintf(stderr, "size %d\n", cqe->res);
136
+ return T_EXIT_FAIL;
137
+ }
138
+ if (!(cqe->flags & IORING_CQE_F_BUFFER)) {
139
+ fprintf(stderr, "buffer not set\n");
140
+ return T_EXIT_FAIL;
141
+ }
142
+ if (!(cqe->flags & IORING_CQE_F_MORE)) {
143
+ fprintf(stderr, "more not set\n");
144
+ return T_EXIT_FAIL;
145
+ }
146
+ buf_index = cqe->flags >> 16;
147
+ assert(buf_index >= 0 && buf_index <= NR_BUFS);
148
+ io_uring_cqe_seen(&ring, cqe);
149
+ }
150
+
151
+ pthread_join(thread, &tret);
152
+ return T_EXIT_PASS;
153
+ }