polyphony 0.94 → 0.95

Sign up to get free protection for your applications and to get access to all the features.
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,117 @@
1
+ .\" Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
2
+ .\"
3
+ .\" SPDX-License-Identifier: LGPL-2.0-or-later
4
+ .\"
5
+ .TH io_uring_prep_openat 3 "March 13, 2022" "liburing-2.2" "liburing Manual"
6
+ .SH NAME
7
+ io_uring_prep_openat \- prepare an openat request
8
+ .SH SYNOPSIS
9
+ .nf
10
+ .B #include <sys/types.h>
11
+ .B #include <sys/stat.h>
12
+ .B #include <fcntl.h>
13
+ .B #include <liburing.h>
14
+ .PP
15
+ .BI "void io_uring_prep_openat(struct io_uring_sqe *" sqe ","
16
+ .BI " int " dfd ","
17
+ .BI " const char *" path ","
18
+ .BI " int " flags ","
19
+ .BI " mode_t " mode ");"
20
+ .PP
21
+ .BI "void io_uring_prep_openat_direct(struct io_uring_sqe *" sqe ","
22
+ .BI " int " dfd ","
23
+ .BI " const char *" path ","
24
+ .BI " int " flags ","
25
+ .BI " mode_t " mode ","
26
+ .BI " unsigned " file_index ");"
27
+ .fi
28
+ .SH DESCRIPTION
29
+ .PP
30
+ The
31
+ .BR io_uring_prep_openat (3)
32
+ function prepares an openat request. The submission queue entry
33
+ .I sqe
34
+ is setup to use the directory file descriptor
35
+ .I dfd
36
+ to start opening a file described by
37
+ .I path
38
+ and using the open flags in
39
+ .I flags
40
+ and using the file mode bits specified in
41
+ .IR mode .
42
+
43
+ For a direct descriptor open request, the offset is specified by the
44
+ .I file_index
45
+ argument. Direct descriptors are io_uring private file descriptors. They
46
+ avoid some of the overhead associated with thread shared file tables, and
47
+ can be used in any io_uring request that takes a file descriptor. To do so,
48
+ .B IOSQE_FIXED_FILE
49
+ must be set in the SQE
50
+ .I flags
51
+ member, and the SQE
52
+ .I fd
53
+ field should use the direct descriptor value rather than the regular file
54
+ descriptor. Direct descriptors are managed like registered files.
55
+
56
+ If the direct variant is used, the application must first have registered
57
+ a file table using
58
+ .BR io_uring_register_files (3)
59
+ of the appropriate size. Once registered, a direct accept request may use any
60
+ entry in that table, as long as it is within the size of the registered table.
61
+ If a specified entry already contains a file, the file will first be removed
62
+ from the table and closed. It's consistent with the behavior of updating an
63
+ existing file with
64
+ .BR io_uring_register_files_update (3).
65
+ Note that old kernels don't check the SQE
66
+ .I file_index
67
+ field, which is not a problem for liburing helpers, but users of the raw
68
+ io_uring interface need to zero SQEs to avoid unexpected behavior.
69
+
70
+ If
71
+ .B IORING_FILE_INDEX_ALLOC
72
+ is used as the
73
+ .I file_index
74
+ for a direct open, then io_uring will allocate a free direct descriptor in
75
+ the existing table. The allocated descriptor is returned in the CQE
76
+ .I res
77
+ field just like it would be for a non-direct open request. If no more entries
78
+ are available in the direct descriptor table,
79
+ .B -ENFILE
80
+ is returned instead.
81
+
82
+ These functions prepare an async
83
+ .BR openat (2)
84
+ request. See that man page for details.
85
+
86
+ .SH RETURN VALUE
87
+ None
88
+ .SH ERRORS
89
+ The CQE
90
+ .I res
91
+ field will contain the result of the operation. See the related man page for
92
+ details on possible values. Note that where synchronous system calls will return
93
+ .B -1
94
+ on failure and set
95
+ .I errno
96
+ to the actual error value, io_uring never uses
97
+ .IR errno .
98
+ Instead it returns the negated
99
+ .I errno
100
+ directly in the CQE
101
+ .I res
102
+ field.
103
+ .SH NOTES
104
+ As with any request that passes in data in a struct, that data must remain
105
+ valid until the request has been successfully submitted. It need not remain
106
+ valid until completion. Once a request has been submitted, the in-kernel
107
+ state is stable. Very early kernels (5.4 and earlier) required state to be
108
+ stable until the completion occurred. Applications can test for this
109
+ behavior by inspecting the
110
+ .B IORING_FEAT_SUBMIT_STABLE
111
+ flag passed back from
112
+ .BR io_uring_queue_init_params (3).
113
+ .SH SEE ALSO
114
+ .BR io_uring_get_sqe (3),
115
+ .BR io_uring_submit (3),
116
+ .BR io_uring_register (2),
117
+ .BR openat (2)
@@ -0,0 +1,117 @@
1
+ .\" Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
2
+ .\"
3
+ .\" SPDX-License-Identifier: LGPL-2.0-or-later
4
+ .\"
5
+ .TH io_uring_prep_openat2 3 "March 13, 2022" "liburing-2.2" "liburing Manual"
6
+ .SH NAME
7
+ io_uring_prep_openat2 \- prepare an openat2 request
8
+ .SH SYNOPSIS
9
+ .nf
10
+ .B #include <sys/types.h>
11
+ .B #include <sys/stat.h>
12
+ .B #include <fcntl.h>
13
+ .B #include <linux/openat2.h>
14
+ .B #include <liburing.h>
15
+ .PP
16
+ .BI "void io_uring_prep_openat2(struct io_uring_sqe *" sqe ","
17
+ .BI " int " dfd ","
18
+ .BI " const char *" path ","
19
+ .BI " int " flags ","
20
+ .BI " struct open_how *" how ");"
21
+ .PP
22
+ .BI "void io_uring_prep_openat2_direct(struct io_uring_sqe *" sqe ","
23
+ .BI " int " dfd ","
24
+ .BI " const char *" path ","
25
+ .BI " int " flags ","
26
+ .BI " struct open_how *" how ","
27
+ .BI " unsigned " file_index ");"
28
+ .fi
29
+ .SH DESCRIPTION
30
+ .PP
31
+ The
32
+ .BR io_uring_prep_openat2 (3)
33
+ function prepares an openat2 request. The submission queue entry
34
+ .I sqe
35
+ is setup to use the directory file descriptor
36
+ .I dfd
37
+ to start opening a file described by
38
+ .I path
39
+ and using the open flags in
40
+ .I flags
41
+ and using the instructions on how to open the file given in
42
+ .IR how .
43
+
44
+ For a direct descriptor open request, the offset is specified by the
45
+ .I file_index
46
+ argument. Direct descriptors are io_uring private file descriptors. They
47
+ avoid some of the overhead associated with thread shared file tables, and
48
+ can be used in any io_uring request that takes a file descriptor. To do so,
49
+ .B IOSQE_FIXED_FILE
50
+ must be set in the SQE
51
+ .I flags
52
+ member, and the SQE
53
+ .I fd
54
+ field should use the direct descriptor value rather than the regular file
55
+ descriptor. Direct descriptors are managed like registered files.
56
+
57
+ If the direct variant is used, the application must first have registered
58
+ a file table using
59
+ .BR io_uring_register_files (3)
60
+ of the appropriate size. Once registered, a direct accept request may use any
61
+ entry in that table, as long as it is within the size of the registered table.
62
+ If a specified entry already contains a file, the file will first be removed
63
+ from the table and closed. It's consistent with the behavior of updating an
64
+ existing file with
65
+ .BR io_uring_register_files_update (3).
66
+ Note that old kernels don't check the SQE
67
+ .I file_index
68
+ field, which is not a problem for liburing helpers, but users of the raw
69
+ io_uring interface need to zero SQEs to avoid unexpected behavior.
70
+ If
71
+ .B IORING_FILE_INDEX_ALLOC
72
+ is used as the
73
+ .I file_index
74
+ for a direct open, then io_uring will allocate a free direct descriptor in
75
+ the existing table. The allocated descriptor is returned in the CQE
76
+ .I res
77
+ field just like it would be for a non-direct open request. If no more entries
78
+ are available in the direct descriptor table,
79
+ .B -ENFILE
80
+ is returned instead.
81
+
82
+ These functions prepare an async
83
+ .BR openat2 (2)
84
+ request. See that man page for details.
85
+
86
+ .SH RETURN VALUE
87
+ None
88
+ .SH ERRORS
89
+ The CQE
90
+ .I res
91
+ field will contain the result of the operation. See the related man page for
92
+ details on possible values. Note that where synchronous system calls will return
93
+ .B -1
94
+ on failure and set
95
+ .I errno
96
+ to the actual error value, io_uring never uses
97
+ .IR errno .
98
+ Instead it returns the negated
99
+ .I errno
100
+ directly in the CQE
101
+ .I res
102
+ field.
103
+ .SH NOTES
104
+ As with any request that passes in data in a struct, that data must remain
105
+ valid until the request has been successfully submitted. It need not remain
106
+ valid until completion. Once a request has been submitted, the in-kernel
107
+ state is stable. Very early kernels (5.4 and earlier) required state to be
108
+ stable until the completion occurred. Applications can test for this
109
+ behavior by inspecting the
110
+ .B IORING_FEAT_SUBMIT_STABLE
111
+ flag passed back from
112
+ .BR io_uring_queue_init_params (3).
113
+ .SH SEE ALSO
114
+ .BR io_uring_get_sqe (3),
115
+ .BR io_uring_submit (3),
116
+ .BR io_uring_register (2),
117
+ .BR openat2 (2)
@@ -0,0 +1 @@
1
+ io_uring_prep_openat2.3
@@ -0,0 +1 @@
1
+ io_uring_prep_openat.3
@@ -0,0 +1,72 @@
1
+ .\" Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
2
+ .\"
3
+ .\" SPDX-License-Identifier: LGPL-2.0-or-later
4
+ .\"
5
+ .TH io_uring_prep_poll_add 3 "March 12, 2022" "liburing-2.2" "liburing Manual"
6
+ .SH NAME
7
+ io_uring_prep_poll_add \- prepare a poll request
8
+ .SH SYNOPSIS
9
+ .nf
10
+ .B #include <poll.h>
11
+ .B #include <liburing.h>
12
+ .PP
13
+ .BI "void io_uring_prep_poll_add(struct io_uring_sqe *" sqe ","
14
+ .BI " int " fd ","
15
+ .BI " unsigned " poll_mask ");"
16
+ .PP
17
+ .BI "void io_uring_prep_poll_multishot(struct io_uring_sqe *" sqe ","
18
+ .BI " int " fd ","
19
+ .BI " unsigned " poll_mask ");"
20
+ .fi
21
+ .SH DESCRIPTION
22
+ .PP
23
+ The
24
+ .BR io_uring_prep_poll_add (3)
25
+ function prepares a poll request. The submission queue entry
26
+ .I sqe
27
+ is setup to use the file descriptor
28
+ .I fd
29
+ that should get polled, with the events desired specified in the
30
+ .I poll_mask
31
+ argument.
32
+
33
+ The default behavior is a single-shot poll request. When the specified event
34
+ has triggered, a completion CQE is posted and no more events will be generated
35
+ by the poll request.
36
+ .BR io_uring_prep_multishot (3)
37
+ behaves identically in terms of events, but it persist across notifications
38
+ and will repeatedly post notifications for the same registration. A CQE
39
+ posted from a multishot poll request will have
40
+ .B IORING_CQE_F_MORE
41
+ set in the CQE
42
+ .I flags
43
+ member, indicating that the application should expect more completions from
44
+ this request. If the multishot poll request gets terminated or experiences
45
+ an error, this flag will not be set in the CQE. If this happens, the application
46
+ should not expect further CQEs from the original request and must reissue a
47
+ new one if it still wishes to get notifications on this file descriptor.
48
+
49
+ .SH RETURN VALUE
50
+ None
51
+ .SH ERRORS
52
+ The CQE
53
+ .I res
54
+ field will contain the result of the operation, which is a bitmask of the
55
+ events notified. See the
56
+ .BR poll (2)
57
+ man page for details. Note that where synchronous system calls will return
58
+ .B -1
59
+ on failure and set
60
+ .I errno
61
+ to the actual error value, io_uring never uses
62
+ .IR errno .
63
+ Instead it returns the negated
64
+ .I errno
65
+ directly in the CQE
66
+ .I res
67
+ field.
68
+ .SH SEE ALSO
69
+ .BR io_uring_get_sqe (3),
70
+ .BR io_uring_submit (3),
71
+ .BR poll (2),
72
+ .BR epoll_ctl (3)
@@ -0,0 +1 @@
1
+ io_uring_prep_poll_add.3
@@ -0,0 +1,55 @@
1
+ .\" Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
2
+ .\"
3
+ .\" SPDX-License-Identifier: LGPL-2.0-or-later
4
+ .\"
5
+ .TH io_uring_prep_poll_remove 3 "March 12, 2022" "liburing-2.2" "liburing Manual"
6
+ .SH NAME
7
+ io_uring_prep_poll_remove \- prepare a poll deletion request
8
+ .SH SYNOPSIS
9
+ .nf
10
+ .B #include <liburing.h>
11
+ .PP
12
+ .BI "void io_uring_prep_poll_remove(struct io_uring_sqe *" sqe ","
13
+ .BI " __u64 " user_data ");"
14
+ .BI "
15
+ .fi
16
+ .SH DESCRIPTION
17
+ .PP
18
+ The
19
+ .BR io_uring_prep_poll_remove (3)
20
+ function prepares a poll removal request. The submission queue entry
21
+ .I sqe
22
+ is setup to remove a poll request identified by
23
+ .I user_data
24
+
25
+ Works like
26
+ .BR io_uring_prep_cancel (3)
27
+ except only looks for poll requests. Apart from that, behavior is identical.
28
+ See that man page for specific details.
29
+
30
+ .SH RETURN VALUE
31
+ None
32
+ .SH ERRORS
33
+ These are the errors that are reported in the CQE
34
+ .I res
35
+ field. On success,
36
+ .B 0
37
+ is returned.
38
+ .TP
39
+ .B -ENOENT
40
+ The request identified by
41
+ .I user_data
42
+ could not be located. This could be because it completed before the cancelation
43
+ request was issued, or if an invalid identifier is used.
44
+ .TP
45
+ .B -EINVAL
46
+ One of the fields set in the SQE was invalid.
47
+ .TP
48
+ .B -EALREADY
49
+ The execution state of the request has progressed far enough that cancelation
50
+ is no longer possible. This should normally mean that it will complete shortly,
51
+ either successfully, or interrupted due to the cancelation.
52
+ .SH SEE ALSO
53
+ .BR io_uring_get_sqe (3),
54
+ .BR io_uring_submit (3),
55
+ .BR io_uring_prep_cancel (3)
@@ -0,0 +1,89 @@
1
+ .\" Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
2
+ .\"
3
+ .\" SPDX-License-Identifier: LGPL-2.0-or-later
4
+ .\"
5
+ .TH io_uring_prep_poll_update 3 "March 12, 2022" "liburing-2.2" "liburing Manual"
6
+ .SH NAME
7
+ io_uring_prep_poll_update \- update an existing poll request
8
+ .SH SYNOPSIS
9
+ .nf
10
+ .B #include <poll.h>
11
+ .B #include <liburing.h>
12
+ .PP
13
+ .BI "void io_uring_prep_poll_update(struct io_uring_sqe *" sqe ","
14
+ .BI " __u64 " old_user_data ","
15
+ .BI " __u64 " new_user_data ","
16
+ .BI " unsigned " poll_mask ","
17
+ .BI " unsigned " flags ");"
18
+ .fi
19
+ .SH DESCRIPTION
20
+ .PP
21
+ The
22
+ .BR io_uring_prep_poll_update (3)
23
+ function prepares a poll update request. The submission queue entry
24
+ .I sqe
25
+ is setup to update a poll request identified by
26
+ .IR old_user_data ,
27
+ replacing it with the
28
+ .I new_user_data
29
+ information. The
30
+ .I poll_mask
31
+ arguments contains the new mask to use for the poll request, and
32
+ .I flags
33
+ argument contains modifier flags telling io_uring what fields to update.
34
+
35
+ The
36
+ .I flags
37
+ modifier flags is a bitmask and may contain and OR'ed mask of:
38
+ .TP
39
+ .B IORING_POLL_UPDATE_EVENTS
40
+ If set, the poll update request will replace the existing events being waited
41
+ for with the ones specified in the
42
+ .I poll_mask
43
+ argument to the function.
44
+ .TP
45
+ .B IORING_POLL_UPDATE_USER_DATA
46
+ If set, the poll update request will update the existing user_data of the
47
+ request with the value passed in as the
48
+ .I new_user_data
49
+ argument.
50
+ .TP
51
+ .B IORING_POLL_ADD_MULTI
52
+ If set, this will change the poll request from a singleshot to a multishot
53
+ request. This must be used along with
54
+ .B IORING_POLL_UPDATE_EVENTS
55
+ as the event field must be updated to enable multishot.
56
+
57
+ .SH RETURN VALUE
58
+ None
59
+ .SH ERRORS
60
+ These are the errors that are reported in the CQE
61
+ .I res
62
+ field. On success,
63
+ .B 0
64
+ is returned.
65
+ .TP
66
+ .B -ENOENT
67
+ The request identified by
68
+ .I user_data
69
+ could not be located. This could be because it completed before the cancelation
70
+ request was issued, or if an invalid identifier is used.
71
+ .TP
72
+ .B -EINVAL
73
+ One of the fields set in the SQE was invalid.
74
+ .TP
75
+ .B -EALREADY
76
+ The execution state of the request has progressed far enough that cancelation
77
+ is no longer possible. This should normally mean that it will complete shortly,
78
+ either successfully, or interrupted due to the cancelation.
79
+ .TP
80
+ .B -ECANCELED
81
+ .B IORING_POLL_UPDATE_EVENTS
82
+ was set and an error occurred re-arming the poll request with the new mask.
83
+ The original poll request is terminated if this happens, and that termination
84
+ CQE will contain the reason for the error re-arming.
85
+ .SH SEE ALSO
86
+ .BR io_uring_get_sqe (3),
87
+ .BR io_uring_submit (3),
88
+ .BR io_uring_prep_poll_add (3),
89
+ .BR io_uring_prep_poll_multishot (3)
@@ -0,0 +1,131 @@
1
+ .\" Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
2
+ .\"
3
+ .\" SPDX-License-Identifier: LGPL-2.0-or-later
4
+ .\"
5
+ .TH io_uring_prep_provide_buffers 3 "March 13, 2022" "liburing-2.2" "liburing Manual"
6
+ .SH NAME
7
+ io_uring_prep_provide_buffers \- prepare a provide buffers request
8
+ .SH SYNOPSIS
9
+ .nf
10
+ .B #include <liburing.h>
11
+ .PP
12
+ .BI "void io_uring_prep_provide_buffers(struct io_uring_sqe *" sqe ","
13
+ .BI " void *" addr ","
14
+ .BI " int " len ","
15
+ .BI " int " nr ","
16
+ .BI " int " bgid ","
17
+ .BI " int " bid ");"
18
+ .fi
19
+ .SH DESCRIPTION
20
+ .PP
21
+ The
22
+ .BR io_uring_prep_provide_buffers (3)
23
+ function prepares a request for providing the kernel with buffers. The
24
+ submission queue entry
25
+ .I sqe
26
+ is setup to consume
27
+ .I len
28
+ number of buffers starting at
29
+ .I addr
30
+ and identified by the buffer group ID of
31
+ .I bgid
32
+ and numbered sequentially starting at
33
+ .IR bid .
34
+
35
+ This function sets up a request to provide buffers to the io_uring context
36
+ that can be used by read or receive operations. This is done by filling in
37
+ the SQE
38
+ .I buf_group
39
+ field and setting
40
+ .B IOSQE_BUFFER_SELECT
41
+ in the SQE
42
+ .I flags
43
+ member. If buffer selection is used for a request, no buffer should be provided
44
+ in the address field. Instead, the group ID is set to match one that was
45
+ previously provided to the kernel. The kernel will then select a buffer from
46
+ this group for the IO operation. On successful completion of the IO request,
47
+ the CQE
48
+ .I flags
49
+ field will have
50
+ .B IORING_CQE_F_BUFFER
51
+ set and the selected buffer ID will be indicated by the upper 16-bits of the
52
+ .I flags
53
+ field.
54
+
55
+ Different buffer group IDs can be used by the application to have different
56
+ sizes or types of buffers available. Once a buffer has been consumed for an
57
+ operation, it is no longer known to io_uring. It must be re-provided if so
58
+ desired or freed by the application if no longer needed.
59
+
60
+ The buffer IDs are internally tracked from
61
+ .I bid
62
+ and sequentially ascending from that value. If
63
+ .B 16
64
+ buffers are provided and start with an initial
65
+ .I bid
66
+ of 0, then the buffer IDs will range from
67
+ .BR 0..15 .
68
+ The application must be aware of this to make sense of the buffer ID passed
69
+ back in the CQE.
70
+
71
+ Not all requests support buffer selection, as it only really makes sense for
72
+ requests that receive data from the kernel rather than write or provide data.
73
+ Currently, this mode of operation is supported for any file read or socket
74
+ receive request. Attempting to use
75
+ .B IOSQE_BUFFER_SELECT
76
+ with a command that doesn't support it will result in a CQE
77
+ .I res
78
+ error of
79
+ .BR -EINVAL .
80
+ Buffer selection will work with operations that take a
81
+ .B struct iovec
82
+ as its data destination, but only if 1 iovec is provided.
83
+ .
84
+ .SH RETURN VALUE
85
+ None
86
+ .SH ERRORS
87
+ These are the errors that are reported in the CQE
88
+ .I res
89
+ field. On success,
90
+ .I res
91
+ will contain the number of successfully provided buffers. On error,
92
+ the following errors can occur.
93
+ .TP
94
+ .B -ENOMEM
95
+ The kernel was unable to allocate memory for the request.
96
+ .TP
97
+ .B -EINVAL
98
+ One of the fields set in the SQE was invalid.
99
+ .TP
100
+ .B -E2BIG
101
+ The number of buffers provided was too big, or the
102
+ .I bid
103
+ was too big. A max value of
104
+ .B USHRT_MAX
105
+ buffers can be specified.
106
+ .TP
107
+ .B -EFAULT
108
+ Some of the user memory given was invalid for the application.
109
+ .TP
110
+ .B -EBADF
111
+ On of the descriptors located in
112
+ .I fds
113
+ didn't refer to a valid file descriptor, or one of the file descriptors in
114
+ the array referred to an io_uring instance.
115
+ .TP
116
+ .B -EOVERFLOW
117
+ The product of
118
+ .I len
119
+ and
120
+ .I nr
121
+ exceed the valid amount or overflowed, or the sum of
122
+ .I addr
123
+ and the length of buffers overflowed.
124
+ .TP
125
+ .B -EBUSY
126
+ Attempt to update a slot that is already used.
127
+ .SH SEE ALSO
128
+ .BR io_uring_get_sqe (3),
129
+ .BR io_uring_submit (3),
130
+ .BR io_uring_register (2),
131
+ .BR io_uring_prep_remove_buffers (3)
@@ -4,21 +4,22 @@
4
4
  .\"
