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,196 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ // https://syzkaller.appspot.com/bug?id=99f4ea77bb9b9ef24cefb66469be319f4aa9f162
3
+ // autogenerated by syzkaller (https://github.com/google/syzkaller)
4
+
5
+ #include <dirent.h>
6
+ #include <endian.h>
7
+ #include <errno.h>
8
+ #include <fcntl.h>
9
+ #include <signal.h>
10
+ #include <stdarg.h>
11
+ #include <stdbool.h>
12
+ #include <stdint.h>
13
+ #include <stdio.h>
14
+ #include <stdlib.h>
15
+ #include <string.h>
16
+ #include <sys/mman.h>
17
+ #include <sys/prctl.h>
18
+ #include <sys/stat.h>
19
+ #include <sys/types.h>
20
+ #include <sys/wait.h>
21
+ #include <time.h>
22
+ #include <unistd.h>
23
+
24
+ #include "liburing.h"
25
+ #include "../src/syscall.h"
26
+
27
+ static void sleep_ms(uint64_t ms)
28
+ {
29
+ usleep(ms * 1000);
30
+ }
31
+
32
+ static uint64_t current_time_ms(void)
33
+ {
34
+ struct timespec ts;
35
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
36
+ exit(1);
37
+ return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
38
+ }
39
+
40
+ static bool write_file(const char* file, const char* what, ...)
41
+ {
42
+ char buf[1024];
43
+ va_list args;
44
+ va_start(args, what);
45
+ vsnprintf(buf, sizeof(buf), what, args);
46
+ va_end(args);
47
+ buf[sizeof(buf) - 1] = 0;
48
+ int len = strlen(buf);
49
+ int fd = open(file, O_WRONLY | O_CLOEXEC);
50
+ if (fd == -1)
51
+ return false;
52
+ if (write(fd, buf, len) != len) {
53
+ int err = errno;
54
+ close(fd);
55
+ errno = err;
56
+ return false;
57
+ }
58
+ close(fd);
59
+ return true;
60
+ }
61
+
62
+ #define SIZEOF_IO_URING_SQE 64
63
+ #define SIZEOF_IO_URING_CQE 16
64
+ #define SQ_HEAD_OFFSET 0
65
+ #define SQ_TAIL_OFFSET 64
66
+ #define SQ_RING_MASK_OFFSET 256
67
+ #define SQ_RING_ENTRIES_OFFSET 264
68
+ #define SQ_FLAGS_OFFSET 276
69
+ #define SQ_DROPPED_OFFSET 272
70
+ #define CQ_HEAD_OFFSET 128
71
+ #define CQ_TAIL_OFFSET 192
72
+ #define CQ_RING_MASK_OFFSET 260
73
+ #define CQ_RING_ENTRIES_OFFSET 268
74
+ #define CQ_RING_OVERFLOW_OFFSET 284
75
+ #define CQ_FLAGS_OFFSET 280
76
+ #define CQ_CQES_OFFSET 320
77
+
78
+ static long syz_io_uring_setup(volatile long a0, volatile long a1,
79
+ volatile long a2, volatile long a3,
80
+ volatile long a4, volatile long a5)
81
+ {
82
+ uint32_t entries = (uint32_t)a0;
83
+ struct io_uring_params* setup_params = (struct io_uring_params*)a1;
84
+ void* vma1 = (void*)a2;
85
+ void* vma2 = (void*)a3;
86
+ void** ring_ptr_out = (void**)a4;
87
+ void** sqes_ptr_out = (void**)a5;
88
+ uint32_t fd_io_uring = __sys_io_uring_setup(entries, setup_params);
89
+ uint32_t sq_ring_sz =
90
+ setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t);
91
+ uint32_t cq_ring_sz = setup_params->cq_off.cqes +
92
+ setup_params->cq_entries * SIZEOF_IO_URING_CQE;
93
+ uint32_t ring_sz = sq_ring_sz > cq_ring_sz ? sq_ring_sz : cq_ring_sz;
94
+ *ring_ptr_out = mmap(vma1, ring_sz, PROT_READ | PROT_WRITE,
95
+ MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring,
96
+ IORING_OFF_SQ_RING);
97
+ uint32_t sqes_sz = setup_params->sq_entries * SIZEOF_IO_URING_SQE;
98
+ *sqes_ptr_out =
99
+ mmap(vma2, sqes_sz, PROT_READ | PROT_WRITE,
100
+ MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQES);
101
+ return fd_io_uring;
102
+ }
103
+
104
+ static void kill_and_wait(int pid, int* status)
105
+ {
106
+ kill(-pid, SIGKILL);
107
+ kill(pid, SIGKILL);
108
+ for (int i = 0; i < 100; i++) {
109
+ if (waitpid(-1, status, WNOHANG | __WALL) == pid)
110
+ return;
111
+ usleep(1000);
112
+ }
113
+ DIR* dir = opendir("/sys/fs/fuse/connections");
114
+ if (dir) {
115
+ for (;;) {
116
+ struct dirent* ent = readdir(dir);
117
+ if (!ent)
118
+ break;
119
+ if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
120
+ continue;
121
+ char abort[300];
122
+ snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
123
+ ent->d_name);
124
+ int fd = open(abort, O_WRONLY);
125
+ if (fd == -1) {
126
+ continue;
127
+ }
128
+ if (write(fd, abort, 1) < 0) {
129
+ }
130
+ close(fd);
131
+ }
132
+ closedir(dir);
133
+ } else {
134
+ }
135
+ while (waitpid(-1, status, __WALL) != pid) {
136
+ }
137
+ }
138
+
139
+ static void setup_test(void)
140
+ {
141
+ prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
142
+ setpgrp();
143
+ write_file("/proc/self/oom_score_adj", "1000");
144
+ }
145
+
146
+ static void execute_one(void);
147
+
148
+ #define WAIT_FLAGS __WALL
149
+
150
+ static void loop(void)
151
+ {
152
+ int iter = 0;
153
+ for (; iter < 100; iter++) {
154
+ int pid = fork();
155
+ if (pid < 0)
156
+ exit(1);
157
+ if (pid == 0) {
158
+ setup_test();
159
+ execute_one();
160
+ exit(0);
161
+ }
162
+ int status = 0;
163
+ uint64_t start = current_time_ms();
164
+ for (;;) {
165
+ if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
166
+ break;
167
+ sleep_ms(1);
168
+ if (current_time_ms() - start < 5000) {
169
+ continue;
170
+ }
171
+ kill_and_wait(pid, &status);
172
+ break;
173
+ }
174
+ }
175
+ }
176
+
177
+ void execute_one(void)
178
+ {
179
+ *(uint32_t*)0x20000044 = 0;
180
+ *(uint32_t*)0x20000048 = 0x42;
181
+ *(uint32_t*)0x2000004c = 0;
182
+ *(uint32_t*)0x20000050 = 0;
183
+ *(uint32_t*)0x20000058 = -1;
184
+ *(uint32_t*)0x2000005c = 0;
185
+ *(uint32_t*)0x20000060 = 0;
186
+ *(uint32_t*)0x20000064 = 0;
187
+ syz_io_uring_setup(0x74bc, 0x20000040, 0x20ffb000, 0x20ffc000, 0, 0);
188
+ }
189
+ int main(void)
190
+ {
191
+ mmap((void *)0x1ffff000ul, 0x1000ul, 0ul, MAP_ANON|MAP_PRIVATE, -1, 0ul);
192
+ mmap((void *)0x20000000ul, 0x1000000ul, 7ul, MAP_ANON|MAP_PRIVATE, -1, 0ul);
193
+ mmap((void *)0x21000000ul, 0x1000ul, 0ul, MAP_ANON|MAP_PRIVATE, -1, 0ul);
194
+ loop();
195
+ return 0;
196
+ }
@@ -0,0 +1,132 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: Check that closing a file with SQPOLL has it immediately closed
4
+ * upon receiving the CQE for the close. The 6.9 kernel had a bug
5
+ * where SQPOLL would not run kernel wide task_work when running the
6
+ * private task_work, which would defer the close if this was the
7
+ * final close of the file.
8
+ */
9
+ #include <errno.h>
10
+ #include <stdio.h>
11
+ #include <unistd.h>
12
+ #include <stdlib.h>
13
+ #include <string.h>
14
+ #include <fcntl.h>
15
+ #include <sys/time.h>
16
+ #include <sys/wait.h>
17
+ #include <sys/types.h>
18
+ #include <sys/stat.h>
19
+
20
+ #include "helpers.h"
21
+ #include "liburing.h"
22
+
23
+ static int fill_exec_target(char *dst, char *path)
24
+ {
25
+ struct stat sb;
26
+
27
+ /*
28
+ * Should either be ./exec-target.t or test/exec-target.t
29
+ */
30
+ sprintf(dst, "%s", path);
31
+ return stat(dst, &sb);
32
+ }
33
+
34
+ static int test_exec(struct io_uring *ring, char * const argv[])
35
+ {
36
+ char prog_path[PATH_MAX];
37
+ struct io_uring_sqe *sqe;
38
+ struct io_uring_cqe *cqe;
39
+ int ret, wstatus, fd;
40
+ pid_t p;
41
+
42
+ if (fill_exec_target(prog_path, "./exec-target.t") &&
43
+ fill_exec_target(prog_path, "test/exec-target.t")) {
44
+ fprintf(stdout, "Can't find exec-target, skipping\n");
45
+ return 0;
46
+ }
47
+
48
+ sqe = io_uring_get_sqe(ring);
49
+ io_uring_prep_openat(sqe, AT_FDCWD, prog_path, O_WRONLY, 0);
50
+ sqe->user_data = 0;
51
+
52
+ io_uring_submit(ring);
53
+
54
+ ret = io_uring_wait_cqe(ring, &cqe);
55
+ if (ret) {
56
+ fprintf(stderr, "wait cqe %d\n", ret);
57
+ return 1;
58
+ }
59
+ if (cqe->res < 0) {
60
+ fprintf(stderr, "open: %d\n", cqe->res);
61
+ return 1;
62
+ }
63
+ fd = cqe->res;
64
+ io_uring_cqe_seen(ring, cqe);
65
+
66
+ sqe = io_uring_get_sqe(ring);
67
+ io_uring_prep_close(sqe, fd);
68
+ sqe->user_data = 1;
69
+
70
+ io_uring_submit(ring);
71
+
72
+ ret = io_uring_wait_cqe(ring, &cqe);
73
+ if (ret) {
74
+ fprintf(stderr, "wait cqe %d\n", ret);
75
+ return 1;
76
+ }
77
+ if (cqe->res < 0) {
78
+ fprintf(stderr, "close: %d\n", cqe->res);
79
+ return 1;
80
+ }
81
+ io_uring_cqe_seen(ring, cqe);
82
+
83
+ p = fork();
84
+ if (p == -1) {
85
+ fprintf(stderr, "fork() failed\n");
86
+ return 1;
87
+ }
88
+
89
+ if (p == 0) {
90
+ /* file should be closed, try exec'ing it */
91
+ ret = execve(prog_path, argv, NULL);
92
+ if (ret) {
93
+ fprintf(stderr, "exec failed: %s\n", strerror(errno));
94
+ exit(1);
95
+ }
96
+ }
97
+
98
+ if (waitpid(p, &wstatus, 0) == (pid_t)-1) {
99
+ perror("waitpid()");
100
+ return 1;
101
+ }
102
+ if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus))
103
+ return 1;
104
+
105
+ return 0;
106
+ }
107
+
108
+ int main(int argc, char * const argv[])
109
+ {
110
+ struct io_uring_params p = { .flags = IORING_SETUP_SQPOLL, };
111
+ struct io_uring ring;
112
+ int ret, i;
113
+
114
+ if (argc > 1)
115
+ return T_EXIT_SKIP;
116
+
117
+ ret = t_create_ring_params(8, &ring, &p);
118
+ if (ret == T_SETUP_SKIP)
119
+ return T_EXIT_SKIP;
120
+ else if (ret != T_SETUP_OK)
121
+ return T_EXIT_FAIL;
122
+
123
+ for (i = 0; i < 20; i++) {
124
+ ret = test_exec(&ring, argv);
125
+ if (ret) {
126
+ fprintf(stderr, "test_exec failed\n");
127
+ return ret;
128
+ }
129
+ }
130
+
131
+ return T_EXIT_PASS;
132
+ }
@@ -0,0 +1,78 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test that we exit properly with SQPOLL and having a request that
4
+ * adds a circular reference to the ring itself.
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <stdlib.h>
9
+ #include <unistd.h>
10
+ #include <sys/time.h>
11
+ #include <poll.h>
12
+ #include "liburing.h"
13
+
14
+ static unsigned long long mtime_since(const struct timeval *s,
15
+ const struct timeval *e)
16
+ {
17
+ long long sec, usec;
18
+
19
+ sec = e->tv_sec - s->tv_sec;
20
+ usec = (e->tv_usec - s->tv_usec);
21
+ if (sec > 0 && usec < 0) {
22
+ sec--;
23
+ usec += 1000000;
24
+ }
25
+
26
+ sec *= 1000;
27
+ usec /= 1000;
28
+ return sec + usec;
29
+ }
30
+
31
+ static unsigned long long mtime_since_now(struct timeval *tv)
32
+ {
33
+ struct timeval end;
34
+
35
+ gettimeofday(&end, NULL);
36
+ return mtime_since(tv, &end);
37
+ }
38
+
39
+ int main(int argc, char *argv[])
40
+ {
41
+ struct io_uring_params p = {};
42
+ struct timeval tv;
43
+ struct io_uring ring;
44
+ struct io_uring_sqe *sqe;
45
+ int ret;
46
+
47
+ if (argc > 1)
48
+ return 0;
49
+
50
+ p.flags = IORING_SETUP_SQPOLL;
51
+ p.sq_thread_idle = 100;
52
+
53
+ ret = io_uring_queue_init_params(1, &ring, &p);
54
+ if (ret) {
55
+ if (geteuid()) {
56
+ printf("%s: skipped, not root\n", argv[0]);
57
+ return 0;
58
+ }
59
+ fprintf(stderr, "queue_init=%d\n", ret);
60
+ return 1;
61
+ }
62
+
63
+ if (!(p.features & IORING_FEAT_SQPOLL_NONFIXED)) {
64
+ fprintf(stdout, "Skipping\n");
65
+ return 0;
66
+ }
67
+
68
+ sqe = io_uring_get_sqe(&ring);
69
+ io_uring_prep_poll_add(sqe, ring.ring_fd, POLLIN);
70
+ io_uring_submit(&ring);
71
+
72
+ gettimeofday(&tv, NULL);
73
+ do {
74
+ usleep(1000);
75
+ } while (mtime_since_now(&tv) < 1000);
76
+
77
+ return 0;
78
+ }
@@ -0,0 +1,69 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test that the sqthread goes to sleep around the specified time, and that
4
+ * the NEED_WAKEUP flag is then set.
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <stdlib.h>
9
+ #include <unistd.h>
10
+ #include <sys/time.h>
11
+ #include "liburing.h"
12
+
13
+ static unsigned long long mtime_since(const struct timeval *s,
14
+ const struct timeval *e)
15
+ {
16
+ long long sec, usec;
17
+
18
+ sec = e->tv_sec - s->tv_sec;
19
+ usec = (e->tv_usec - s->tv_usec);
20
+ if (sec > 0 && usec < 0) {
21
+ sec--;
22
+ usec += 1000000;
23
+ }
24
+
25
+ sec *= 1000;
26
+ usec /= 1000;
27
+ return sec + usec;
28
+ }
29
+
30
+ static unsigned long long mtime_since_now(struct timeval *tv)
31
+ {
32
+ struct timeval end;
33
+
34
+ gettimeofday(&end, NULL);
35
+ return mtime_since(tv, &end);
36
+ }
37
+
38
+ int main(int argc, char *argv[])
39
+ {
40
+ struct io_uring_params p = {};
41
+ struct timeval tv;
42
+ struct io_uring ring;
43
+ int ret;
44
+
45
+ if (argc > 1)
46
+ return 0;
47
+
48
+ p.flags = IORING_SETUP_SQPOLL;
49
+ p.sq_thread_idle = 100;
50
+
51
+ ret = io_uring_queue_init_params(1, &ring, &p);
52
+ if (ret) {
53
+ if (geteuid()) {
54
+ printf("%s: skipped, not root\n", argv[0]);
55
+ return 0;
56
+ }
57
+ fprintf(stderr, "queue_init=%d\n", ret);
58
+ return 1;
59
+ }
60
+
61
+ gettimeofday(&tv, NULL);
62
+ do {
63
+ usleep(1000);
64
+ if ((*ring.sq.kflags) & IORING_SQ_NEED_WAKEUP)
65
+ return 0;
66
+ } while (mtime_since_now(&tv) < 1000);
67
+
68
+ return 1;
69
+ }
@@ -0,0 +1,172 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: run various statx(2) tests
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+ #include <sys/types.h>
13
+ #include <sys/syscall.h>
14
+ #include <sys/stat.h>
15
+
16
+ #include "helpers.h"
17
+ #include "liburing.h"
18
+
19
+ #ifdef __NR_statx
20
+ static int do_statx(int dfd, const char *path, int flags, unsigned mask,
21
+ struct statx *statxbuf)
22
+ {
23
+ return syscall(__NR_statx, dfd, path, flags, mask, statxbuf);
24
+ }
25
+ #else
26
+ static int do_statx(int dfd, const char *path, int flags, unsigned mask,
27
+ struct statx *statxbuf)
28
+ {
29
+ errno = ENOSYS;
30
+ return -1;
31
+ }
32
+ #endif
33
+
34
+ static int statx_syscall_supported(void)
35
+ {
36
+ return errno == ENOSYS ? 0 : -1;
37
+ }
38
+
39
+ static int test_statx(struct io_uring *ring, const char *path)
40
+ {
41
+ struct io_uring_cqe *cqe;
42
+ struct io_uring_sqe *sqe;
43
+ struct statx x1 = { }, x2 = { };
44
+ int ret;
45
+
46
+ sqe = io_uring_get_sqe(ring);
47
+ if (!sqe) {
48
+ fprintf(stderr, "get sqe failed\n");
49
+ goto err;
50
+ }
51
+ io_uring_prep_statx(sqe, -1, path, 0, STATX_ALL, &x1);
52
+
53
+ ret = io_uring_submit(ring);
54
+ if (ret <= 0) {
55
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
56
+ goto err;
57
+ }
58
+
59
+ ret = io_uring_wait_cqe(ring, &cqe);
60
+ if (ret < 0) {
61
+ fprintf(stderr, "wait completion %d\n", ret);
62
+ goto err;
63
+ }
64
+ ret = cqe->res;
65
+ io_uring_cqe_seen(ring, cqe);
66
+ if (ret)
67
+ return ret;
68
+ ret = do_statx(-1, path, 0, STATX_ALL, &x2);
69
+ if (ret < 0)
70
+ return statx_syscall_supported();
71
+ if (memcmp(&x1, &x2, sizeof(x1))) {
72
+ fprintf(stderr, "Miscompare between io_uring and statx\n");
73
+ goto err;
74
+ }
75
+ return 0;
76
+ err:
77
+ return -1;
78
+ }
79
+
80
+ static int test_statx_fd(struct io_uring *ring, const char *path)
81
+ {
82
+ struct io_uring_cqe *cqe;
83
+ struct io_uring_sqe *sqe;
84
+ struct statx x1, x2;
85
+ int ret, fd;
86
+
87
+ fd = open(path, O_RDONLY);
88
+ if (fd < 0) {
89
+ perror("open");
90
+ return 1;
91
+ }
92
+
93
+ memset(&x1, 0, sizeof(x1));
94
+
95
+ sqe = io_uring_get_sqe(ring);
96
+ if (!sqe) {
97
+ fprintf(stderr, "get sqe failed\n");
98
+ goto err;
99
+ }
100
+ io_uring_prep_statx(sqe, fd, "", AT_EMPTY_PATH, STATX_ALL, &x1);
101
+
102
+ ret = io_uring_submit(ring);
103
+ if (ret <= 0) {
104
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
105
+ goto err;
106
+ }
107
+
108
+ ret = io_uring_wait_cqe(ring, &cqe);
109
+ if (ret < 0) {
110
+ fprintf(stderr, "wait completion %d\n", ret);
111
+ goto err;
112
+ }
113
+ ret = cqe->res;
114
+ io_uring_cqe_seen(ring, cqe);
115
+ if (ret)
116
+ return ret;
117
+ memset(&x2, 0, sizeof(x2));
118
+ ret = do_statx(fd, "", AT_EMPTY_PATH, STATX_ALL, &x2);
119
+ if (ret < 0)
120
+ return statx_syscall_supported();
121
+ if (memcmp(&x1, &x2, sizeof(x1))) {
122
+ fprintf(stderr, "Miscompare between io_uring and statx\n");
123
+ goto err;
124
+ }
125
+ return 0;
126
+ err:
127
+ return -1;
128
+ }
129
+
130
+ int main(int argc, char *argv[])
131
+ {
132
+ struct io_uring ring;
133
+ const char *fname;
134
+ int ret;
135
+
136
+ ret = io_uring_queue_init(8, &ring, 0);
137
+ if (ret) {
138
+ fprintf(stderr, "ring setup failed\n");
139
+ return 1;
140
+ }
141
+
142
+ if (argc > 1) {
143
+ fname = argv[1];
144
+ } else {
145
+ fname = "/tmp/.statx";
146
+ t_create_file(fname, 4096);
147
+ }
148
+
149
+ ret = test_statx(&ring, fname);
150
+ if (ret) {
151
+ if (ret == -EINVAL) {
152
+ fprintf(stdout, "statx not supported, skipping\n");
153
+ goto done;
154
+ }
155
+ fprintf(stderr, "test_statx failed: %d\n", ret);
156
+ goto err;
157
+ }
158
+
159
+ ret = test_statx_fd(&ring, fname);
160
+ if (ret) {
161
+ fprintf(stderr, "test_statx_fd failed: %d\n", ret);
162
+ goto err;
163
+ }
164
+ done:
165
+ if (fname != argv[1])
166
+ unlink(fname);
167
+ return 0;
168
+ err:
169
+ if (fname != argv[1])
170
+ unlink(fname);
171
+ return 1;
172
+ }