polyphony 0.94 → 0.95

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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +2 -2
  3. data/.gitignore +3 -3
  4. data/CHANGELOG.md +14 -0
  5. data/docs/api-reference/fiber.md +2 -2
  6. data/docs/api-reference/object.md +3 -3
  7. data/docs/main-concepts/exception-handling.md +2 -2
  8. data/ext/polyphony/backend_common.c +3 -3
  9. data/ext/polyphony/backend_io_uring.c +18 -16
  10. data/ext/polyphony/event.c +1 -1
  11. data/ext/polyphony/extconf.rb +5 -3
  12. data/ext/polyphony/fiber.c +5 -13
  13. data/ext/polyphony/io_extensions.c +1 -1
  14. data/ext/polyphony/pipe.c +1 -1
  15. data/ext/polyphony/polyphony.c +1 -1
  16. data/ext/polyphony/polyphony_ext.c +1 -1
  17. data/ext/polyphony/queue.c +1 -1
  18. data/ext/polyphony/ring_buffer.c +1 -0
  19. data/ext/polyphony/socket_extensions.c +1 -1
  20. data/ext/polyphony/thread.c +1 -1
  21. data/lib/polyphony/extensions/enumerator.rb +16 -0
  22. data/lib/polyphony/extensions/socket.rb +2 -0
  23. data/lib/polyphony/extensions.rb +1 -0
  24. data/lib/polyphony/version.rb +1 -1
  25. data/polyphony.gemspec +2 -2
  26. data/test/test_backend.rb +5 -1
  27. data/test/test_enumerator.rb +46 -0
  28. data/test/test_io.rb +241 -216
  29. data/test/test_socket.rb +1 -1
  30. data/test/test_thread_pool.rb +3 -3
  31. data/vendor/liburing/.github/workflows/build.yml +51 -5
  32. data/vendor/liburing/.github/workflows/shellcheck.yml +1 -1
  33. data/vendor/liburing/.gitignore +6 -123
  34. data/vendor/liburing/CHANGELOG +35 -0
  35. data/vendor/liburing/CITATION.cff +11 -0
  36. data/vendor/liburing/LICENSE +16 -3
  37. data/vendor/liburing/Makefile +3 -1
  38. data/vendor/liburing/Makefile.common +1 -0
  39. data/vendor/liburing/README +14 -2
  40. data/vendor/liburing/SECURITY.md +6 -0
  41. data/vendor/liburing/configure +16 -15
  42. data/vendor/liburing/examples/Makefile +4 -1
  43. data/vendor/liburing/examples/io_uring-udp.c +395 -0
  44. data/vendor/liburing/examples/poll-bench.c +101 -0
  45. data/vendor/liburing/examples/send-zerocopy.c +339 -0
  46. data/vendor/liburing/liburing.spec +1 -1
  47. data/vendor/liburing/man/io_uring.7 +38 -11
  48. data/vendor/liburing/man/io_uring_buf_ring_add.3 +53 -0
  49. data/vendor/liburing/man/io_uring_buf_ring_advance.3 +31 -0
  50. data/vendor/liburing/man/io_uring_buf_ring_cq_advance.3 +41 -0
  51. data/vendor/liburing/man/io_uring_buf_ring_init.3 +30 -0
  52. data/vendor/liburing/man/io_uring_buf_ring_mask.3 +27 -0
  53. data/vendor/liburing/man/io_uring_cq_advance.3 +29 -15
  54. data/vendor/liburing/man/io_uring_cq_has_overflow.3 +25 -0
  55. data/vendor/liburing/man/io_uring_cq_ready.3 +9 -8
  56. data/vendor/liburing/man/io_uring_cqe_get_data.3 +32 -13
  57. data/vendor/liburing/man/io_uring_cqe_get_data64.3 +1 -0
  58. data/vendor/liburing/man/io_uring_cqe_seen.3 +22 -12
  59. data/vendor/liburing/man/io_uring_enter.2 +249 -32
  60. data/vendor/liburing/man/io_uring_enter2.2 +1 -0
  61. data/vendor/liburing/man/io_uring_free_probe.3 +11 -8
  62. data/vendor/liburing/man/io_uring_get_events.3 +33 -0
  63. data/vendor/liburing/man/io_uring_get_probe.3 +9 -8
  64. data/vendor/liburing/man/io_uring_get_sqe.3 +29 -10
  65. data/vendor/liburing/man/io_uring_opcode_supported.3 +11 -10
  66. data/vendor/liburing/man/io_uring_peek_cqe.3 +38 -0
  67. data/vendor/liburing/man/io_uring_prep_accept.3 +197 -0
  68. data/vendor/liburing/man/io_uring_prep_accept_direct.3 +1 -0
  69. data/vendor/liburing/man/io_uring_prep_cancel.3 +118 -0
  70. data/vendor/liburing/man/io_uring_prep_cancel64.3 +1 -0
  71. data/vendor/liburing/man/io_uring_prep_close.3 +59 -0
  72. data/vendor/liburing/man/io_uring_prep_close_direct.3 +1 -0
  73. data/vendor/liburing/man/io_uring_prep_connect.3 +66 -0
  74. data/vendor/liburing/man/io_uring_prep_fadvise.3 +59 -0
  75. data/vendor/liburing/man/io_uring_prep_fallocate.3 +59 -0
  76. data/vendor/liburing/man/io_uring_prep_files_update.3 +92 -0
  77. data/vendor/liburing/man/io_uring_prep_fsync.3 +70 -0
  78. data/vendor/liburing/man/io_uring_prep_link.3 +1 -0
  79. data/vendor/liburing/man/io_uring_prep_linkat.3 +91 -0
  80. data/vendor/liburing/man/io_uring_prep_madvise.3 +56 -0
  81. data/vendor/liburing/man/io_uring_prep_mkdir.3 +1 -0
  82. data/vendor/liburing/man/io_uring_prep_mkdirat.3 +83 -0
  83. data/vendor/liburing/man/io_uring_prep_msg_ring.3 +39 -25
  84. data/vendor/liburing/man/io_uring_prep_multishot_accept.3 +1 -0
  85. data/vendor/liburing/man/io_uring_prep_multishot_accept_direct.3 +1 -0
  86. data/vendor/liburing/man/io_uring_prep_nop.3 +28 -0
  87. data/vendor/liburing/man/io_uring_prep_openat.3 +117 -0
  88. data/vendor/liburing/man/io_uring_prep_openat2.3 +117 -0
  89. data/vendor/liburing/man/io_uring_prep_openat2_direct.3 +1 -0
  90. data/vendor/liburing/man/io_uring_prep_openat_direct.3 +1 -0
  91. data/vendor/liburing/man/io_uring_prep_poll_add.3 +72 -0
  92. data/vendor/liburing/man/io_uring_prep_poll_multishot.3 +1 -0
  93. data/vendor/liburing/man/io_uring_prep_poll_remove.3 +55 -0
  94. data/vendor/liburing/man/io_uring_prep_poll_update.3 +89 -0
  95. data/vendor/liburing/man/io_uring_prep_provide_buffers.3 +131 -0
  96. data/vendor/liburing/man/io_uring_prep_read.3 +33 -14
  97. data/vendor/liburing/man/io_uring_prep_read_fixed.3 +39 -21
  98. data/vendor/liburing/man/io_uring_prep_readv.3 +49 -15
  99. data/vendor/liburing/man/io_uring_prep_readv2.3 +49 -17
  100. data/vendor/liburing/man/io_uring_prep_recv.3 +105 -0
  101. data/vendor/liburing/man/io_uring_prep_recv_multishot.3 +1 -0
  102. data/vendor/liburing/man/io_uring_prep_recvmsg.3 +124 -0
  103. data/vendor/liburing/man/io_uring_prep_recvmsg_multishot.3 +1 -0
  104. data/vendor/liburing/man/io_uring_prep_remove_buffers.3 +52 -0
  105. data/vendor/liburing/man/io_uring_prep_rename.3 +1 -0
  106. data/vendor/liburing/man/io_uring_prep_renameat.3 +96 -0
  107. data/vendor/liburing/man/io_uring_prep_send.3 +57 -0
  108. data/vendor/liburing/man/io_uring_prep_send_zc.3 +64 -0
  109. data/vendor/liburing/man/io_uring_prep_sendmsg.3 +69 -0
  110. data/vendor/liburing/man/io_uring_prep_shutdown.3 +53 -0
  111. data/vendor/liburing/man/io_uring_prep_socket.3 +118 -0
  112. data/vendor/liburing/man/io_uring_prep_socket_direct.3 +1 -0
  113. data/vendor/liburing/man/io_uring_prep_socket_direct_alloc.3 +1 -0
  114. data/vendor/liburing/man/io_uring_prep_splice.3 +80 -0
  115. data/vendor/liburing/man/io_uring_prep_statx.3 +74 -0
  116. data/vendor/liburing/man/io_uring_prep_symlink.3 +1 -0
  117. data/vendor/liburing/man/io_uring_prep_symlinkat.3 +85 -0
  118. data/vendor/liburing/man/io_uring_prep_sync_file_range.3 +59 -0
  119. data/vendor/liburing/man/io_uring_prep_tee.3 +74 -0
  120. data/vendor/liburing/man/io_uring_prep_timeout.3 +95 -0
  121. data/vendor/liburing/man/io_uring_prep_timeout_remove.3 +1 -0
  122. data/vendor/liburing/man/io_uring_prep_timeout_update.3 +98 -0
  123. data/vendor/liburing/man/io_uring_prep_unlink.3 +1 -0
  124. data/vendor/liburing/man/io_uring_prep_unlinkat.3 +82 -0
  125. data/vendor/liburing/man/io_uring_prep_write.3 +32 -15
  126. data/vendor/liburing/man/io_uring_prep_write_fixed.3 +39 -21
  127. data/vendor/liburing/man/io_uring_prep_writev.3 +50 -16
  128. data/vendor/liburing/man/io_uring_prep_writev2.3 +50 -17
  129. data/vendor/liburing/man/io_uring_queue_exit.3 +3 -4
  130. data/vendor/liburing/man/io_uring_queue_init.3 +58 -13
  131. data/vendor/liburing/man/io_uring_queue_init_params.3 +1 -0
  132. data/vendor/liburing/man/io_uring_recvmsg_cmsg_firsthdr.3 +1 -0
  133. data/vendor/liburing/man/io_uring_recvmsg_cmsg_nexthdr.3 +1 -0
  134. data/vendor/liburing/man/io_uring_recvmsg_name.3 +1 -0
  135. data/vendor/liburing/man/io_uring_recvmsg_out.3 +78 -0
  136. data/vendor/liburing/man/io_uring_recvmsg_payload.3 +1 -0
  137. data/vendor/liburing/man/io_uring_recvmsg_payload_length.3 +1 -0
  138. data/vendor/liburing/man/io_uring_recvmsg_validate.3 +1 -0
  139. data/vendor/liburing/man/io_uring_register.2 +153 -13
  140. data/vendor/liburing/man/io_uring_register_buf_ring.3 +140 -0
  141. data/vendor/liburing/man/io_uring_register_buffers.3 +32 -12
  142. data/vendor/liburing/man/io_uring_register_eventfd.3 +51 -0
  143. data/vendor/liburing/man/io_uring_register_eventfd_async.3 +1 -0
  144. data/vendor/liburing/man/io_uring_register_file_alloc_range.3 +52 -0
  145. data/vendor/liburing/man/io_uring_register_files.3 +33 -11
  146. data/vendor/liburing/man/io_uring_register_files_sparse.3 +1 -0
  147. data/vendor/liburing/man/io_uring_register_iowq_aff.3 +61 -0
  148. data/vendor/liburing/man/io_uring_register_iowq_max_workers.3 +71 -0
  149. data/vendor/liburing/man/io_uring_register_ring_fd.3 +49 -0
  150. data/vendor/liburing/man/io_uring_register_sync_cancel.3 +71 -0
  151. data/vendor/liburing/man/io_uring_setup.2 +119 -13
  152. data/vendor/liburing/man/io_uring_sq_ready.3 +14 -8
  153. data/vendor/liburing/man/io_uring_sq_space_left.3 +9 -9
  154. data/vendor/liburing/man/io_uring_sqe_set_data.3 +29 -11
  155. data/vendor/liburing/man/io_uring_sqe_set_data64.3 +1 -0
  156. data/vendor/liburing/man/io_uring_sqe_set_flags.3 +38 -11
  157. data/vendor/liburing/man/io_uring_sqring_wait.3 +13 -9
  158. data/vendor/liburing/man/io_uring_submit.3 +29 -12
  159. data/vendor/liburing/man/io_uring_submit_and_get_events.3 +31 -0
  160. data/vendor/liburing/man/io_uring_submit_and_wait.3 +16 -12
  161. data/vendor/liburing/man/io_uring_submit_and_wait_timeout.3 +30 -23
  162. data/vendor/liburing/man/io_uring_unregister_buf_ring.3 +30 -0
  163. data/vendor/liburing/man/io_uring_unregister_buffers.3 +11 -10
  164. data/vendor/liburing/man/io_uring_unregister_eventfd.3 +1 -0
  165. data/vendor/liburing/man/io_uring_unregister_files.3 +11 -10
  166. data/vendor/liburing/man/io_uring_unregister_iowq_aff.3 +1 -0
  167. data/vendor/liburing/man/io_uring_unregister_ring_fd.3 +32 -0
  168. data/vendor/liburing/man/io_uring_wait_cqe.3 +19 -12
  169. data/vendor/liburing/man/io_uring_wait_cqe_nr.3 +21 -14
  170. data/vendor/liburing/man/io_uring_wait_cqe_timeout.3 +27 -13
  171. data/vendor/liburing/man/io_uring_wait_cqes.3 +24 -14
  172. data/vendor/liburing/src/Makefile +8 -7
  173. data/vendor/liburing/src/arch/aarch64/lib.h +48 -0
  174. data/vendor/liburing/src/arch/aarch64/syscall.h +0 -4
  175. data/vendor/liburing/src/arch/generic/lib.h +0 -4
  176. data/vendor/liburing/src/arch/generic/syscall.h +29 -16
  177. data/vendor/liburing/src/arch/syscall-defs.h +41 -14
  178. data/vendor/liburing/src/arch/x86/lib.h +0 -21
  179. data/vendor/liburing/src/arch/x86/syscall.h +146 -10
  180. data/vendor/liburing/src/include/liburing/io_uring.h +245 -5
  181. data/vendor/liburing/src/include/liburing.h +468 -35
  182. data/vendor/liburing/src/int_flags.h +1 -0
  183. data/vendor/liburing/src/lib.h +20 -16
  184. data/vendor/liburing/src/liburing.map +16 -0
  185. data/vendor/liburing/src/nolibc.c +1 -1
  186. data/vendor/liburing/src/queue.c +87 -55
  187. data/vendor/liburing/src/register.c +129 -53
  188. data/vendor/liburing/src/setup.c +65 -28
  189. data/vendor/liburing/src/syscall.c +14 -32
  190. data/vendor/liburing/src/syscall.h +12 -64
  191. data/vendor/liburing/test/{232c93d07b74-test.c → 232c93d07b74.c} +8 -9
  192. data/vendor/liburing/test/{35fa71a030ca-test.c → 35fa71a030ca.c} +4 -4
  193. data/vendor/liburing/test/{500f9fbadef8-test.c → 500f9fbadef8.c} +7 -7
  194. data/vendor/liburing/test/{7ad0e4b2f83c-test.c → 7ad0e4b2f83c.c} +8 -7
  195. data/vendor/liburing/test/{8a9973408177-test.c → 8a9973408177.c} +4 -3
  196. data/vendor/liburing/test/{917257daa0fe-test.c → 917257daa0fe.c} +3 -2
  197. data/vendor/liburing/test/Makefile +60 -62
  198. data/vendor/liburing/test/{a0908ae19763-test.c → a0908ae19763.c} +3 -2
  199. data/vendor/liburing/test/{a4c0b3decb33-test.c → a4c0b3decb33.c} +3 -2
  200. data/vendor/liburing/test/accept-link.c +5 -4
  201. data/vendor/liburing/test/accept-reuse.c +17 -16
  202. data/vendor/liburing/test/accept-test.c +14 -10
  203. data/vendor/liburing/test/accept.c +529 -107
  204. data/vendor/liburing/test/across-fork.c +7 -6
  205. data/vendor/liburing/test/{b19062a56726-test.c → b19062a56726.c} +3 -2
  206. data/vendor/liburing/test/{b5837bd5311d-test.c → b5837bd5311d.c} +10 -9
  207. data/vendor/liburing/test/buf-ring.c +420 -0
  208. data/vendor/liburing/test/{ce593a6c480a-test.c → ce593a6c480a.c} +15 -12
  209. data/vendor/liburing/test/connect.c +8 -7
  210. data/vendor/liburing/test/cq-full.c +5 -4
  211. data/vendor/liburing/test/cq-overflow.c +242 -12
  212. data/vendor/liburing/test/cq-peek-batch.c +5 -4
  213. data/vendor/liburing/test/cq-ready.c +5 -4
  214. data/vendor/liburing/test/cq-size.c +5 -4
  215. data/vendor/liburing/test/{d4ae271dfaae-test.c → d4ae271dfaae.c} +2 -2
  216. data/vendor/liburing/test/{d77a67ed5f27-test.c → d77a67ed5f27.c} +6 -6
  217. data/vendor/liburing/test/defer-taskrun.c +336 -0
  218. data/vendor/liburing/test/defer.c +26 -14
  219. data/vendor/liburing/test/double-poll-crash.c +15 -5
  220. data/vendor/liburing/test/drop-submit.c +5 -3
  221. data/vendor/liburing/test/{eeed8b54e0df-test.c → eeed8b54e0df.c} +7 -6
  222. data/vendor/liburing/test/empty-eownerdead.c +4 -4
  223. data/vendor/liburing/test/eventfd-disable.c +48 -20
  224. data/vendor/liburing/test/eventfd-reg.c +10 -9
  225. data/vendor/liburing/test/eventfd-ring.c +13 -12
  226. data/vendor/liburing/test/eventfd.c +13 -12
  227. data/vendor/liburing/test/exit-no-cleanup.c +1 -1
  228. data/vendor/liburing/test/fadvise.c +3 -3
  229. data/vendor/liburing/test/fallocate.c +16 -9
  230. data/vendor/liburing/test/{fc2a85cb02ef-test.c → fc2a85cb02ef.c} +4 -3
  231. data/vendor/liburing/test/fd-pass.c +187 -0
  232. data/vendor/liburing/test/file-register.c +302 -36
  233. data/vendor/liburing/test/file-update.c +62 -4
  234. data/vendor/liburing/test/file-verify.c +6 -2
  235. data/vendor/liburing/test/files-exit-hang-poll.c +11 -25
  236. data/vendor/liburing/test/files-exit-hang-timeout.c +13 -10
  237. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  238. data/vendor/liburing/test/fixed-link.c +10 -10
  239. data/vendor/liburing/test/fixed-reuse.c +160 -0
  240. data/vendor/liburing/test/fpos.c +6 -3
  241. data/vendor/liburing/test/fsync.c +3 -3
  242. data/vendor/liburing/test/hardlink.c +10 -6
  243. data/vendor/liburing/test/helpers.c +137 -4
  244. data/vendor/liburing/test/helpers.h +27 -0
  245. data/vendor/liburing/test/io-cancel.c +16 -11
  246. data/vendor/liburing/test/io_uring_enter.c +46 -81
  247. data/vendor/liburing/test/io_uring_passthrough.c +451 -0
  248. data/vendor/liburing/test/io_uring_register.c +59 -229
  249. data/vendor/liburing/test/io_uring_setup.c +24 -29
  250. data/vendor/liburing/test/iopoll-leak.c +85 -0
  251. data/vendor/liburing/test/iopoll.c +16 -9
  252. data/vendor/liburing/test/lfs-openat-write.c +3 -1
  253. data/vendor/liburing/test/link-timeout.c +4 -3
  254. data/vendor/liburing/test/link.c +8 -7
  255. data/vendor/liburing/test/madvise.c +2 -2
  256. data/vendor/liburing/test/mkdir.c +9 -5
  257. data/vendor/liburing/test/msg-ring.c +46 -20
  258. data/vendor/liburing/test/multicqes_drain.c +51 -12
  259. data/vendor/liburing/test/nolibc.c +60 -0
  260. data/vendor/liburing/test/nop.c +78 -16
  261. data/vendor/liburing/test/nvme.h +168 -0
  262. data/vendor/liburing/test/open-direct-link.c +188 -0
  263. data/vendor/liburing/test/open-direct-pick.c +180 -0
  264. data/vendor/liburing/test/openat2.c +3 -3
  265. data/vendor/liburing/test/poll-cancel-all.c +472 -0
  266. data/vendor/liburing/test/poll-link.c +9 -18
  267. data/vendor/liburing/test/poll-mshot-overflow.c +162 -0
  268. data/vendor/liburing/test/poll-mshot-update.c +83 -33
  269. data/vendor/liburing/test/pollfree.c +2 -2
  270. data/vendor/liburing/test/read-before-exit.c +112 -0
  271. data/vendor/liburing/test/read-write.c +83 -1
  272. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  273. data/vendor/liburing/test/recv-msgall.c +265 -0
  274. data/vendor/liburing/test/recv-multishot.c +505 -0
  275. data/vendor/liburing/test/rename.c +2 -5
  276. data/vendor/liburing/test/ring-leak.c +97 -0
  277. data/vendor/liburing/test/ringbuf-read.c +200 -0
  278. data/vendor/liburing/test/rsrc_tags.c +25 -13
  279. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  280. data/vendor/liburing/test/runtests.sh +18 -20
  281. data/vendor/liburing/test/rw_merge_test.c +3 -2
  282. data/vendor/liburing/test/send-zerocopy.c +684 -0
  283. data/vendor/liburing/test/send_recv.c +49 -2
  284. data/vendor/liburing/test/send_recvmsg.c +165 -55
  285. data/vendor/liburing/test/shutdown.c +3 -4
  286. data/vendor/liburing/test/sigfd-deadlock.c +22 -8
  287. data/vendor/liburing/test/single-issuer.c +171 -0
  288. data/vendor/liburing/test/socket-rw-eagain.c +2 -12
  289. data/vendor/liburing/test/socket-rw-offset.c +2 -11
  290. data/vendor/liburing/test/socket-rw.c +2 -11
  291. data/vendor/liburing/test/socket.c +409 -0
  292. data/vendor/liburing/test/sq-poll-dup.c +1 -1
  293. data/vendor/liburing/test/sq-poll-share.c +1 -1
  294. data/vendor/liburing/test/statx.c +2 -2
  295. data/vendor/liburing/test/submit-and-wait.c +108 -0
  296. data/vendor/liburing/test/submit-link-fail.c +5 -3
  297. data/vendor/liburing/test/submit-reuse.c +0 -2
  298. data/vendor/liburing/test/sync-cancel.c +235 -0
  299. data/vendor/liburing/test/test.h +35 -0
  300. data/vendor/liburing/test/timeout-overflow.c +11 -11
  301. data/vendor/liburing/test/timeout.c +7 -7
  302. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  303. data/vendor/liburing/test/unlink.c +1 -1
  304. data/vendor/liburing/test/xattr.c +425 -0
  305. metadata +143 -22
  306. data/Gemfile.lock +0 -78
