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,200 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: ring mapped provided buffers with reads
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "liburing.h"
14
+ #include "helpers.h"
15
+
16
+ #define BUF_SIZE 4096
17
+ #define NR_BUFS 64
18
+ #define FSIZE (BUF_SIZE * NR_BUFS)
19
+
20
+ #define BR_MASK (NR_BUFS - 1)
21
+
22
+ static int no_buf_ring;
23
+
24
+ static int verify_buffer(char *buf, char val)
25
+ {
26
+ int i;
27
+
28
+ for (i = 0; i < BUF_SIZE; i++) {
29
+ if (buf[i] != val) {
30
+ fprintf(stderr, "got %d, wanted %d\n", buf[i], val);
31
+ return 1;
32
+ }
33
+ }
34
+
35
+ return 0;
36
+ }
37
+
38
+ static int test(const char *filename, int dio, int async)
39
+ {
40
+ struct io_uring_buf_reg reg = { };
41
+ struct io_uring_sqe *sqe;
42
+ struct io_uring_cqe *cqe;
43
+ struct io_uring ring;
44
+ struct io_uring_buf_ring *br;
45
+ int ret, fd, i;
46
+ char *buf;
47
+ void *ptr;
48
+
49
+ ret = io_uring_queue_init(NR_BUFS, &ring, 0);
50
+ if (ret) {
51
+ fprintf(stderr, "ring setup failed: %d\n", ret);
52
+ return 1;
53
+ }
54
+
55
+ if (dio)
56
+ fd = open(filename, O_DIRECT | O_RDONLY);
57
+ else
58
+ fd = open(filename, O_RDONLY);
59
+ if (fd < 0) {
60
+ perror("open");
61
+ return 1;
62
+ }
63
+
64
+ posix_fadvise(fd, 0, FSIZE, POSIX_FADV_DONTNEED);
65
+
66
+ if (posix_memalign((void **) &buf, 4096, FSIZE))
67
+ return 1;
68
+ if (posix_memalign((void **) &br, 4096, 4096))
69
+ return 1;
70
+
71
+ reg.ring_addr = (unsigned long) br;
72
+ reg.ring_entries = NR_BUFS;
73
+ reg.bgid = 1;
74
+
75
+ ret = io_uring_register_buf_ring(&ring, &reg, 0);
76
+ if (ret) {
77
+ if (ret == -EINVAL) {
78
+ no_buf_ring = 1;
79
+ return 0;
80
+ }
81
+ fprintf(stderr, "Buffer ring register failed %d\n", ret);
82
+ return 1;
83
+ }
84
+
85
+ ptr = buf;
86
+ for (i = 0; i < NR_BUFS; i++) {
87
+ io_uring_buf_ring_add(br, ptr, BUF_SIZE, i + 1, BR_MASK, i);
88
+ ptr += BUF_SIZE;
89
+ }
90
+ io_uring_buf_ring_advance(br, NR_BUFS);
91
+
92
+ for (i = 0; i < NR_BUFS; i++) {
93
+ sqe = io_uring_get_sqe(&ring);
94
+ io_uring_prep_read(sqe, fd, NULL, BUF_SIZE, i * BUF_SIZE);
95
+ sqe->buf_group = 1;
96
+ sqe->flags |= IOSQE_BUFFER_SELECT;
97
+ if (async && !(i & 1))
98
+ sqe->flags |= IOSQE_ASYNC;
99
+ sqe->user_data = i + 1;
100
+ }
101
+
102
+ ret = io_uring_submit(&ring);
103
+ if (ret != NR_BUFS) {
104
+ fprintf(stderr, "submit: %d\n", ret);
105
+ return 1;
106
+ }
107
+
108
+ for (i = 0; i < NR_BUFS; i++) {
109
+ int bid, ud;
110
+
111
+ ret = io_uring_wait_cqe(&ring, &cqe);
112
+ if (ret) {
113
+ fprintf(stderr, "wait cqe failed %d\n", ret);
114
+ return 1;
115
+ }
116
+ if (cqe->res != BUF_SIZE) {
117
+ fprintf(stderr, "cqe res %d\n", cqe->res);
118
+ return 1;
119
+ }
120
+ if (!(cqe->flags & IORING_CQE_F_BUFFER)) {
121
+ fprintf(stderr, "no buffer selected\n");
122
+ return 1;
123
+ }
124
+ bid = cqe->flags >> IORING_CQE_BUFFER_SHIFT;
125
+ ud = cqe->user_data;
126
+ io_uring_cqe_seen(&ring, cqe);
127
+ if (verify_buffer(buf + ((bid - 1) * BUF_SIZE), ud))
128
+ return 1;
129
+ }
130
+
131
+ return 0;
132
+ }
133
+
134
+ int main(int argc, char *argv[])
135
+ {
136
+ char buf[BUF_SIZE];
137
+ char fname[80];
138
+ int ret, fd, i, do_unlink;
139
+
140
+ if (argc > 1) {
141
+ strcpy(fname, argv[1]);
142
+ do_unlink = 0;
143
+ } else {
144
+ sprintf(fname, ".ringbuf-read.%d", getpid());
145
+ t_create_file(fname, FSIZE);
146
+ do_unlink = 1;
147
+ }
148
+
149
+ fd = open(fname, O_WRONLY);
150
+ if (fd < 0) {
151
+ perror("open");
152
+ goto err;
153
+ }
154
+ for (i = 0; i < NR_BUFS; i++) {
155
+ memset(buf, i + 1, BUF_SIZE);
156
+ ret = write(fd, buf, BUF_SIZE);
157
+ if (ret != BUF_SIZE) {
158
+ fprintf(stderr, "bad file prep write\n");
159
+ close(fd);
160
+ goto err;
161
+ }
162
+ }
163
+ close(fd);
164
+
165
+ ret = test(fname, 1, 0);
166
+ if (ret) {
167
+ fprintf(stderr, "dio test failed\n");
168
+ goto err;
169
+ }
170
+ if (no_buf_ring)
171
+ goto pass;
172
+
173
+ ret = test(fname, 0, 0);
174
+ if (ret) {
175
+ fprintf(stderr, "buffered test failed\n");
176
+ goto err;
177
+ }
178
+
179
+ ret = test(fname, 1, 1);
180
+ if (ret) {
181
+ fprintf(stderr, "dio async test failed\n");
182
+ goto err;
183
+ }
184
+
185
+ ret = test(fname, 0, 1);
186
+ if (ret) {
187
+ fprintf(stderr, "buffered async test failed\n");
188
+ goto err;
189
+ }
190
+
191
+ pass:
192
+ ret = T_EXIT_PASS;
193
+ goto out;
194
+ err:
195
+ ret = T_EXIT_FAIL;
196
+ out:
197
+ if (do_unlink)
198
+ unlink(fname);
199
+ return ret;
200
+ }
@@ -27,7 +27,7 @@ static bool check_cq_empty(struct io_uring *ring)
27
27
  struct io_uring_cqe *cqe = NULL;
