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,331 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test fd passing with MSG_RING
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 <pthread.h>
13
+
14
+ #include "liburing.h"
15
+ #include "helpers.h"
16
+
17
+ static int no_msg;
18
+ static int no_sparse;
19
+ static int no_fd_pass;
20
+
21
+ struct data {
22
+ pthread_t thread;
23
+ pthread_barrier_t barrier;
24
+ int ring_flags;
25
+ int ring_fd;
26
+ char buf[32];
27
+ };
28
+
29
+ static void *thread_fn(void *__data)
30
+ {
31
+ struct io_uring_sqe *sqe;
32
+ struct io_uring_cqe *cqe;
33
+ struct data *d = __data;
34
+ struct io_uring ring;
35
+ int ret, fd = -1;
36
+
37
+ io_uring_queue_init(8, &ring, d->ring_flags);
38
+ ret = io_uring_register_files(&ring, &fd, 1);
39
+ if (ret) {
40
+ if (ret != -EINVAL && ret != -EBADF)
41
+ fprintf(stderr, "thread file register: %d\n", ret);
42
+ no_sparse = 1;
43
+ pthread_barrier_wait(&d->barrier);
44
+ return NULL;
45
+ }
46
+
47
+ d->ring_fd = ring.ring_fd;
48
+ pthread_barrier_wait(&d->barrier);
49
+
50
+ /* wait for MSG */
51
+ ret = io_uring_wait_cqe(&ring, &cqe);
52
+ if (ret) {
53
+ fprintf(stderr, "wait_cqe dst: %d\n", ret);
54
+ return NULL;
55
+ }
56
+ if (cqe->res < 0) {
57
+ fprintf(stderr, "cqe error dst: %d\n", cqe->res);
58
+ return NULL;
59
+ }
60
+
61
+ fd = cqe->res;
62
+ io_uring_cqe_seen(&ring, cqe);
63
+ sqe = io_uring_get_sqe(&ring);
64
+ io_uring_prep_read(sqe, fd, d->buf, sizeof(d->buf), 0);
65
+ sqe->flags |= IOSQE_FIXED_FILE;
66
+ io_uring_submit(&ring);
67
+
68
+ ret = io_uring_wait_cqe(&ring, &cqe);
69
+ if (ret) {
70
+ fprintf(stderr, "wait_cqe dst: %d\n", ret);
71
+ return NULL;
72
+ }
73
+ if (cqe->res < 0) {
74
+ fprintf(stderr, "cqe error dst: %d\n", cqe->res);
75
+ return NULL;
76
+ }
77
+
78
+ io_uring_queue_exit(&ring);
79
+ return NULL;
80
+ }
81
+
82
+ static int test_remote(struct io_uring *src, int ring_flags)
83
+ {
84
+ struct io_uring_sqe *sqe;
85
+ struct io_uring_cqe *cqe;
86
+ int fds[2], fd, ret;
87
+ struct data d;
88
+ char buf[32];
89
+ void *tret;
90
+ int i;
91
+
92
+ if (no_fd_pass)
93
+ return 0;
94
+
95
+ pthread_barrier_init(&d.barrier, NULL, 2);
96
+ d.ring_flags = ring_flags;
97
+ pthread_create(&d.thread, NULL, thread_fn, &d);
98
+ pthread_barrier_wait(&d.barrier);
99
+ memset(d.buf, 0, sizeof(d.buf));
100
+
101
+ if (no_sparse)
102
+ return 0;
103
+
104
+ if (pipe(fds) < 0) {
105
+ perror("pipe");
106
+ return 1;
107
+ }
108
+
109
+ fd = fds[0];
110
+ ret = io_uring_register_files(src, &fd, 1);
111
+ if (ret) {
112
+ fprintf(stderr, "register files failed: %d\n", ret);
113
+ return 1;
114
+ }
115
+
116
+ for (i = 0; i < ARRAY_SIZE(buf); i++)
117
+ buf[i] = rand();
118
+
119
+ sqe = io_uring_get_sqe(src);
120
+ io_uring_prep_write(sqe, fds[1], buf, sizeof(buf), 0);
121
+ sqe->user_data = 1;
122
+
123
+ sqe = io_uring_get_sqe(src);
124
+ io_uring_prep_msg_ring_fd(sqe, d.ring_fd, 0, 0, 0, 0);
125
+ sqe->user_data = 2;
126
+
127
+ io_uring_submit(src);
128
+
129
+ for (i = 0; i < 2; i++) {
130
+ ret = io_uring_wait_cqe(src, &cqe);
131
+ if (ret) {
132
+ fprintf(stderr, "wait_cqe: %d\n", ret);
133
+ return 1;
134
+ }
135
+ if (cqe->res < 0) {
136
+ fprintf(stderr, "cqe res %d\n", cqe->res);
137
+ return 1;
138
+ }
139
+ if (cqe->user_data == 1 && cqe->res != sizeof(buf)) {
140
+ fprintf(stderr, "short write %d\n", cqe->res);
141
+ return 1;
142
+ }
143
+ io_uring_cqe_seen(src, cqe);
144
+ }
145
+
146
+ pthread_join(d.thread, &tret);
147
+
148
+ if (memcmp(buf, d.buf, sizeof(buf))) {
149
+ fprintf(stderr, "buffers differ\n");
150
+ return 1;
151
+ }
152
+
153
+ close(fds[0]);
154
+ close(fds[1]);
155
+ io_uring_unregister_files(src);
156
+ return 0;
157
+ }
158
+
159
+ static int test_local(struct io_uring *src, struct io_uring *dst)
160
+ {
161
+ struct io_uring_sqe *sqe;
162
+ struct io_uring_cqe *cqe;
163
+ int fds[2], fd, ret;
164
+ char buf[32], dst_buf[32];
165
+ int i;
166
+
167
+ if (no_fd_pass)
168
+ return 0;
169
+
170
+ fd = -1;
171
+ ret = io_uring_register_files(dst, &fd, 1);
172
+ if (ret) {
173
+ if (ret == -EBADF || ret == -EINVAL)
174
+ return 0;
175
+ fprintf(stderr, "register files failed: %d\n", ret);
176
+ return 1;
177
+ }
178
+
179
+ if (pipe(fds) < 0) {
180
+ perror("pipe");
181
+ return 1;
182
+ }
183
+
184
+ fd = fds[0];
185
+ ret = io_uring_register_files(src, &fd, 1);
186
+ if (ret) {
187
+ fprintf(stderr, "register files failed: %d\n", ret);
188
+ return 1;
189
+ }
190
+
191
+ memset(dst_buf, 0, sizeof(dst_buf));
192
+ for (i = 0; i < ARRAY_SIZE(buf); i++)
193
+ buf[i] = rand();
194
+
195
+ sqe = io_uring_get_sqe(src);
196
+ io_uring_prep_write(sqe, fds[1], buf, sizeof(buf), 0);
197
+ sqe->user_data = 1;
198
+
199
+ sqe = io_uring_get_sqe(src);
200
+ io_uring_prep_msg_ring_fd(sqe, dst->ring_fd, 0, 0, 10, 0);
201
+ sqe->user_data = 2;
202
+
203
+ io_uring_submit(src);
204
+
205
+ fd = -1;
206
+ for (i = 0; i < 2; i++) {
207
+ ret = io_uring_wait_cqe(src, &cqe);
208
+ if (ret) {
209
+ fprintf(stderr, "wait_cqe: %d\n", ret);
210
+ return 1;
211
+ }
212
+ if (cqe->user_data == 2 && cqe->res == -EINVAL) {
213
+ no_fd_pass = 1;
214
+ } else if (cqe->res < 0) {
215
+ fprintf(stderr, "cqe res %d\n", cqe->res);
216
+ return 1;
217
+ }
218
+ if (cqe->user_data == 1 && cqe->res != sizeof(buf)) {
219
+ fprintf(stderr, "short write %d\n", cqe->res);
220
+ return 1;
221
+ }
222
+ io_uring_cqe_seen(src, cqe);
223
+ }
224
+
225
+ if (no_fd_pass)
226
+ goto out;
227
+
228
+ ret = io_uring_wait_cqe(dst, &cqe);
229
+ if (ret) {
230
+ fprintf(stderr, "wait_cqe dst: %d\n", ret);
231
+ return 1;
232
+ }
233
+ if (cqe->res < 0) {
234
+ fprintf(stderr, "cqe error dst: %d\n", cqe->res);
235
+ return 1;
236
+ }
237
+
238
+ fd = cqe->res;
239
+ io_uring_cqe_seen(dst, cqe);
240
+ sqe = io_uring_get_sqe(dst);
241
+ io_uring_prep_read(sqe, fd, dst_buf, sizeof(dst_buf), 0);
242
+ sqe->flags |= IOSQE_FIXED_FILE;
243
+ sqe->user_data = 3;
244
+ io_uring_submit(dst);
245
+
246
+ ret = io_uring_wait_cqe(dst, &cqe);
247
+ if (ret) {
248
+ fprintf(stderr, "wait_cqe dst: %d\n", ret);
249
+ return 1;
250
+ }
251
+ if (cqe->res < 0) {
252
+ fprintf(stderr, "cqe error dst: %d\n", cqe->res);
253
+ return 1;
254
+ }
255
+ if (cqe->res != sizeof(dst_buf)) {
256
+ fprintf(stderr, "short read %d\n", cqe->res);
257
+ return 1;
258
+ }
259
+ if (memcmp(buf, dst_buf, sizeof(buf))) {
260
+ fprintf(stderr, "buffers differ\n");
261
+ return 1;
262
+ }
263
+
264
+ out:
265
+ close(fds[0]);
266
+ close(fds[1]);
267
+ io_uring_unregister_files(src);
268
+ io_uring_unregister_files(dst);
269
+ return 0;
270
+ }
271
+
272
+ static int test(int ring_flags)
273
+ {
274
+ struct io_uring ring, ring2;
275
+ int ret;
276
+
277
+ ret = io_uring_queue_init(8, &ring, ring_flags);
278
+ if (ret) {
279
+ if (ret == -EINVAL)
280
+ return 0;
281
+ fprintf(stderr, "ring setup failed: %d\n", ret);
282
+ return T_EXIT_FAIL;
283
+ }
284
+ ret = io_uring_queue_init(8, &ring2, ring_flags);
285
+ if (ret) {
286
+ fprintf(stderr, "ring setup failed: %d\n", ret);
287
+ return T_EXIT_FAIL;
288
+ }
289
+
290
+ ret = test_local(&ring, &ring2);
291
+ if (ret) {
292
+ fprintf(stderr, "test local failed\n");
293
+ return T_EXIT_FAIL;
294
+ }
295
+ if (no_msg)
296
+ return T_EXIT_SKIP;
297
+
298
+ ret = test_remote(&ring, ring_flags);
299
+ if (ret) {
300
+ fprintf(stderr, "test_remote failed\n");
301
+ return T_EXIT_FAIL;
302
+ }
303
+
304
+ io_uring_queue_exit(&ring);
305
+ io_uring_queue_exit(&ring2);
306
+ return T_EXIT_PASS;
307
+ }
308
+
309
+ int main(int argc, char *argv[])
310
+ {
311
+ int ret;
312
+
313
+ if (argc > 1)
314
+ return T_EXIT_SKIP;
315
+
316
+ ret = test(0);
317
+ if (ret != T_EXIT_PASS) {
318
+ fprintf(stderr, "ring flags 0 failed\n");
319
+ return ret;
320
+ }
321
+ if (no_msg)
322
+ return T_EXIT_SKIP;
323
+
324
+ ret = test(IORING_SETUP_SINGLE_ISSUER|IORING_SETUP_DEFER_TASKRUN);
325
+ if (ret != T_EXIT_PASS) {
326
+ fprintf(stderr, "ring flags defer failed\n");
327
+ return ret;
328
+ }
329
+
330
+ return ret;
331
+ }
@@ -0,0 +1,212 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test ring messaging with flags command
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 <pthread.h>
13
+
14
+ #include "liburing.h"
15
+ #include "helpers.h"
16
+
17
+ #define CUSTOM_FLAG 0x42
18
+ #define USER_DATA 0x5aa5
19
+ #define LEN 0x20
20
+ #define ID 0x1
21
+
22
+ struct data {
23
+ pthread_barrier_t barrier;
24
+ int fd;
25
+ };
26
+
27
+ static int recv_msg(struct io_uring *ring)
28
+ {
29
+ struct io_uring_cqe *cqe;
30
+ int ret;
31
+
32
+ ret = io_uring_wait_cqe(ring, &cqe);
33
+ if (ret) {
34
+ fprintf(stderr, "wait cqe %d\n", ret);
35
+ return T_EXIT_FAIL;
36
+ }
37
+ if (cqe->user_data != USER_DATA) {
38
+ fprintf(stderr, "user_data %llx\n", (long long) cqe->user_data);
39
+ return T_EXIT_FAIL;
40
+ }
41
+ if (cqe->res != LEN) {
42
+ fprintf(stderr, "len %x\n", cqe->res);
43
+ return T_EXIT_FAIL;
44
+ }
45
+ if (cqe->flags != CUSTOM_FLAG) {
46
+ fprintf(stderr, "flags %x\n", cqe->flags);
47
+ return T_EXIT_FAIL;
48
+ }
49
+
50
+ return T_EXIT_PASS;
51
+ }
52
+
53
+ static int send_msg(struct io_uring *ring, int target_fd)
54
+ {
55
+ struct io_uring_cqe *cqe;
56
+ struct io_uring_sqe *sqe;
57
+ int ret;
58
+
59
+ sqe = io_uring_get_sqe(ring);
60
+ if (!sqe) {
61
+ fprintf(stderr, "get sqe failed\n");
62
+ return T_EXIT_FAIL;
63
+ }
64
+
65
+ io_uring_prep_msg_ring_cqe_flags(sqe, target_fd, LEN, USER_DATA,
66
+ 0, CUSTOM_FLAG);
67
+ sqe->user_data = ID;
68
+
69
+ ret = io_uring_submit(ring);
70
+ if (ret <= 0) {
71
+ if (ret == -EINVAL)
72
+ return T_EXIT_SKIP;
73
+
74
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
75
+ return T_EXIT_FAIL;
76
+ }
77
+
78
+ ret = io_uring_wait_cqe(ring, &cqe);
79
+ if (ret < 0) {
80
+ fprintf(stderr, "wait completion %d\n", ret);
81
+ return T_EXIT_FAIL;
82
+ }
83
+ if (cqe->res != 0) {
84
+ if (cqe->res == -EINVAL)
85
+ return T_EXIT_SKIP;
86
+ fprintf(stderr, "cqe res %d\n", cqe->res);
87
+ return T_EXIT_FAIL;
88
+ }
89
+ if (cqe->user_data != ID) {
90
+ fprintf(stderr, "user_data %llx\n", (long long) cqe->user_data);
91
+ return T_EXIT_FAIL;
92
+ }
93
+
94
+ io_uring_cqe_seen(ring, cqe);
95
+ return T_EXIT_PASS;
96
+ }
97
+
98
+ static void *thread_fn(void *data)
99
+ {
100
+ struct data *d = data;
101
+ struct io_uring ring;
102
+ int ret;
103
+
104
+ ret = io_uring_queue_init(2, &ring, IORING_SETUP_DEFER_TASKRUN | IORING_SETUP_SINGLE_ISSUER);
105
+ if (ret) {
106
+ fprintf(stderr, "ring init failed %d\n", ret);
107
+ pthread_barrier_wait(&d->barrier);
108
+ return NULL;
109
+ }
110
+
111
+ d->fd = ring.ring_fd;
112
+ pthread_barrier_wait(&d->barrier);
113
+
114
+ if (recv_msg(&ring))
115
+ return (void *) 1;
116
+
117
+ return NULL;
118
+ }
119
+
120
+ static int test(int ring_flags)
121
+ {
122
+ struct io_uring ring, ring2;
123
+ pthread_t thread;
124
+ struct data d;
125
+ void *ret2;
126
+ int ret, i;
127
+
128
+ ret = io_uring_queue_init(2, &ring, ring_flags);
129
+ if (ret) {
130
+ fprintf(stderr, "io_uring_queue_init failed for ring1: %d\n", ret);
131
+ return T_EXIT_FAIL;
132
+ }
133
+
134
+ ret = io_uring_queue_init(2, &ring2, ring_flags);
135
+ if (ret) {
136
+ fprintf(stderr, "io_uring_queue_init failed for ring2: %d\n", ret);
137
+ return T_EXIT_FAIL;
138
+ }
139
+
140
+ ret = send_msg(&ring, ring2.ring_fd);
141
+ if (ret) {
142
+ if (ret != T_EXIT_SKIP)
143
+ fprintf(stderr, "send_msg failed: %d\n", ret);
144
+ return ret;
145
+ }
146
+
147
+ ret = recv_msg(&ring2);
148
+ if (ret) {
149
+ fprintf(stderr, "recv_msg failed: %d\n", ret);
150
+ return ret;
151
+ }
152
+
153
+ for (i = 0; i < 8; i++) {
154
+ ret = send_msg(&ring, ring2.ring_fd);
155
+ if (ret) {
156
+ if (ret != T_EXIT_SKIP)
157
+ fprintf(stderr, "send_msg failed: %d\n", ret);
158
+ return ret;
159
+ }
160
+ }
161
+
162
+ for (i = 0; i < 8; i++) {
163
+ ret = recv_msg(&ring2);
164
+ if (ret) {
165
+ fprintf(stderr, "recv_msg failed: %d\n", ret);
166
+ return ret;
167
+ }
168
+ }
169
+
170
+ pthread_barrier_init(&d.barrier, NULL, 2);
171
+ d.fd = -1;
172
+ pthread_create(&thread, NULL, thread_fn, &d);
173
+ pthread_barrier_wait(&d.barrier);
174
+ if (d.fd == -1)
175
+ return T_EXIT_FAIL;
176
+
177
+ ret = send_msg(&ring, d.fd);
178
+ if (ret) {
179
+ fprintf(stderr, "send msg failed: %d\n", ret);
180
+ return ret;
181
+ }
182
+ pthread_join(thread, &ret2);
183
+ if (ret2) {
184
+ fprintf(stderr, "Remote test failed\n");
185
+ return T_EXIT_FAIL;
186
+ }
187
+
188
+ return T_EXIT_PASS;
189
+ }
190
+
191
+ int main(int argc, char *argv[])
192
+ {
193
+ int ret;
194
+
195
+ if (argc > 1)
196
+ return T_EXIT_SKIP;
197
+
198
+ ret = test(0);
199
+ if (ret == T_EXIT_FAIL) {
200
+ fprintf(stderr, "test ring_flags 0 failed\n");
201
+ return ret;
202
+ } else if (ret == T_EXIT_SKIP)
203
+ return ret;
204
+
205
+ ret = test(IORING_SETUP_SINGLE_ISSUER|IORING_SETUP_DEFER_TASKRUN);
206
+ if (ret == T_EXIT_FAIL) {
207
+ fprintf(stderr, "test ring_flags defer failed\n");
208
+ return ret;
209
+ }
210
+
211
+ return ret;
212
+ }
@@ -0,0 +1,159 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test ring messaging command
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "liburing.h"
14
+ #include "helpers.h"
15
+
16
+ static int no_msg;
17
+
18
+ static int test(struct io_uring *ring, unsigned dst_flags)
19
+ {
20
+ struct io_uring_params p = { };
21
+ struct io_uring_cqe *cqe;
22
+ struct io_uring_sqe *sqe;
23
+ struct io_uring dst;
24
+ int ret, i, err_ret = T_EXIT_FAIL;
25
+
26
+ p.flags = dst_flags | IORING_SETUP_CQSIZE;
27
+ p.cq_entries = 4;
28
+ ret = io_uring_queue_init_params(4, &dst, &p);
29
+ if (ret) {
30
+ fprintf(stderr, "Destination ring create failed %d\n", ret);
31
+ return T_EXIT_FAIL;
32
+ }
33
+
34
+ for (i = 0; i < 8; i++) {
35
+ sqe = io_uring_get_sqe(ring);
36
+ if (!sqe) {
37
+ fprintf(stderr, "get sqe failed\n");
38
+ goto err;
39
+ }
40
+
41
+ io_uring_prep_msg_ring(sqe, dst.ring_fd, 0x10, 0x1234, 0);
42
+ sqe->user_data = i + 1;
43
+ }
44
+
45
+ ret = io_uring_submit(ring);
46
+ if (ret != 8) {
47
+ /*
48
+ * Likely an old kernel that doesn't support the opcode,
49
+ * just skip the test.
50
+ */
51
+ if (ret == 1) {
52
+ err_ret = T_EXIT_SKIP;
53
+ no_msg = 1;
54
+ goto err;
55
+ }
56
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
57
+ goto err;
58
+ }
59
+
60
+ for (i = 0; i < 8; i++) {
61
+ ret = io_uring_wait_cqe(ring, &cqe);
62
+ if (ret < 0) {
63
+ fprintf(stderr, "wait completion %d\n", ret);
64
+ goto err;
65
+ }
66
+ switch (cqe->user_data) {
67
+ case 1 ... 8:
68
+ if (cqe->res == -EINVAL || cqe->res == -EOPNOTSUPP) {
69
+ no_msg = 1;
70
+ goto out;
71
+ }
72
+ if (cqe->res != 0) {
73
+ fprintf(stderr, "cqe res %d\n", cqe->res);
74
+ goto err;
75
+ }
76
+ break;
77
+ case 0x1234:
78
+ if (cqe->res != 0x10) {
79
+ fprintf(stderr, "invalid len %x\n", cqe->res);
80
+ goto err;
81
+ }
82
+ break;
83
+ default:
84
+ fprintf(stderr, "Invalid user_data\n");
85
+ goto err;
86
+ }
87
+ io_uring_cqe_seen(ring, cqe);
88
+ }
89
+
90
+ for (i = 0; i < 8; i++) {
91
+ ret = io_uring_wait_cqe(&dst, &cqe);
92
+ if (ret < 0) {
93
+ fprintf(stderr, "wait completion %d\n", ret);
94
+ goto err;
95
+ }
96
+ switch (cqe->user_data) {
97
+ case 0x1234:
98
+ if (cqe->res != 0x10) {
99
+ fprintf(stderr, "invalid len %x\n", cqe->res);
100
+ goto err;
101
+ }
102
+ break;
103
+ default:
104
+ fprintf(stderr, "Invalid user_data\n");
105
+ goto err;
106
+ }
107
+ io_uring_cqe_seen(&dst, cqe);
108
+ }
109
+
110
+ out:
111
+ io_uring_queue_exit(&dst);
112
+ return no_msg ? T_EXIT_SKIP : T_EXIT_PASS;
113
+ err:
114
+ io_uring_queue_exit(&dst);
115
+ return err_ret;
116
+ }
117
+
118
+ int main(int argc, char *argv[])
119
+ {
120
+ struct io_uring src;
121
+ int ret;
122
+
123
+ if (argc > 1)
124
+ return T_EXIT_SKIP;
125
+
126
+ ret = io_uring_queue_init(8, &src, 0);
127
+ if (ret) {
128
+ fprintf(stderr, "ring setup failed: %d\n", ret);
129
+ return T_EXIT_FAIL;
130
+ }
131
+
132
+ ret = test(&src, 0);
133
+ if (ret && !no_msg) {
134
+ fprintf(stderr, "test failed\n");
135
+ return ret;
136
+ }
137
+ if (no_msg)
138
+ return T_EXIT_SKIP;
139
+
140
+ ret = test(&src, IORING_SETUP_IOPOLL);
141
+ if (ret) {
142
+ fprintf(stderr, "test IOPOLL failed\n");
143
+ return ret;
144
+ }
145
+
146
+ ret = test(&src, IORING_SETUP_DEFER_TASKRUN | IORING_SETUP_SINGLE_ISSUER);
147
+ if (ret) {
148
+ fprintf(stderr, "test defer failed\n");
149
+ return ret;
150
+ }
151
+
152
+ ret = test(&src, IORING_SETUP_DEFER_TASKRUN | IORING_SETUP_SINGLE_ISSUER | IORING_SETUP_IOPOLL);
153
+ if (ret) {
154
+ fprintf(stderr, "test defer IOPOLL failed\n");
155
+ return ret;
156
+ }
157
+
158
+ return T_EXIT_PASS;
159
+ }