@@ -0,0 +1,85 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test a mem leak with IOPOLL
4
+ */
5
+ #include <errno.h>
6
+ #include <stdio.h>
7
+ #include <unistd.h>
8
+ #include <stdlib.h>
9
+ #include <string.h>
10
+ #include <fcntl.h>
11
+ #include <sys/types.h>
12
+ #include <sys/wait.h>
13
+ #include "helpers.h"
14
+ #include "liburing.h"
15
+
16
+ #define FILE_SIZE (128 * 1024)
17
+ #define BS 4096
18
+ #define BUFFERS (FILE_SIZE / BS)
19
+
20
+ static int do_iopoll(const char *fname)
21
+ {
22
+ struct io_uring_sqe *sqe;
23
+ struct io_uring ring;
24
+ struct iovec *iov;
25
+ int fd;
26
+
27
+ fd = open(fname, O_RDONLY | O_DIRECT);
28
+ if (fd < 0) {
29
+ perror("open");
30
+ return T_EXIT_SKIP;
31
+ }
32
+
33
+ iov = t_create_buffers(1, 4096);
34
+
35
+ t_create_ring(2, &ring, IORING_SETUP_IOPOLL);
36
+
37
+ sqe = io_uring_get_sqe(&ring);
38
+ io_uring_prep_read(sqe, fd, iov->iov_base, iov->iov_len, 0);
39
+ io_uring_submit(&ring);
40
+
41
+ close(fd);
42
+ return T_EXIT_PASS;
43
+ }
44
+
45
+ static int test(const char *fname)
46
+ {
47
+ if (fork()) {
48
+ int stat;
49
+
50
+ wait(&stat);
51
+ return WEXITSTATUS(stat);
52
+ } else {
53
+ int ret;
54
+
55
+ ret = do_iopoll(fname);
56
+ exit(ret);
57
+ }
58
+ }
59
+
60
+ int main(int argc, char *argv[])
61
+ {
62
+ char buf[256];
63
+ char *fname;
64
+ int i, ret;
65
+
66
+ if (argc > 1) {
67
+ fname = argv[1];
68
+ } else {
69
+ srand((unsigned)time(NULL));
70
+ snprintf(buf, sizeof(buf), ".iopoll-leak-%u-%u",
71
+ (unsigned)rand(), (unsigned)getpid());
72
+ fname = buf;
73
+ t_create_file(fname, FILE_SIZE);
74
+ }
75
+
76
+ for (i = 0; i < 16; i++) {
77
+ ret = test(fname);
78
+ if (ret == T_EXIT_SKIP || ret == T_EXIT_FAIL)
79
+ break;
80
+ }
81
+
82
+ if (fname != argv[1])
83
+ unlink(fname);
84
+ return ret;
85
+ }
@@ -201,7 +201,7 @@ err:
201
201
  return 1;