5
5
  .TH io_uring_prep_read 3 "November 15, 2021" "liburing-2.1" "liburing Manual"
6
6
  .SH NAME
7
- io_uring_prep_read - prepare I/O read request
8
-
7
+ io_uring_prep_read \- prepare I/O read request
9
8
  .SH SYNOPSIS
10
9
  .nf
11
- .BR "#include <liburing.h>"
10
+ .B #include <liburing.h>
12
11
  .PP
13
- .BI "void io_uring_prep_read(struct io_uring_sqe *sqe,"
14
- .BI " int fd,"
15
- .BI " void *buf,"
16
- .BI " unsigned nbytes,"
17
- .BI " __u64 offset)"
18
-
12
+ .BI "void io_uring_prep_read(struct io_uring_sqe *" sqe ","
13
+ .BI " int " fd ","
14
+ .BI " void *" buf ","
15
+ .BI " unsigned " nbytes ","
16
+ .BI " __u64 " offset ");"
17
+ .fi
19
18
  .SH DESCRIPTION
20
19
  .PP
21
- The io_uring_prep_read() prepares an IO read request. The submission queue entry
20
+ The
21
+ .BR io_uring_prep_read (3)
22
+ prepares an IO read request. The submission queue entry
22
23
  .I sqe
23
24
  is setup to use the file descriptor