28
28
  int ret;
29
29
 
30
- sleep(1); /* doesn't happen immediately, so wait */
30
+ usleep(1000); /* doesn't happen immediately, so wait */
31
31
  ret = io_uring_peek_cqe(ring, &cqe); /* nothing should be there */
32
32
  return ret == -EAGAIN;
33
33
  }
@@ -40,7 +40,7 @@ static int register_rsrc(struct io_uring *ring, int type, int nr,
40
40
  const void *arg, const __u64 *tags)
41
41
  {
42
42
  struct io_uring_rsrc_register reg;
43
- int ret, reg_type;
43
+ int reg_type;
44
44
 
45
45
  memset(&reg, 0, sizeof(reg));
46
46
  reg.nr = nr;
@@ -51,9 +51,8 @@ static int register_rsrc(struct io_uring *ring, int type, int nr,
51
51
  if (type != TEST_IORING_RSRC_FILE)
52
52
  reg_type = IORING_REGISTER_BUFFERS2;
53
53
 
54
- ret = __sys_io_uring_register(ring->ring_fd, reg_type,
55
- &reg, sizeof(reg));
56
- return ret ? -errno : 0;
54
+ return __sys_io_uring_register(ring->ring_fd, reg_type, &reg,
55
+ sizeof(reg));
57
56
  }
58
57
 
59
58
  /*
@@ -64,7 +63,7 @@ static int update_rsrc(struct io_uring *ring, int type, int nr, int off,
64
63
  const void *arg, const __u64 *tags)
65
64
  {
66
65
  struct io_uring_rsrc_update2 up;
67
- int ret, up_type;
66
+ int up_type;
68
67
 
69
68
  memset(&up, 0, sizeof(up));
70
69
  up.offset = off;
@@ -75,9 +74,7 @@ static int update_rsrc(struct io_uring *ring, int type, int nr, int off,
75
74
  up_type = IORING_REGISTER_FILES_UPDATE2;
76
75
  if (type != TEST_IORING_RSRC_FILE)
77
76
  up_type = IORING_REGISTER_BUFFERS_UPDATE;
78
- ret = __sys_io_uring_register(ring->ring_fd, up_type,
79
- &up, sizeof(up));
80
- return ret < 0 ? -errno : ret;
77
+ return __sys_io_uring_register(ring->ring_fd, up_type, &up, sizeof(up));
81
78
  }
82
79
 
83
80
  static bool has_rsrc_update(void)
@@ -185,7 +182,7 @@ static int test_buffers_update(void)
185
182
  return 1;
186
183
  }
187
184
 
188
- /* test that CQE is not emmited before we're done with a buffer */
185
+ /* test that CQE is not emitted before we're done with a buffer */
189
186
  sqe = io_uring_get_sqe(&ring);
190
187
  io_uring_prep_read_fixed(sqe, pipes[0], tmp_buf, 10, 0, 0);
191
188
  sqe->user_data = 100;
@@ -350,7 +347,16 @@ static int test_files(int ring_flags)
350
347
  ret = io_uring_register_files_update(&ring, off, &fd, 1);
351
348
  assert(ret == 1);
352
349
  ret = io_uring_wait_cqe(&ring, &cqe);
353
- assert(!ret && cqe->user_data == tags[off]);
350
+ if (ret) {
351
+ fprintf(stderr, "io_uring wait ret=%d\n", ret);
352
+ return 1;
353
+ }
354
+ if (cqe->user_data != tags[off]) {
355
+ fprintf(stderr, "data %lx != %lx\n",
356
+ (unsigned long) cqe->user_data,
357
+ (unsigned long) tags[off]);
358
+ return 1;
359
+ }
354
360
  io_uring_cqe_seen(&ring, cqe);
355
361
 
356
362
  /* remove removed file, shouldn't emit old tag */
@@ -404,7 +410,8 @@ static int test_notag(void)
404
410
 
405
411
  int main(int argc, char *argv[])
406
412
  {
407
- int ring_flags[] = {0, IORING_SETUP_IOPOLL, IORING_SETUP_SQPOLL};
413
+ int ring_flags[] = {0, IORING_SETUP_IOPOLL, IORING_SETUP_SQPOLL,
414
+ IORING_SETUP_SINGLE_ISSUER | IORING_SETUP_DEFER_TASKRUN};
408
415
  int i, ret;
409
416
 
410
417
  if (argc > 1)
@@ -426,7 +433,12 @@ int main(int argc, char *argv[])
426
433
  }
427
434
 
428
435
  for (i = 0; i < sizeof(ring_flags) / sizeof(ring_flags[0]); i++) {
429
- ret = test_files(ring_flags[i]);
436
+ int flag = ring_flags[i];
437
+
438
+ if (flag & IORING_SETUP_DEFER_TASKRUN && !t_probe_defer_taskrun())
439
+ continue;
440
+
441
+ ret = test_files(flag);
430
442
  if (ret) {
431
443
  printf("test_tag failed, type %i\n", i);
432
444
  return ret;
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bash
2
+
3
+ TESTS=("$@")
4
+ RESULT_FILE=$(mktemp)
5
+ ./runtests.sh "${TESTS[@]}" > "$RESULT_FILE" 2>&1
6
+ RET="$?"
7
+ if [ "${RET}" -ne 0 ]; then
8
+ cat "$RESULT_FILE"
9
+ fi
10
+ rm "$RESULT_FILE"
11
+ exit $RET
@@ -1,13 +1,12 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  TESTS=("$@")
4
- RET=0
5
4
  TIMEOUT=60
6
5
  DMESG_FILTER="cat"
7
6
  TEST_DIR=$(dirname "$0")
8
- FAILED=""
9
- SKIPPED=""
10
- TIMED_OUT=""
7
+ FAILED=()
8
+ SKIPPED=()
9
+ TIMED_OUT=()
11
10
  TEST_FILES=""
12
11
  declare -A TEST_MAP
13
12
 
@@ -94,7 +93,7 @@ run_test()
94
93
  # shellcheck disable=SC2181
95
94
  if [ $? -eq 0 ]; then
96
95
  echo "Test skipped"
97
- SKIPPED="$SKIPPED <$test_string>"
96
+ SKIPPED+=("<$test_string>")
98
97
  return
99
98
  fi
100
99
 
@@ -111,15 +110,16 @@ run_test()
111
110
  # Check test status
112
111
  if [ "$status" -eq 124 ]; then
113
112
  echo "Test $test_name timed out (may not be a failure)"
114
- TIMED_OUT="$TIMED_OUT <$test_string>"
113
+ TIMED_OUT+=("<$test_string>")
114
+ elif [ "$status" -eq 77 ]; then
115
+ echo "Skipped"
116
+ SKIPPED+=("<$test_string>")
115
117
  elif [ "$status" -ne 0 ]; then
116
118
  echo "Test $test_name failed with ret $status"
117
- FAILED="$FAILED <$test_string>"
118
- RET=1
119
+ FAILED+=("<$test_string>")
119
120
  elif ! _check_dmesg "$dmesg_marker" "$test_name"; then
120
121
  echo "Test $test_name failed dmesg check"
121
- FAILED="$FAILED <$test_string>"
122
- RET=1
122
+ FAILED+=("<$test_string>")
123
123
  else
124
124
  if [ -f "output/$out_name" ]; then
125
125
  T_PREV=$(cat "output/$out_name")
@@ -139,7 +139,7 @@ run_test()
139
139
  # Run all specified tests
140
140
  for tst in "${TESTS[@]}"; do
141
141
  if [ ! -d output ]; then
142
- mkdir output
142
+ mkdir -p output
143
143
  fi
144
144
  if [ -z "${TEST_MAP[$tst]}" ]; then
145
145
  run_test "$tst"
@@ -153,17 +153,15 @@ for tst in "${TESTS[@]}"; do
153
153
  fi
154
154
  done
155
155
 
156
- if [ -n "$SKIPPED" ]; then
157
- echo "Tests skipped: $SKIPPED"
156
+ if [ "${#TIMED_OUT[*]}" -ne 0 ]; then
157
+ echo "Tests timed out (${#TIMED_OUT[*]}): ${TIMED_OUT[*]}"
158
158
  fi
159
159
 
160
- if [ -n "$TIMED_OUT" ]; then
161
- echo "Tests timed out: $TIMED_OUT"
162
- fi
163
-
164
- if [ "${RET}" -ne 0 ]; then
165
- echo "Tests failed: $FAILED"
166
- exit $RET
160
+ if [ "${#FAILED[*]}" -ne 0 ]; then
161
+ echo "Tests failed (${#FAILED[*]}): ${FAILED[*]}"
162
+ exit 1
163
+ elif [ "${#SKIPPED[*]}" -ne 0 ] && [ -n "$TEST_GNU_EXITCODE" ]; then
164
+ exit 77
167
165
  else
168
166
  echo "All tests passed"
169
167
  exit 0
@@ -35,7 +35,8 @@ int main(int argc, char *argv[])
35
35
  assert(!ret);
36
36
 
37
37
  fd = open("testfile", O_RDWR | O_CREAT, 0644);
38
- assert(ret >= 0);
38
+ assert(fd >= 0);
39
+ unlink("testfile");
39
40
  ret = ftruncate(fd, 4096);
40
41
  assert(!ret);
41
42
 
@@ -78,7 +79,7 @@ int main(int argc, char *argv[])
78
79
  assert(ret == 1);
79
80
 
80
81
  /*
81
- * Read may stuck because of bug there request was be incorrecly
82
+ * Read may stuck because of bug there request was be incorrectly
82
83
  * merged with <REQ1> request
83
84
  */
84
85
  ret = io_uring_wait_cqe_timeout(&ring, &cqe, &ts);