202
202
  }
203
203
 
204
- extern int __io_uring_flush_sq(struct io_uring *ring);
204
+ extern unsigned __io_uring_flush_sq(struct io_uring *ring);
205
205
 
206
206
  /*
207
207
  * if we are polling io_uring_submit needs to always enter the
@@ -274,7 +274,7 @@ ok:
274
274
  }
275
275
 
276
276
  static int test_io(const char *file, int write, int sqthread, int fixed,
277
- int buf_select)
277
+ int buf_select, int defer)
278
278
  {
279
279
  struct io_uring ring;
280
280
  int ret, ring_flags = IORING_SETUP_IOPOLL;
@@ -282,6 +282,10 @@ static int test_io(const char *file, int write, int sqthread, int fixed,
282
282
  if (no_iopoll)
283
283
  return 0;
284
284
 
285
+ if (defer)
286
+ ring_flags |= IORING_SETUP_SINGLE_ISSUER |
287
+ IORING_SETUP_DEFER_TASKRUN;
288
+
285
289
  ret = t_create_ring(64, &ring, ring_flags);
286
290
  if (ret == T_SETUP_SKIP)
287
291
  return 0;
@@ -323,7 +327,7 @@ int main(int argc, char *argv[])
323
327
  char *fname;
324
328
 
325
329
  if (probe_buf_select())
326
- return 1;
330
+ return T_EXIT_FAIL;
327
331
 
328
332
  if (argc > 1) {
329
333
  fname = argv[1];
@@ -337,19 +341,22 @@ int main(int argc, char *argv[])
337
341
 
338
342
  vecs = t_create_buffers(BUFFERS, BS);
339
343
 
340
- nr = 16;
344
+ nr = 32;
341
345
  if (no_buf_select)
342
346
  nr = 8;
347
+ else if (!t_probe_defer_taskrun())
348
+ nr = 16;
343
349
  for (i = 0; i < nr; i++) {
344
350
  int write = (i & 1) != 0;
345
351
  int sqthread = (i & 2) != 0;
346
352
  int fixed = (i & 4) != 0;
347
353
  int buf_select = (i & 8) != 0;
354
+ int defer = (i & 16) != 0;
348
355
 
349
- ret = test_io(fname, write, sqthread, fixed, buf_select);
356
+ ret = test_io(fname, write, sqthread, fixed, buf_select, defer);
350
357
  if (ret) {
351
- fprintf(stderr, "test_io failed %d/%d/%d/%d\n",
352
- write, sqthread, fixed, buf_select);
358
+ fprintf(stderr, "test_io failed %d/%d/%d/%d/%d\n",
359
+ write, sqthread, fixed, buf_select, defer);
353
360
  goto err;
354
361
  }
355
362
  if (no_iopoll)
@@ -364,9 +371,9 @@ int main(int argc, char *argv[])
364
371
 
365
372
  if (fname != argv[1])
366
373
  unlink(fname);
367
- return 0;
374
+ return T_EXIT_PASS;
368
375
  err:
369
376
  if (fname != argv[1])
370
377
  unlink(fname);
371
- return 1;
378
+ return T_EXIT_FAIL;
372
379
  }
@@ -14,6 +14,8 @@
14
14
  #include <sys/resource.h>
15
15
  #include <unistd.h>
16
16
 
17
+ #include "helpers.h"
18
+
17
19
  static const int RSIZE = 2;
18
20
  static const int OPEN_FLAGS = O_RDWR | O_CREAT;
19
21
  static const mode_t OPEN_MODE = S_IRUSR | S_IWUSR;
@@ -100,7 +102,7 @@ int main(int argc, char *argv[])
100
102
  int dfd, ret;
101
103
 
102
104
  if (argc > 1)
103
- return 0;
105
+ return T_EXIT_SKIP;
104
106
 
105
107
  dfd = open("/tmp", O_RDONLY | O_DIRECTORY);
106
108
  if (dfd < 0)
@@ -12,6 +12,7 @@
12
12
  #include <poll.h>
13
13
 
14
14
  #include "liburing.h"
15
+ #include "helpers.h"
15
16
 
16
17
  static int test_fail_lone_link_timeouts(struct io_uring *ring)
17
18
  {
@@ -1011,12 +1012,12 @@ int main(int argc, char *argv[])
1011
1012
  int ret;
1012
1013
 
1013
1014
  if (argc > 1)
1014
- return 0;
1015
+ return T_EXIT_SKIP;
1015
1016
 
1016
1017
  ret = io_uring_queue_init(8, &ring, 0);
1017
1018
  if (ret) {
1018
1019
  printf("ring setup failed\n");
1019
- return 1;
1020
+ return T_EXIT_FAIL;
1020
1021
  }
1021
1022
 
1022
1023
  ret = test_timeout_link_chain1(&ring);
@@ -1103,5 +1104,5 @@ int main(int argc, char *argv[])
1103
1104
  return ret;
1104
1105
  }
1105
1106
 
1106
- return 0;
1107
+ return T_EXIT_PASS;
1107
1108
  }
@@ -11,6 +11,7 @@
11
11
  #include <fcntl.h>
12
12
 
13
13
  #include "liburing.h"
14
+ #include "helpers.h"
14
15
 
15
16
  static int no_hardlink;
16
17
 
@@ -178,7 +179,7 @@ static int test_single_link_fail(struct io_uring *ring)
178
179
  goto err;
179
180
  }
180
181
 
181
- io_uring_prep_nop(sqe);
182
+ io_uring_prep_remove_buffers(sqe, 10, 1);
182
183
  sqe->flags |= IOSQE_IO_LINK;
183
184
 
184
185
  sqe = io_uring_get_sqe(ring);
@@ -205,8 +206,8 @@ static int test_single_link_fail(struct io_uring *ring)
205
206
  printf("failed to get cqe\n");
206
207
  goto err;
207
208
  }
208
- if (i == 0 && cqe->res != -EINVAL) {
209
- printf("sqe0 failed with %d, wanted -EINVAL\n", cqe->res);
209
+ if (i == 0 && cqe->res != -ENOENT) {
210
+ printf("sqe0 failed with %d, wanted -ENOENT\n", cqe->res);
210
211
  goto err;
211
212
  }
212
213
  if (i == 1 && cqe->res != -ECANCELED) {
@@ -435,19 +436,19 @@ int main(int argc, char *argv[])
435
436
  int ret;
436
437
 
437
438
  if (argc > 1)
438
- return 0;
439
+ return T_EXIT_SKIP;
439
440
 
440
441
  ret = io_uring_queue_init(8, &ring, 0);
441
442
  if (ret) {
442
443
  printf("ring setup failed\n");
443
- return 1;
444
+ return T_EXIT_FAIL;
444
445
 
445
446
  }
446
447
 
447
448
  ret = io_uring_queue_init(8, &poll_ring, IORING_SETUP_IOPOLL);
448
449
  if (ret) {
449
450
  printf("poll_ring setup failed\n");
450
- return 1;
451
+ return T_EXIT_FAIL;
451
452
  }
452
453
 
453
454
  ret = test_single_link(&ring);
@@ -492,5 +493,5 @@ int main(int argc, char *argv[])
492
493
  return ret;
493
494
  }
494
495
 
495
- return 0;
496
+ return T_EXIT_PASS;
496
497
  }
@@ -187,9 +187,9 @@ int main(int argc, char *argv[])
187
187
  if (fname != argv[1])
188
188
  unlink(fname);
189
189
  io_uring_queue_exit(&ring);
190
- return 0;
190
+ return T_EXIT_PASS;
191
191
  err:
192
192
  if (fname != argv[1])
193
193
  unlink(fname);
194
- return 1;
194
+ return T_EXIT_FAIL;
195
195
  }
@@ -10,6 +10,7 @@
10
10
  #include <unistd.h>
11
11
 
12
12
  #include "liburing.h"
13
+ #include "helpers.h"
13
14
 
14
15
  static int do_mkdirat(struct io_uring *ring, const char *fn)
15
16
  {
@@ -59,7 +60,7 @@ int main(int argc, char *argv[])
59
60
  struct io_uring ring;
60
61
 
61
62
  if (argc > 1)
62
- return 0;
63
+ return T_EXIT_SKIP;
63
64
 
64
65
  ret = io_uring_queue_init(8, &ring, 0);
65
66
  if (ret) {
@@ -71,7 +72,7 @@ int main(int argc, char *argv[])
71
72
  if (ret < 0) {
72
73
  if (ret == -EBADF || ret == -EINVAL) {
73
74
  fprintf(stdout, "mkdirat not supported, skipping\n");
74
- goto out;
75
+ goto skip;
75
76
  }
76
77
  fprintf(stderr, "mkdirat: %s\n", strerror(-ret));
77
78
  goto err;
@@ -96,13 +97,16 @@ int main(int argc, char *argv[])
96
97
  goto err1;
97
98
  }
98
99
 
99
- out:
100
100
  unlinkat(AT_FDCWD, fn, AT_REMOVEDIR);
101
101
  io_uring_queue_exit(&ring);
102
- return 0;
102
+ return T_EXIT_PASS;
103
+ skip:
104
+ unlinkat(AT_FDCWD, fn, AT_REMOVEDIR);
105
+ io_uring_queue_exit(&ring);
106
+ return T_EXIT_SKIP;
103
107
  err1:
104
108
  unlinkat(AT_FDCWD, fn, AT_REMOVEDIR);
105
109
  err:
106
110
  io_uring_queue_exit(&ring);
107
- return 1;
111
+ return T_EXIT_FAIL;
108
112
  }
@@ -12,6 +12,7 @@
12
12
  #include <pthread.h>
13
13
 
14
14
  #include "liburing.h"
15
+ #include "helpers.h"
15
16
 
16
17
  static int no_msg;
17
18
 
@@ -54,10 +55,6 @@ static int test_own(struct io_uring *ring)
54
55
  }
55
56
  break;
56
57
  case 0x1234:
57
- if (!(cqe->flags & IORING_CQE_F_MSG)) {
58
- fprintf(stderr, "invalid flags %x\n", cqe->flags);
59
- return -1;
60
- }
61
58
  if (cqe->res != 0x10) {
62
59
  fprintf(stderr, "invalid len %x\n", cqe->res);
63
60
  return -1;
@@ -87,10 +84,6 @@ static void *wait_cqe_fn(void *data)
87
84
  goto err;
88
85
  }
89
86
 
90
- if (!(cqe->flags & IORING_CQE_F_MSG)) {
91
- fprintf(stderr, "invalid flags %x\n", cqe->flags);
92
- goto err;
93
- }
94
87
  if (cqe->user_data != 0x5aa5) {
95
88
  fprintf(stderr, "user_data %llx\n", (long long) cqe->user_data);
96
89
  goto err;
@@ -146,19 +139,30 @@ err:
146
139
  return 1;
147
140
  }
148
141
 
149
- static int test_invalid(struct io_uring *ring)
142
+ static int test_invalid(struct io_uring *ring, bool fixed)
150
143
  {
151
144
  struct io_uring_cqe *cqe;
152
145
  struct io_uring_sqe *sqe;
153
- int ret;
146
+ int ret, fd = 1;
154
147
 
155
148
  sqe = io_uring_get_sqe(ring);
156
149
  if (!sqe) {
157
150
  fprintf(stderr, "get sqe failed\n");
158
- goto err;
151
+ return 1;
152
+ }
153
+
154
+ if (fixed) {
155
+ ret = io_uring_register_files(ring, &fd, 1);
156
+ if (ret) {
157
+ fprintf(stderr, "file register %d\n", ret);
158
+ return 1;
159
+ }
160
+ io_uring_prep_msg_ring(sqe, 0, 0, 0x8989, 0);
161
+ sqe->flags |= IOSQE_FIXED_FILE;
162
+ } else {
163
+ io_uring_prep_msg_ring(sqe, 1, 0, 0x8989, 0);
159
164
  }
160
165
 
161
- io_uring_prep_msg_ring(sqe, 1, 0, 0x8989, 0);
162
166
  sqe->user_data = 1;
163
167
 
164
168
  ret = io_uring_submit(ring);
@@ -178,30 +182,39 @@ static int test_invalid(struct io_uring *ring)
178
182
  }
179
183
 
180
184
  io_uring_cqe_seen(ring, cqe);
185
+ if (fixed)
186
+ io_uring_unregister_files(ring);
181
187
  return 0;
182
188
  err:
189
+ if (fixed)
190
+ io_uring_unregister_files(ring);
183
191
  return 1;
184
192
  }
185
193
 
186
194
  int main(int argc, char *argv[])
187
195
  {
188
- struct io_uring ring, ring2;
196
+ struct io_uring ring, ring2, pring;
189
197
  pthread_t thread;
190
198
  void *tret;
191
- int ret;
199
+ int ret, i;
192
200
 
193
201
  if (argc > 1)
194
- return 0;
202
+ return T_EXIT_SKIP;
195
203
 
196
204
  ret = io_uring_queue_init(8, &ring, 0);
197
205
  if (ret) {
198
206
  fprintf(stderr, "ring setup failed: %d\n", ret);
199
- return 1;
207
+ return T_EXIT_FAIL;
200
208
  }
201
209
  ret = io_uring_queue_init(8, &ring2, 0);
202
210
  if (ret) {
203
211
  fprintf(stderr, "ring setup failed: %d\n", ret);
204
- return 1;
212
+ return T_EXIT_FAIL;
213
+ }
214
+ ret = io_uring_queue_init(8, &pring, IORING_SETUP_IOPOLL);
215
+ if (ret) {
216
+ fprintf(stderr, "ring setup failed: %d\n", ret);
217
+ return T_EXIT_FAIL;
205
218
  }
206
219
 
207
220
  ret = test_own(&ring);
@@ -211,15 +224,28 @@ int main(int argc, char *argv[])
211
224
  }
212
225
  if (no_msg) {
213
226
  fprintf(stdout, "Skipped\n");
214
- return 0;
227
+ return T_EXIT_SKIP;
228
+ }
229
+ ret = test_own(&pring);
230
+ if (ret) {
231
+ fprintf(stderr, "test_own iopoll failed\n");
232
+ return ret;
215
233
  }
216
234
 
217
- ret = test_invalid(&ring);
235
+ ret = test_invalid(&ring, 0);
218
236
  if (ret) {
219
237
  fprintf(stderr, "test_invalid failed\n");
220
238
  return ret;
221
239
  }
222
240
 
241
+ for (i = 0; i < 2; i++) {
242
+ ret = test_invalid(&ring, 1);
243
+ if (ret) {
244
+ fprintf(stderr, "test_invalid fixed failed\n");
245
+ return ret;
246
+ }
247
+ }
248
+
223
249
  pthread_create(&thread, NULL, wait_cqe_fn, &ring2);
224
250
 
225
251
  ret = test_remote(&ring, &ring2);
@@ -230,5 +256,5 @@ int main(int argc, char *argv[])
230
256
 
231
257
  pthread_join(thread, &tret);
232
258
 
233
- return 0;
259
+ return T_EXIT_PASS;
234
260
  }
@@ -17,6 +17,7 @@
17
17
  #include <poll.h>
18
18
 
19
19
  #include "liburing.h"
20
+ #include "helpers.h"
20
21
 
21
22
  enum {
22
23
  multi,
@@ -116,7 +117,7 @@ __u8 generate_flags(int sqe_op)
116
117
  /*
117
118
  * avoid below case:
118
119
  * sqe0(multishot, link)->sqe1(nop, link)->sqe2(nop)->sqe3(cancel_sqe0)
119
- * sqe3 may excute before sqe0 so that sqe0 isn't cancelled
120
+ * sqe3 may execute before sqe0 so that sqe0 isn't cancelled
120
121
  */