24
25
  .I fd
@@ -27,10 +28,10 @@ to start reading
27
28
  into the buffer
28
29
  .I buf
29
30
  at the specified
30
- .I offset.
31
+ .IR offset .
31
32
 
32
33
  On files that support seeking, if the offset is set to
33
- .B -1,
34
+ .BR -1 ,
34
35
  the read operation commences at the file offset, and the file offset is
35
36
  incremented by the number of bytes read. See
36
37
  .BR read (2)
@@ -39,12 +40,30 @@ current file offset may result in unpredictable behavior, unless access
39
40
  to the file is serialized. It is not encouraged to use this feature, if it's
40
41
  possible to provide the desired IO offset from the application or library.
41
42
 
42
- On files that are not capable of seeking, the offset is ignored.
43
+ On files that are not capable of seeking, the offset must be 0 or -1.
43
44
 
44
45
  After the read has been prepared it can be submitted with one of the submit
45
46
  functions.
46
47
 
47
48
  .SH RETURN VALUE
48
49
  None
50
+ .SH ERRORS
51
+ The CQE
52
+ .I res
53
+ field will contain the result of the operation. See the related man page for
54
+ details on possible values. Note that where synchronous system calls will return
55
+ .B -1
56
+ on failure and set
57
+ .I errno
58
+ to the actual error value, io_uring never uses
59
+ .IR errno .
60
+ Instead it returns the negated
61
+ .I errno
62
+ directly in the CQE
63
+ .I res
64
+ field.
49
65
  .SH SEE ALSO
50
- .BR io_uring_get_sqe (3), io_uring_prep_readv (3), io_uring_prep_readv2 (3), io_uring_submit(3)
66
+ .BR io_uring_get_sqe (3),
67
+ .BR io_uring_prep_readv (3),
68
+ .BR io_uring_prep_readv2 (3),
69
+ .BR io_uring_submit (3)