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,284 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test sharing a ring across a fork
4
+ */
5
+ #include <fcntl.h>
6
+ #include <pthread.h>
7
+ #include <signal.h>
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <sys/mman.h>
12
+ #include <sys/stat.h>
13
+ #include <sys/types.h>
14
+ #include <sys/wait.h>
15
+ #include <unistd.h>
16
+
17
+ #include "liburing.h"
18
+ #include "helpers.h"
19
+
20
+
21
+ struct forktestmem
22
+ {
23
+ struct io_uring ring;
24
+ pthread_barrier_t barrier;
25
+ pthread_barrierattr_t barrierattr;
26
+ };
27
+
28
+ static int open_tempfile(const char *dir, const char *fname)
29
+ {
30
+ int fd;
31
+ char buf[32];
32
+
33
+ snprintf(buf, sizeof(buf), "%s/%s",
34
+ dir, fname);
35
+ fd = open(buf, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
36
+ if (fd < 0) {
37
+ perror("open");
38
+ exit(1);
39
+ }
40
+
41
+ return fd;
42
+ }
43
+
44
+ static int submit_write(struct io_uring *ring, int fd, const char *str,
45
+ int wait)
46
+ {
47
+ struct io_uring_sqe *sqe;
48
+ struct iovec iovec;
49
+ int ret;
50
+
51
+ sqe = io_uring_get_sqe(ring);
52
+ if (!sqe) {
53
+ fprintf(stderr, "could not get sqe\n");
54
+ return 1;
55
+ }
56
+
57
+ iovec.iov_base = (char *) str;
58
+ iovec.iov_len = strlen(str);
59
+ io_uring_prep_writev(sqe, fd, &iovec, 1, 0);
60
+ ret = io_uring_submit_and_wait(ring, wait);
61
+ if (ret < 0) {
62
+ fprintf(stderr, "submit failed: %s\n", strerror(-ret));
63
+ return 1;
64
+ }
65
+
66
+ return 0;
67
+ }
68
+
69
+ static int wait_cqe(struct io_uring *ring, const char *stage)
70
+ {
71
+ struct io_uring_cqe *cqe;
72
+ int ret;
73
+
74
+ ret = io_uring_wait_cqe(ring, &cqe);
75
+ if (ret) {
76
+ fprintf(stderr, "%s wait_cqe failed %d\n", stage, ret);
77
+ return 1;
78
+ }
79
+ if (cqe->res < 0) {
80
+ fprintf(stderr, "%s cqe failed %d\n", stage, cqe->res);
81
+ return 1;
82
+ }
83
+
84
+ io_uring_cqe_seen(ring, cqe);
85
+ return 0;
86
+ }
87
+
88
+ static int verify_file(const char *tmpdir, const char *fname, const char* expect)
89
+ {
90
+ int fd;
91
+ char buf[512];
92
+ int err = 0;
93
+
94
+ memset(buf, 0, sizeof(buf));
95
+
96
+ fd = open_tempfile(tmpdir, fname);
97
+ if (fd < 0)
98
+ return 1;
99
+
100
+ if (read(fd, buf, sizeof(buf) - 1) < 0)
101
+ return 1;
102
+
103
+ if (strcmp(buf, expect) != 0) {
104
+ fprintf(stderr, "content mismatch for %s\n"
105
+ "got:\n%s\n"
106
+ "expected:\n%s\n",
107
+ fname, buf, expect);
108
+ err = 1;
109
+ }
110
+
111
+ close(fd);
112
+ return err;
113
+ }
114
+
115
+ static void cleanup(const char *tmpdir)
116
+ {
117
+ char buf[32];
118
+
119
+ /* don't check errors, called during partial runs */
120
+
121
+ snprintf(buf, sizeof(buf), "%s/%s", tmpdir, "shared");
122
+ unlink(buf);
123
+
124
+ snprintf(buf, sizeof(buf), "%s/%s", tmpdir, "parent1");
125
+ unlink(buf);
126
+
127
+ snprintf(buf, sizeof(buf), "%s/%s", tmpdir, "parent2");
128
+ unlink(buf);
129
+
130
+ snprintf(buf, sizeof(buf), "%s/%s", tmpdir, "child");
131
+ unlink(buf);
132
+
133
+ rmdir(tmpdir);
134
+ }
135
+
136
+ int main(int argc, char *argv[])
137
+ {
138
+ struct forktestmem *shmem;
139
+ char tmpdir[] = "forktmpXXXXXX";
140
+ int shared_fd;
141
+ int ret;
142
+ pid_t p;
143
+
144
+ if (argc > 1)
145
+ return T_EXIT_SKIP;
146
+
147
+ shmem = mmap(0, sizeof(struct forktestmem), PROT_READ|PROT_WRITE,
148
+ MAP_SHARED | MAP_ANONYMOUS, 0, 0);
149
+ if (!shmem) {
150
+ fprintf(stderr, "mmap failed\n");
151
+ exit(T_EXIT_FAIL);
152
+ }
153
+
154
+ pthread_barrierattr_init(&shmem->barrierattr);
155
+ pthread_barrierattr_setpshared(&shmem->barrierattr, 1);
156
+ pthread_barrier_init(&shmem->barrier, &shmem->barrierattr, 2);
157
+
158
+ ret = io_uring_queue_init(10, &shmem->ring, 0);
159
+ if (ret < 0) {
160
+ fprintf(stderr, "queue init failed\n");
161
+ exit(T_EXIT_FAIL);
162
+ }
163
+
164
+ if (mkdtemp(tmpdir) == NULL) {
165
+ fprintf(stderr, "temp directory creation failed\n");
166
+ exit(T_EXIT_FAIL);
167
+ }
168
+
169
+ shared_fd = open_tempfile(tmpdir, "shared");
170
+
171
+ /*
172
+ * First do a write before the fork, to test whether child can
173
+ * reap that
174
+ */
175
+ if (submit_write(&shmem->ring, shared_fd, "before fork: write shared fd\n", 0))
176
+ goto errcleanup;
177
+
178
+ p = fork();
179
+ switch (p) {
180
+ case -1:
181
+ fprintf(stderr, "fork failed\n");
182
+ goto errcleanup;
183
+
184
+ default: {
185
+ /* parent */
186
+ int parent_fd1;
187
+ int parent_fd2;
188
+ int wstatus;
189
+
190
+ /* wait till fork is started up */
191
+ pthread_barrier_wait(&shmem->barrier);
192
+
193
+ parent_fd1 = open_tempfile(tmpdir, "parent1");
194
+ parent_fd2 = open_tempfile(tmpdir, "parent2");
195
+
196
+ /* do a parent write to the shared fd */
197
+ if (submit_write(&shmem->ring, shared_fd, "parent: write shared fd\n", 0))
198
+ goto errcleanup;
199
+
200
+ /* do a parent write to an fd where same numbered fd exists in child */
201
+ if (submit_write(&shmem->ring, parent_fd1, "parent: write parent fd 1\n", 0))
202
+ goto errcleanup;
203
+
204
+ /* do a parent write to an fd where no same numbered fd exists in child */
205
+ if (submit_write(&shmem->ring, parent_fd2, "parent: write parent fd 2\n", 0))
206
+ goto errcleanup;
207
+
208
+ /* wait to switch read/writ roles with child */
209
+ pthread_barrier_wait(&shmem->barrier);
210
+
211
+ /* now wait for child to exit, to ensure we still can read completion */
212
+ waitpid(p, &wstatus, 0);
213
+ if (WEXITSTATUS(wstatus) != 0) {
214
+ fprintf(stderr, "child failed\n");
215
+ goto errcleanup;
216
+ }
217
+
218
+ if (wait_cqe(&shmem->ring, "p cqe 1"))
219
+ goto errcleanup;
220
+
221
+ if (wait_cqe(&shmem->ring, "p cqe 2"))
222
+ goto errcleanup;
223
+
224
+ /* check that IO can still be submitted after child exited */
225
+ if (submit_write(&shmem->ring, shared_fd, "parent: write shared fd after child exit\n", 0))
226
+ goto errcleanup;
227
+
228
+ if (wait_cqe(&shmem->ring, "p cqe 3"))
229
+ goto errcleanup;
230
+
231
+ break;
232
+ }
233
+ case 0: {
234
+ /* child */
235
+ int child_fd;
236
+
237
+ /* wait till fork is started up */
238
+ pthread_barrier_wait(&shmem->barrier);
239
+
240
+ child_fd = open_tempfile(tmpdir, "child");
241
+
242
+ if (wait_cqe(&shmem->ring, "c cqe shared"))
243
+ exit(1);
244
+
245
+ if (wait_cqe(&shmem->ring, "c cqe parent 1"))
246
+ exit(1);
247
+
248
+ if (wait_cqe(&shmem->ring, "c cqe parent 2"))
249
+ exit(1);
250
+
251
+ if (wait_cqe(&shmem->ring, "c cqe parent 3"))
252
+ exit(1);
253
+
254
+ /* wait to switch read/writ roles with parent */
255
+ pthread_barrier_wait(&shmem->barrier);
256
+
257
+ if (submit_write(&shmem->ring, child_fd, "child: write child fd\n", 0))
258
+ exit(1);
259
+
260
+ /* ensure both writes have finished before child exits */
261
+ if (submit_write(&shmem->ring, shared_fd, "child: write shared fd\n", 2))
262
+ exit(1);
263
+
264
+ exit(0);
265
+ }
266
+ }
267
+
268
+ if (verify_file(tmpdir, "shared",
269
+ "before fork: write shared fd\n"
270
+ "parent: write shared fd\n"
271
+ "child: write shared fd\n"
272
+ "parent: write shared fd after child exit\n") ||
273
+ verify_file(tmpdir, "parent1", "parent: write parent fd 1\n") ||
274
+ verify_file(tmpdir, "parent2", "parent: write parent fd 2\n") ||
275
+ verify_file(tmpdir, "child", "child: write child fd\n"))
276
+ goto errcleanup;
277
+
278
+ cleanup(tmpdir);
279
+ exit(T_EXIT_PASS);
280
+
281
+ errcleanup:
282
+ cleanup(tmpdir);
283
+ exit(T_EXIT_FAIL);
284
+ }
@@ -0,0 +1,54 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ // autogenerated by syzkaller (https://github.com/google/syzkaller)
3
+
4
+ #include <endian.h>
5
+ #include <stdint.h>
6
+ #include <stdio.h>
7
+ #include <stdlib.h>
8
+ #include <string.h>
9
+ #include <sys/types.h>
10
+ #include <sys/mman.h>
11
+ #include <unistd.h>
12
+
13
+ #include "liburing.h"
14
+ #include "helpers.h"
15
+ #include "../src/syscall.h"
16
+
17
+ int main(int argc, char *argv[])
18
+ {
19
+ if (argc > 1)
20
+ return T_EXIT_SKIP;
21
+
22
+ mmap((void *) 0x20000000, 0x1000000, 3, MAP_ANON|MAP_PRIVATE, -1, 0);
23
+
24
+ *(uint32_t*)0x20000200 = 0;
25
+ *(uint32_t*)0x20000204 = 0;
26
+ *(uint32_t*)0x20000208 = 5;
27
+ *(uint32_t*)0x2000020c = 0x400;
28
+ *(uint32_t*)0x20000210 = 0;
29
+ *(uint32_t*)0x20000214 = 0;
30
+ *(uint32_t*)0x20000218 = 0;
31
+ *(uint32_t*)0x2000021c = 0;
32
+ *(uint32_t*)0x20000220 = 0;
33
+ *(uint32_t*)0x20000224 = 0;
34
+ *(uint32_t*)0x20000228 = 0;
35
+ *(uint32_t*)0x2000022c = 0;
36
+ *(uint32_t*)0x20000230 = 0;
37
+ *(uint32_t*)0x20000234 = 0;
38
+ *(uint32_t*)0x20000238 = 0;
39
+ *(uint32_t*)0x2000023c = 0;
40
+ *(uint32_t*)0x20000240 = 0;
41
+ *(uint32_t*)0x20000244 = 0;
42
+ *(uint64_t*)0x20000248 = 0;
43
+ *(uint32_t*)0x20000250 = 0;
44
+ *(uint32_t*)0x20000254 = 0;
45
+ *(uint32_t*)0x20000258 = 0;
46
+ *(uint32_t*)0x2000025c = 0;
47
+ *(uint32_t*)0x20000260 = 0;
48
+ *(uint32_t*)0x20000264 = 0;
49
+ *(uint32_t*)0x20000268 = 0;
50
+ *(uint32_t*)0x2000026c = 0;
51
+ *(uint64_t*)0x20000270 = 0;
52
+ __sys_io_uring_setup(0xc9f, (struct io_uring_params *) 0x20000200);
53
+ return T_EXIT_PASS;
54
+ }
@@ -0,0 +1,78 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: Check to see if wait_nr is being honored.
4
+ */
5
+ #include <stdio.h>
6
+ #include "liburing.h"
7
+ #include "helpers.h"
8
+
9
+ int main(int argc, char *argv[])
10
+ {
11
+ struct io_uring_sqe *sqe;
12
+ struct io_uring_cqe *cqe;
13
+ struct io_uring ring;
14
+ int ret;
15
+ struct __kernel_timespec ts = {
16
+ .tv_sec = 0,
17
+ .tv_nsec = 10000000
18
+ };
19
+
20
+ if (argc > 1)
21
+ return T_EXIT_SKIP;
22
+
23
+ if (io_uring_queue_init(4, &ring, 0) != 0) {
24
+ fprintf(stderr, "ring setup failed\n");
25
+ return T_EXIT_FAIL;
26
+ }
27
+
28
+ /*
29
+ * First, submit the timeout sqe so we can actually finish the test
30
+ * if everything is in working order.
31
+ */
32
+ sqe = io_uring_get_sqe(&ring);
33
+ if (!sqe) {
34
+ fprintf(stderr, "get sqe failed\n");
35
+ return T_EXIT_FAIL;
36
+ }
37
+ io_uring_prep_timeout(sqe, &ts, (unsigned)-1, 0);
38
+
39
+ ret = io_uring_submit(&ring);
40
+ if (ret != 1) {
41
+ fprintf(stderr, "Got submit %d, expected 1\n", ret);
42
+ return T_EXIT_FAIL;
43
+ }
44
+
45
+ /*
46
+ * Next, submit a nop and wait for two events. If everything is working
47
+ * as it should, we should be waiting for more than a millisecond and we
48
+ * should see two cqes. Otherwise, execution continues immediately
49
+ * and we see only one cqe.
50
+ */
51
+ sqe = io_uring_get_sqe(&ring);
52
+ if (!sqe) {
53
+ fprintf(stderr, "get sqe failed\n");
54
+ return T_EXIT_FAIL;
55
+ }
56
+ io_uring_prep_nop(sqe);
57
+
58
+ ret = io_uring_submit_and_wait(&ring, 2);
59
+ if (ret != 1) {
60
+ fprintf(stderr, "Got submit %d, expected 1\n", ret);
61
+ return T_EXIT_FAIL;
62
+ }
63
+
64
+ if (io_uring_peek_cqe(&ring, &cqe) != 0) {
65
+ fprintf(stderr, "Unable to peek cqe!\n");
66
+ return T_EXIT_FAIL;
67
+ }
68
+
69
+ io_uring_cqe_seen(&ring, cqe);
70
+
71
+ if (io_uring_peek_cqe(&ring, &cqe) != 0) {
72
+ fprintf(stderr, "Unable to peek cqe!\n");
73
+ return T_EXIT_FAIL;
74
+ }
75
+
76
+ io_uring_queue_exit(&ring);
77
+ return T_EXIT_PASS;
78
+ }