121
122
  if (sqe_op == multi)
122
123
  flags &= ~IOSQE_IO_LINK;
@@ -224,7 +225,7 @@ static int test_generic_drain(struct io_uring *ring)
224
225
  goto err;
225
226
  }
226
227
 
227
- sleep(4);
228
+ sleep(1);
228
229
  // TODO: randomize event triggerring order
229
230
  for (i = 0; i < max_entry; i++) {
230
231
  if (si[i].op != multi && si[i].op != single)
@@ -232,8 +233,10 @@ static int test_generic_drain(struct io_uring *ring)
232
233
 
233
234
  if (trigger_event(pipes[i]))
234
235
  goto err;
236
+
237
+ io_uring_get_events(ring);
235
238
  }
236
- sleep(5);
239
+ sleep(1);
237
240
  i = 0;
238
241
  while (!io_uring_peek_cqe(ring, &cqe)) {
239
242
  cqe_data[i] = cqe->user_data;
@@ -245,7 +248,7 @@ static int test_generic_drain(struct io_uring *ring)
245
248
  * compl_bits is a bit map to record completions.
246
249
  * eg. sqe[0], sqe[1], sqe[2] fully completed
247
250
  * then compl_bits is 000...00111b
248
- *
251
+ *
249
252
  */
250
253
  unsigned long long compl_bits = 0;
251
254
  for (j = 0; j < i; j++) {
@@ -294,7 +297,12 @@ static int test_simple_drain(struct io_uring *ring)
294
297
  io_uring_prep_poll_add(sqe[1], pipe2[0], POLLIN);
295
298
  sqe[1]->user_data = 1;
296
299
 
297
- ret = io_uring_submit(ring);
300
+ /* This test relies on multishot poll to trigger events continually.
301
+ * however with IORING_SETUP_DEFER_TASKRUN this will only happen when
302
+ * triggered with a get_events. Hence we sprinkle get_events whenever
303
+ * there might be work to process in order to get the same result
304
+ */
305
+ ret = io_uring_submit_and_get_events(ring);
298
306
  if (ret < 0) {
299
307
  printf("sqe submit failed\n");
300
308
  goto err;
@@ -306,9 +314,11 @@ static int test_simple_drain(struct io_uring *ring)
306
314
  for (i = 0; i < 2; i++) {
307
315
  if (trigger_event(pipe1))
308
316
  goto err;
317
+ io_uring_get_events(ring);
309
318
  }
310
319
  if (trigger_event(pipe2))
311
320
  goto err;
321
+ io_uring_get_events(ring);
312
322
 
313
323
  for (i = 0; i < 2; i++) {
314
324
  sqe[i] = io_uring_get_sqe(ring);
@@ -354,25 +364,27 @@ err:
354
364
  return 1;
355
365
  }
356
366
 
357
- int main(int argc, char *argv[])
367
+ static int test(bool defer_taskrun)
358
368
  {
359
369
  struct io_uring ring;
360
370
  int i, ret;
371
+ unsigned int flags = 0;
361
372
 
362
- if (argc > 1)
363
- return 0;
373
+ if (defer_taskrun)
374
+ flags = IORING_SETUP_SINGLE_ISSUER |
375
+ IORING_SETUP_DEFER_TASKRUN;
364
376
 
365
- ret = io_uring_queue_init(1024, &ring, 0);
377
+ ret = io_uring_queue_init(1024, &ring, flags);
366
378
  if (ret) {
367
379
  printf("ring setup failed\n");
368
- return 1;
380
+ return T_EXIT_FAIL;
369
381
  }
370
382
 
371
383
  for (i = 0; i < 5; i++) {
372
384
  ret = test_simple_drain(&ring);
373
385
  if (ret) {
374
386
  fprintf(stderr, "test_simple_drain failed\n");
375
- break;
387
+ return T_EXIT_FAIL;
376
388
  }
377
389
  }
378
390
 
@@ -380,8 +392,35 @@ int main(int argc, char *argv[])
380
392
  ret = test_generic_drain(&ring);
381
393
  if (ret) {
382
394
  fprintf(stderr, "test_generic_drain failed\n");
383
- break;
395
+ return T_EXIT_FAIL;
384
396
  }
385
397
  }
398
+
399
+ io_uring_queue_exit(&ring);
400
+
401
+ return T_EXIT_PASS;
402
+ }
403
+
404
+ int main(int argc, char *argv[])
405
+ {
406
+ int ret;
407
+
408
+ if (argc > 1)
409
+ return T_EXIT_SKIP;
410
+
411
+ ret = test(false);
412
+ if (ret != T_EXIT_PASS) {
413
+ fprintf(stderr, "%s: test(false) failed\n", argv[0]);
414
+ return ret;
415
+ }
416
+
417
+ if (t_probe_defer_taskrun()) {
418
+ ret = test(true);
419
+ if (ret != T_EXIT_PASS) {
420
+ fprintf(stderr, "%s: test(true) failed\n", argv[0]);
421
+ return ret;
422
+ }
423
+ }
424
+
386
425
  return ret;
387
426
  }
@@ -0,0 +1,60 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test liburing nolibc functionality.
4
+ *
5
+ * Currently, supported architectures are:
6
+ * 1) x86
7
+ * 2) x86-64
8
+ * 3) aarch64
9
+ *
10
+ */
11
+ #include "helpers.h"
12
+
13
+ #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__)
14
+
15
+ /*
16
+ * This arch doesn't support nolibc.
17
+ */
18
+ int main(void)
19
+ {
20
+ return T_EXIT_SKIP;
21
+ }
22
+
23
+ #else /* #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) */
24
+
25
+ #ifndef CONFIG_NOLIBC
26
+ #define CONFIG_NOLIBC
27
+ #endif
28
+
29
+ #include <stdio.h>
30
+ #include <unistd.h>
31
+ #include "../src/lib.h"
32
+
33
+ static int test_get_page_size(void)
34
+ {
35
+ long a, b;
36
+
37
+ a = sysconf(_SC_PAGESIZE);
38
+ b = get_page_size();
39
+ if (a != b) {
40
+ fprintf(stderr, "get_page_size() fails, %ld != %ld", a, b);
41
+ return -1;
42
+ }
43
+ return 0;
44
+ }
45
+
46
+ int main(int argc, char *argv[])
47
+ {
48
+ int ret;
49
+
50
+ if (argc > 1)
51
+ return T_EXIT_SKIP;
52
+
53
+ ret = test_get_page_size();
54
+ if (ret)
55
+ return T_EXIT_FAIL;
56
+
57
+ return T_EXIT_PASS;
58
+ }
59
+
60
+ #endif /* #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) */