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,131 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test io_uring_setup with IORING_SETUP_REGISTERED_FD_ONLY
4
+ *
5
+ */
6
+ #include <stdio.h>
7
+
8
+ #include "helpers.h"
9
+
10
+ #define NORMAL_PAGE_ENTRIES 8
11
+ #define HUGE_PAGE_ENTRIES 512
12
+
13
+ static int no_mmap;
14
+
15
+ static int test_nops(struct io_uring *ring, int sq_size, int nr_nops)
16
+ {
17
+ struct io_uring_sqe *sqe;
18
+ struct io_uring_cqe *cqe;
19
+ int i, ret;
20
+
21
+ do {
22
+ int todo = nr_nops;
23
+
24
+ if (todo > sq_size)
25
+ todo = sq_size;
26
+
27
+ for (i = 0; i < todo; i++) {
28
+ sqe = io_uring_get_sqe(ring);
29
+ io_uring_prep_nop(sqe);
30
+ }
31
+
32
+ ret = io_uring_submit(ring);
33
+ if (ret != todo) {
34
+ fprintf(stderr, "short submit %d\n", ret);
35
+ return T_EXIT_FAIL;
36
+ }
37
+
38
+ for (i = 0; i < todo; i++) {
39
+ ret = io_uring_wait_cqe(ring, &cqe);
40
+ if (ret) {
41
+ fprintf(stderr, "wait err %d\n", ret);
42
+ return T_EXIT_FAIL;
43
+ }
44
+ io_uring_cqe_seen(ring, cqe);
45
+ }
46
+ nr_nops -= todo;
47
+ } while (nr_nops);
48
+
49
+ return T_EXIT_PASS;
50
+ }
51
+
52
+ static int test(int nentries)
53
+ {
54
+ struct io_uring ring;
55
+ unsigned values[2];
56
+ int ret;
57
+
58
+ ret = io_uring_queue_init(nentries, &ring,
59
+ IORING_SETUP_REGISTERED_FD_ONLY | IORING_SETUP_NO_MMAP);
60
+ if (ret == -EINVAL) {
61
+ no_mmap = 1;
62
+ return T_EXIT_SKIP;
63
+ } else if (ret == -ENOMEM) {
64
+ fprintf(stdout, "Enable huge pages to test big rings\n");
65
+ return T_EXIT_SKIP;
66
+ } else if (ret) {
67
+ fprintf(stderr, "ring setup failed: %d\n", ret);
68
+ return T_EXIT_FAIL;
69
+ }
70
+
71
+ ret = io_uring_register_ring_fd(&ring);
72
+ if (ret != -EEXIST) {
73
+ fprintf(stderr, "registering already-registered ring fd should fail\n");
74
+ goto err;
75
+ }
76
+
77
+ ret = io_uring_close_ring_fd(&ring);
78
+ if (ret != -EBADF) {
79
+ fprintf(stderr, "closing already-closed ring fd should fail\n");
80
+ goto err;
81
+ }
82
+
83
+ /* Test a simple io_uring_register operation expected to work.
84
+ * io_uring_register_iowq_max_workers is arbitrary.
85
+ */
86
+ values[0] = values[1] = 0;
87
+ ret = io_uring_register_iowq_max_workers(&ring, values);
88
+ if (ret || (values[0] == 0 && values[1] == 0)) {
89
+ fprintf(stderr, "io_uring_register operation failed after closing ring fd\n");
90
+ goto err;
91
+ }
92
+
93
+ ret = test_nops(&ring, nentries, nentries * 4);
94
+ if (ret)
95
+ goto err;
96
+
97
+ io_uring_queue_exit(&ring);
98
+ return T_EXIT_PASS;
99
+
100
+ err:
101
+ io_uring_queue_exit(&ring);
102
+ return T_EXIT_FAIL;
103
+ }
104
+
105
+ int main(int argc, char *argv[])
106
+ {
107
+ int ret;
108
+
109
+ if (argc > 1)
110
+ return T_EXIT_SKIP;
111
+
112
+ /* test single normal page */
113
+ ret = test(NORMAL_PAGE_ENTRIES);
114
+ if (ret == T_EXIT_SKIP || no_mmap) {
115
+ return T_EXIT_SKIP;
116
+ } else if (ret != T_EXIT_PASS) {
117
+ fprintf(stderr, "test 8 failed\n");
118
+ return T_EXIT_FAIL;
119
+ }
120
+
121
+ /* test with entries requiring a huge page */
122
+ ret = test(HUGE_PAGE_ENTRIES);
123
+ if (ret == T_EXIT_SKIP) {
124
+ return T_EXIT_SKIP;
125
+ } else if (ret != T_EXIT_PASS) {
126
+ fprintf(stderr, "test 512 failed\n");
127
+ return T_EXIT_FAIL;
128
+ }
129
+
130
+ return T_EXIT_PASS;
131
+ }
@@ -0,0 +1,56 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test alloc hint sanity after unregistering the file table
4
+ */
5
+ #include <stdio.h>
6
+ #include <unistd.h>
7
+ #include <sys/socket.h>
8
+
9
+ #include "liburing.h"
10
+ #include "helpers.h"
11
+
12
+ int main(int argc, char *argv[])
13
+ {
14
+ struct io_uring_sqe *sqe;
15
+ struct io_uring_cqe *cqe;
16
+ struct io_uring ring;
17
+ int ret;
18
+
19
+ if (argc > 1)
20
+ return T_EXIT_SKIP;
21
+
22
+ io_uring_queue_init(1, &ring, 0);
23
+
24
+ ret = io_uring_register_files_sparse(&ring, 16);
25
+ if (ret) {
26
+ if (ret == -EINVAL)
27
+ return T_EXIT_SKIP;
28
+
29
+ fprintf(stderr, "Failed to register file table: %d\n", ret);
30
+ return T_EXIT_FAIL;
31
+ }
32
+ io_uring_unregister_files(&ring);
33
+
34
+ sqe = io_uring_get_sqe(&ring);
35
+ io_uring_prep_socket_direct_alloc(sqe, AF_UNIX, SOCK_DGRAM, 0, 0);
36
+
37
+ ret = io_uring_submit(&ring);
38
+ if (ret != 1) {
39
+ fprintf(stderr, "submit %d\n", ret);
40
+ return T_EXIT_FAIL;
41
+ }
42
+
43
+ ret = io_uring_wait_cqe(&ring, &cqe);
44
+ if (ret) {
45
+ fprintf(stderr, "wait cqe: %d\n", ret);
46
+ return T_EXIT_FAIL;
47
+ }
48
+
49
+ if (cqe->res != -ENFILE) {
50
+ fprintf(stderr, "Bad CQE res: %d\n", cqe->res);
51
+ return T_EXIT_FAIL;
52
+ }
53
+
54
+ io_uring_cqe_seen(&ring, cqe);
55
+ return T_EXIT_PASS;
56
+ }
@@ -0,0 +1,90 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test io_uring_register with a registered ring (IORING_REGISTER_USE_REGISTERED_RING)
4
+ *
5
+ */
6
+ #include <stdio.h>
7
+
8
+ #include "helpers.h"
9
+
10
+ int main(int argc, char *argv[])
11
+ {
12
+ struct io_uring ring;
13
+ unsigned values[2];
14
+ int ret;
15
+
16
+ if (argc > 1)
17
+ return T_EXIT_SKIP;
18
+
19
+ ret = io_uring_queue_init(8, &ring, 0);
20
+ if (ret) {
21
+ fprintf(stderr, "ring setup failed\n");
22
+ return T_EXIT_FAIL;
23
+ }
24
+
25
+ if (!(ring.features & IORING_FEAT_REG_REG_RING)) {
26
+ fprintf(stderr, "IORING_FEAT_REG_REG_RING not available in kernel\n");
27
+ io_uring_queue_exit(&ring);
28
+ return T_EXIT_SKIP;
29
+ }
30
+
31
+ ret = io_uring_close_ring_fd(&ring);
32
+ if (ret != -EINVAL) {
33
+ fprintf(stderr, "closing ring fd should EINVAL before register\n");
34
+ goto err;
35
+ }
36
+
37
+ ret = io_uring_unregister_ring_fd(&ring);
38
+ if (ret != -EINVAL) {
39
+ fprintf(stderr, "unregistering not-registered ring fd should fail\n");
40
+ goto err;
41
+ }
42
+
43
+ ret = io_uring_register_ring_fd(&ring);
44
+ if (ret != 1) {
45
+ fprintf(stderr, "registering ring fd failed\n");
46
+ goto err;
47
+ }
48
+
49
+ ret = io_uring_register_ring_fd(&ring);
50
+ if (ret != -EEXIST) {
51
+ fprintf(stderr, "registering already-registered ring fd should fail\n");
52
+ goto err;
53
+ }
54
+
55
+ /* Test a simple io_uring_register operation expected to work.
56
+ * io_uring_register_iowq_max_workers is arbitrary.
57
+ */
58
+ values[0] = values[1] = 0;
59
+ ret = io_uring_register_iowq_max_workers(&ring, values);
60
+ if (ret || (values[0] == 0 && values[1] == 0)) {
61
+ fprintf(stderr, "io_uring_register operation failed before closing ring fd\n");
62
+ goto err;
63
+ }
64
+
65
+ ret = io_uring_close_ring_fd(&ring);
66
+ if (ret != 1) {
67
+ fprintf(stderr, "closing ring fd failed\n");
68
+ goto err;
69
+ }
70
+
71
+ values[0] = values[1] = 0;
72
+ ret = io_uring_register_iowq_max_workers(&ring, values);
73
+ if (ret || (values[0] == 0 && values[1] == 0)) {
74
+ fprintf(stderr, "io_uring_register operation failed after closing ring fd\n");
75
+ goto err;
76
+ }
77
+
78
+ ret = io_uring_close_ring_fd(&ring);
79
+ if (ret != -EBADF) {
80
+ fprintf(stderr, "closing already-closed ring fd should fail\n");
81
+ goto err;
82
+ }
83
+
84
+ io_uring_queue_exit(&ring);
85
+ return T_EXIT_PASS;
86
+
87
+ err:
88
+ io_uring_queue_exit(&ring);
89
+ return T_EXIT_FAIL;
90
+ }
@@ -0,0 +1,91 @@
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/mman.h>
10
+ #include <sys/syscall.h>
11
+ #include <sys/types.h>
12
+ #include <unistd.h>
13
+
14
+ #include "helpers.h"
15
+
16
+ #ifndef __NR_io_uring_register
17
+ #define __NR_io_uring_register 427
18
+ #endif
19
+ #ifndef __NR_io_uring_setup
20
+ #define __NR_io_uring_setup 425
21
+ #endif
22
+
23
+ #define SIZEOF_IO_URING_SQE 64
24
+ #define SIZEOF_IO_URING_CQE 16
25
+ #define SQ_HEAD_OFFSET 0
26
+ #define SQ_TAIL_OFFSET 64
27
+ #define SQ_RING_MASK_OFFSET 256
28
+ #define SQ_RING_ENTRIES_OFFSET 264
29
+ #define SQ_FLAGS_OFFSET 276
30
+ #define SQ_DROPPED_OFFSET 272
31
+ #define CQ_HEAD_OFFSET 128
32
+ #define CQ_TAIL_OFFSET 192
33
+ #define CQ_RING_MASK_OFFSET 260
34
+ #define CQ_RING_ENTRIES_OFFSET 268
35
+ #define CQ_RING_OVERFLOW_OFFSET 284
36
+ #define CQ_FLAGS_OFFSET 280
37
+ #define CQ_CQES_OFFSET 320
38
+
39
+ static long syz_io_uring_setup(volatile long a0, volatile long a1, volatile long a2, volatile long a3, volatile long a4, volatile long a5)
40
+ {
41
+ uint32_t entries = (uint32_t)a0;
42
+ struct io_uring_params* setup_params = (struct io_uring_params*)a1;
43
+ void* vma1 = (void*)a2;
44
+ void* vma2 = (void*)a3;
45
+ void** ring_ptr_out = (void**)a4;
46
+ void** sqes_ptr_out = (void**)a5;
47
+ uint32_t fd_io_uring = syscall(__NR_io_uring_setup, entries, setup_params);
48
+ uint32_t sq_ring_sz = setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t);
49
+ uint32_t cq_ring_sz = setup_params->cq_off.cqes + setup_params->cq_entries * SIZEOF_IO_URING_CQE;
50
+ uint32_t ring_sz = sq_ring_sz > cq_ring_sz ? sq_ring_sz : cq_ring_sz;
51
+ *ring_ptr_out = mmap(vma1, ring_sz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQ_RING);
52
+ uint32_t sqes_sz = setup_params->sq_entries * SIZEOF_IO_URING_SQE;
53
+ *sqes_ptr_out = mmap(vma2, sqes_sz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQES);
54
+ return fd_io_uring;
55
+ }
56
+
57
+ static uint64_t r[1] = {0xffffffffffffffff};
58
+
59
+ int main(int argc, char *argv[])
60
+ {
61
+ intptr_t res = 0;
62
+
63
+ if (argc > 1)
64
+ return T_EXIT_SKIP;
65
+
66
+ mmap((void *) 0x1ffff000ul, 0x1000ul, PROT_NONE,
67
+ MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0ul);
68
+ mmap((void *) 0x20000000ul, 0x1000000ul, PROT_READ|PROT_WRITE|PROT_EXEC,
69
+ MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0ul);
70
+ mmap((void *) 0x21000000ul, 0x1000ul, PROT_NONE,
71
+ MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0ul);
72
+
73
+ *(uint32_t*)0x20000684 = 0;
74
+ *(uint32_t*)0x20000688 = 0;
75
+ *(uint32_t*)0x2000068c = 0;
76
+ *(uint32_t*)0x20000690 = 0;
77
+ *(uint32_t*)0x20000698 = -1;
78
+ memset((void*)0x2000069c, 0, 12);
79
+
80
+ res = syz_io_uring_setup(0x2fd6, 0x20000680, 0x20ffd000, 0x20ffc000,
81
+ 0x20000700, 0x20000740);
82
+ if (res != -1)
83
+ r[0] = res;
84
+
85
+ *(uint64_t*)0x20002840 = 0;
86
+ *(uint64_t*)0x20002848 = 0;
87
+ *(uint64_t*)0x20002850 = 0x20000840;
88
+ *(uint64_t*)0x20002858 = 0x1000;
89
+ syscall(__NR_io_uring_register, r[0], 0ul, 0x20002840ul, 2ul);
90
+ return T_EXIT_PASS;
91
+ }