uringmachine 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/workflows/test.yml +35 -0
  4. data/.gitignore +59 -0
  5. data/.gitmodules +3 -0
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +21 -0
  9. data/README.md +11 -0
  10. data/Rakefile +39 -0
  11. data/TODO.md +0 -0
  12. data/examples/echo_server.rb +52 -0
  13. data/examples/event_loop.rb +69 -0
  14. data/examples/fibers.rb +105 -0
  15. data/examples/http_server.rb +56 -0
  16. data/examples/http_server_multishot.rb +57 -0
  17. data/examples/http_server_simpler.rb +34 -0
  18. data/ext/um/extconf.rb +71 -0
  19. data/ext/um/iou.h +101 -0
  20. data/ext/um/op_ctx.c +138 -0
  21. data/ext/um/ring.c +755 -0
  22. data/ext/um/um.c +267 -0
  23. data/ext/um/um.h +97 -0
  24. data/ext/um/um_class.c +175 -0
  25. data/ext/um/um_ext.c +11 -0
  26. data/ext/um/um_op.c +87 -0
  27. data/ext/um/um_utils.c +23 -0
  28. data/lib/uringmachine/version.rb +3 -0
  29. data/lib/uringmachine.rb +8 -0
  30. data/test/helper.rb +70 -0
  31. data/test/test_iou.rb +876 -0
  32. data/test/test_um.rb +168 -0
  33. data/uringmachine.gemspec +27 -0
  34. data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
  35. data/vendor/liburing/.github/pull_request_template.md +86 -0
  36. data/vendor/liburing/.github/workflows/build.yml +137 -0
  37. data/vendor/liburing/.github/workflows/codespell.yml +25 -0
  38. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  39. data/vendor/liburing/.gitignore +41 -0
  40. data/vendor/liburing/CHANGELOG +111 -0
  41. data/vendor/liburing/CITATION.cff +11 -0
  42. data/vendor/liburing/COPYING +502 -0
  43. data/vendor/liburing/COPYING.GPL +339 -0
  44. data/vendor/liburing/LICENSE +20 -0
  45. data/vendor/liburing/Makefile +96 -0
  46. data/vendor/liburing/Makefile.common +7 -0
  47. data/vendor/liburing/Makefile.quiet +11 -0
  48. data/vendor/liburing/README +106 -0
  49. data/vendor/liburing/SECURITY.md +6 -0
  50. data/vendor/liburing/configure +624 -0
  51. data/vendor/liburing/debian/README.Debian +7 -0
  52. data/vendor/liburing/debian/changelog +38 -0
  53. data/vendor/liburing/debian/control +39 -0
  54. data/vendor/liburing/debian/copyright +49 -0
  55. data/vendor/liburing/debian/liburing-dev.install +4 -0
  56. data/vendor/liburing/debian/liburing-dev.manpages +5 -0
  57. data/vendor/liburing/debian/liburing2.install +1 -0
  58. data/vendor/liburing/debian/liburing2.symbols +56 -0
  59. data/vendor/liburing/debian/patches/series +1 -0
  60. data/vendor/liburing/debian/rules +29 -0
  61. data/vendor/liburing/debian/source/format +1 -0
  62. data/vendor/liburing/debian/source/local-options +2 -0
  63. data/vendor/liburing/debian/source/options +1 -0
  64. data/vendor/liburing/debian/watch +3 -0
  65. data/vendor/liburing/examples/Makefile +53 -0
  66. data/vendor/liburing/examples/helpers.c +62 -0
  67. data/vendor/liburing/examples/helpers.h +7 -0
  68. data/vendor/liburing/examples/io_uring-close-test.c +123 -0
  69. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  70. data/vendor/liburing/examples/io_uring-test.c +112 -0
  71. data/vendor/liburing/examples/io_uring-udp.c +403 -0
  72. data/vendor/liburing/examples/link-cp.c +193 -0
  73. data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
  74. data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
  75. data/vendor/liburing/examples/poll-bench.c +101 -0
  76. data/vendor/liburing/examples/proxy.c +2461 -0
  77. data/vendor/liburing/examples/proxy.h +102 -0
  78. data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
  79. data/vendor/liburing/examples/send-zerocopy.c +658 -0
  80. data/vendor/liburing/examples/ucontext-cp.c +258 -0
  81. data/vendor/liburing/liburing-ffi.pc.in +12 -0
  82. data/vendor/liburing/liburing.pc.in +12 -0
  83. data/vendor/liburing/liburing.spec +66 -0
  84. data/vendor/liburing/make-debs.sh +55 -0
  85. data/vendor/liburing/src/Makefile +129 -0
  86. data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
  87. data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
  88. data/vendor/liburing/src/arch/generic/lib.h +17 -0
  89. data/vendor/liburing/src/arch/generic/syscall.h +100 -0
  90. data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
  91. data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
  92. data/vendor/liburing/src/arch/syscall-defs.h +94 -0
  93. data/vendor/liburing/src/arch/x86/lib.h +11 -0
  94. data/vendor/liburing/src/arch/x86/syscall.h +296 -0
  95. data/vendor/liburing/src/ffi.c +15 -0
  96. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  97. data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
  98. data/vendor/liburing/src/include/liburing.h +1602 -0
  99. data/vendor/liburing/src/int_flags.h +11 -0
  100. data/vendor/liburing/src/lib.h +52 -0
  101. data/vendor/liburing/src/liburing-ffi.map +211 -0
  102. data/vendor/liburing/src/liburing.map +104 -0
  103. data/vendor/liburing/src/nolibc.c +55 -0
  104. data/vendor/liburing/src/queue.c +468 -0
  105. data/vendor/liburing/src/register.c +374 -0
  106. data/vendor/liburing/src/setup.c +689 -0
  107. data/vendor/liburing/src/setup.h +9 -0
  108. data/vendor/liburing/src/syscall.c +29 -0
  109. data/vendor/liburing/src/syscall.h +53 -0
  110. data/vendor/liburing/src/version.c +21 -0
  111. data/vendor/liburing/test/232c93d07b74.c +305 -0
  112. data/vendor/liburing/test/35fa71a030ca.c +329 -0
  113. data/vendor/liburing/test/500f9fbadef8.c +91 -0
  114. data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
  115. data/vendor/liburing/test/8a9973408177.c +107 -0
  116. data/vendor/liburing/test/917257daa0fe.c +54 -0
  117. data/vendor/liburing/test/Makefile +297 -0
  118. data/vendor/liburing/test/a0908ae19763.c +59 -0
  119. data/vendor/liburing/test/a4c0b3decb33.c +181 -0
  120. data/vendor/liburing/test/accept-link.c +255 -0
  121. data/vendor/liburing/test/accept-non-empty.c +256 -0
  122. data/vendor/liburing/test/accept-reuse.c +163 -0
  123. data/vendor/liburing/test/accept-test.c +83 -0
  124. data/vendor/liburing/test/accept.c +919 -0
  125. data/vendor/liburing/test/across-fork.c +284 -0
  126. data/vendor/liburing/test/b19062a56726.c +54 -0
  127. data/vendor/liburing/test/b5837bd5311d.c +78 -0
  128. data/vendor/liburing/test/bind-listen.c +408 -0
  129. data/vendor/liburing/test/buf-ring-nommap.c +123 -0
  130. data/vendor/liburing/test/buf-ring-put.c +83 -0
  131. data/vendor/liburing/test/buf-ring.c +473 -0
  132. data/vendor/liburing/test/ce593a6c480a.c +139 -0
  133. data/vendor/liburing/test/close-opath.c +123 -0
  134. data/vendor/liburing/test/config +14 -0
  135. data/vendor/liburing/test/connect-rep.c +204 -0
  136. data/vendor/liburing/test/connect.c +442 -0
  137. data/vendor/liburing/test/coredump.c +60 -0
  138. data/vendor/liburing/test/cq-full.c +97 -0
  139. data/vendor/liburing/test/cq-overflow.c +530 -0
  140. data/vendor/liburing/test/cq-peek-batch.c +103 -0
  141. data/vendor/liburing/test/cq-ready.c +95 -0
  142. data/vendor/liburing/test/cq-size.c +65 -0
  143. data/vendor/liburing/test/d4ae271dfaae.c +96 -0
  144. data/vendor/liburing/test/d77a67ed5f27.c +65 -0
  145. data/vendor/liburing/test/defer-taskrun.c +391 -0
  146. data/vendor/liburing/test/defer-tw-timeout.c +173 -0
  147. data/vendor/liburing/test/defer.c +319 -0
  148. data/vendor/liburing/test/double-poll-crash.c +195 -0
  149. data/vendor/liburing/test/drop-submit.c +94 -0
  150. data/vendor/liburing/test/eeed8b54e0df.c +120 -0
  151. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  152. data/vendor/liburing/test/eploop.c +74 -0
  153. data/vendor/liburing/test/eventfd-disable.c +179 -0
  154. data/vendor/liburing/test/eventfd-reg.c +77 -0
  155. data/vendor/liburing/test/eventfd-ring.c +98 -0
  156. data/vendor/liburing/test/eventfd.c +113 -0
  157. data/vendor/liburing/test/evloop.c +73 -0
  158. data/vendor/liburing/test/exec-target.c +6 -0
  159. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  160. data/vendor/liburing/test/fadvise.c +202 -0
  161. data/vendor/liburing/test/fallocate.c +265 -0
  162. data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
  163. data/vendor/liburing/test/fd-install.c +500 -0
  164. data/vendor/liburing/test/fd-pass.c +237 -0
  165. data/vendor/liburing/test/fdinfo.c +419 -0
  166. data/vendor/liburing/test/file-register.c +1189 -0
  167. data/vendor/liburing/test/file-update.c +231 -0
  168. data/vendor/liburing/test/file-verify.c +654 -0
  169. data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
  170. data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
  171. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  172. data/vendor/liburing/test/fixed-buf-merge.c +101 -0
  173. data/vendor/liburing/test/fixed-hugepage.c +411 -0
  174. data/vendor/liburing/test/fixed-link.c +90 -0
  175. data/vendor/liburing/test/fixed-reuse.c +160 -0
  176. data/vendor/liburing/test/fpos.c +255 -0
  177. data/vendor/liburing/test/fsnotify.c +118 -0
  178. data/vendor/liburing/test/fsync.c +224 -0
  179. data/vendor/liburing/test/futex.c +571 -0
  180. data/vendor/liburing/test/hardlink.c +170 -0
  181. data/vendor/liburing/test/helpers.c +318 -0
  182. data/vendor/liburing/test/helpers.h +108 -0
  183. data/vendor/liburing/test/ignore-single-mmap.c +48 -0
  184. data/vendor/liburing/test/init-mem.c +164 -0
  185. data/vendor/liburing/test/io-cancel.c +561 -0
  186. data/vendor/liburing/test/io_uring_enter.c +264 -0
  187. data/vendor/liburing/test/io_uring_passthrough.c +482 -0
  188. data/vendor/liburing/test/io_uring_register.c +503 -0
  189. data/vendor/liburing/test/io_uring_setup.c +110 -0
  190. data/vendor/liburing/test/iopoll-leak.c +85 -0
  191. data/vendor/liburing/test/iopoll-overflow.c +118 -0
  192. data/vendor/liburing/test/iopoll.c +465 -0
  193. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  194. data/vendor/liburing/test/lfs-openat.c +273 -0
  195. data/vendor/liburing/test/link-timeout.c +1108 -0
  196. data/vendor/liburing/test/link.c +497 -0
  197. data/vendor/liburing/test/link_drain.c +255 -0
  198. data/vendor/liburing/test/madvise.c +195 -0
  199. data/vendor/liburing/test/min-timeout-wait.c +354 -0
  200. data/vendor/liburing/test/min-timeout.c +233 -0
  201. data/vendor/liburing/test/mkdir.c +112 -0
  202. data/vendor/liburing/test/msg-ring-fd.c +331 -0
  203. data/vendor/liburing/test/msg-ring-flags.c +212 -0
  204. data/vendor/liburing/test/msg-ring-overflow.c +159 -0
  205. data/vendor/liburing/test/msg-ring.c +467 -0
  206. data/vendor/liburing/test/multicqes_drain.c +429 -0
  207. data/vendor/liburing/test/napi-test.c +215 -0
  208. data/vendor/liburing/test/napi-test.sh +48 -0
  209. data/vendor/liburing/test/no-mmap-inval.c +42 -0
  210. data/vendor/liburing/test/nolibc.c +62 -0
  211. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  212. data/vendor/liburing/test/nop.c +177 -0
  213. data/vendor/liburing/test/nvme.h +169 -0
  214. data/vendor/liburing/test/ooo-file-unreg.c +82 -0
  215. data/vendor/liburing/test/open-close.c +261 -0
  216. data/vendor/liburing/test/open-direct-link.c +188 -0
  217. data/vendor/liburing/test/open-direct-pick.c +180 -0
  218. data/vendor/liburing/test/openat2.c +312 -0
  219. data/vendor/liburing/test/personality.c +204 -0
  220. data/vendor/liburing/test/pipe-bug.c +95 -0
  221. data/vendor/liburing/test/pipe-eof.c +83 -0
  222. data/vendor/liburing/test/pipe-reuse.c +105 -0
  223. data/vendor/liburing/test/poll-cancel-all.c +496 -0
  224. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  225. data/vendor/liburing/test/poll-cancel.c +228 -0
  226. data/vendor/liburing/test/poll-link.c +221 -0
  227. data/vendor/liburing/test/poll-many.c +230 -0
  228. data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
  229. data/vendor/liburing/test/poll-mshot-update.c +323 -0
  230. data/vendor/liburing/test/poll-race-mshot.c +276 -0
  231. data/vendor/liburing/test/poll-race.c +105 -0
  232. data/vendor/liburing/test/poll-ring.c +48 -0
  233. data/vendor/liburing/test/poll-v-poll.c +353 -0
  234. data/vendor/liburing/test/poll.c +327 -0
  235. data/vendor/liburing/test/probe.c +135 -0
  236. data/vendor/liburing/test/read-before-exit.c +129 -0
  237. data/vendor/liburing/test/read-mshot-empty.c +153 -0
  238. data/vendor/liburing/test/read-mshot.c +404 -0
  239. data/vendor/liburing/test/read-write.c +1013 -0
  240. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  241. data/vendor/liburing/test/recv-msgall.c +263 -0
  242. data/vendor/liburing/test/recv-multishot.c +602 -0
  243. data/vendor/liburing/test/recvsend_bundle.c +691 -0
  244. data/vendor/liburing/test/reg-fd-only.c +131 -0
  245. data/vendor/liburing/test/reg-hint.c +56 -0
  246. data/vendor/liburing/test/reg-reg-ring.c +90 -0
  247. data/vendor/liburing/test/regbuf-merge.c +91 -0
  248. data/vendor/liburing/test/register-restrictions.c +633 -0
  249. data/vendor/liburing/test/rename.c +132 -0
  250. data/vendor/liburing/test/ring-leak.c +283 -0
  251. data/vendor/liburing/test/ring-leak2.c +249 -0
  252. data/vendor/liburing/test/ringbuf-read.c +196 -0
  253. data/vendor/liburing/test/ringbuf-status.c +242 -0
  254. data/vendor/liburing/test/rsrc_tags.c +461 -0
  255. data/vendor/liburing/test/runtests-loop.sh +16 -0
  256. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  257. data/vendor/liburing/test/runtests.sh +168 -0
  258. data/vendor/liburing/test/rw_merge_test.c +98 -0
  259. data/vendor/liburing/test/self.c +91 -0
  260. data/vendor/liburing/test/send-zerocopy.c +971 -0
  261. data/vendor/liburing/test/send_recv.c +412 -0
  262. data/vendor/liburing/test/send_recvmsg.c +444 -0
  263. data/vendor/liburing/test/shared-wq.c +84 -0
  264. data/vendor/liburing/test/short-read.c +75 -0
  265. data/vendor/liburing/test/shutdown.c +165 -0
  266. data/vendor/liburing/test/sigfd-deadlock.c +88 -0
  267. data/vendor/liburing/test/single-issuer.c +169 -0
  268. data/vendor/liburing/test/skip-cqe.c +428 -0
  269. data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
  270. data/vendor/liburing/test/socket-io-cmd.c +237 -0
  271. data/vendor/liburing/test/socket-rw-eagain.c +149 -0
  272. data/vendor/liburing/test/socket-rw-offset.c +149 -0
  273. data/vendor/liburing/test/socket-rw.c +137 -0
  274. data/vendor/liburing/test/socket.c +408 -0
  275. data/vendor/liburing/test/splice.c +512 -0
  276. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  277. data/vendor/liburing/test/sq-full.c +45 -0
  278. data/vendor/liburing/test/sq-poll-dup.c +211 -0
  279. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  280. data/vendor/liburing/test/sq-poll-share.c +138 -0
  281. data/vendor/liburing/test/sq-space_left.c +159 -0
  282. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  283. data/vendor/liburing/test/sqpoll-exec.c +132 -0
  284. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  285. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  286. data/vendor/liburing/test/statx.c +172 -0
  287. data/vendor/liburing/test/stdout.c +232 -0
  288. data/vendor/liburing/test/submit-and-wait.c +108 -0
  289. data/vendor/liburing/test/submit-link-fail.c +156 -0
  290. data/vendor/liburing/test/submit-reuse.c +237 -0
  291. data/vendor/liburing/test/symlink.c +117 -0
  292. data/vendor/liburing/test/sync-cancel.c +235 -0
  293. data/vendor/liburing/test/teardowns.c +58 -0
  294. data/vendor/liburing/test/test.h +36 -0
  295. data/vendor/liburing/test/thread-exit.c +143 -0
  296. data/vendor/liburing/test/timeout-new.c +256 -0
  297. data/vendor/liburing/test/timeout.c +1798 -0
  298. data/vendor/liburing/test/truncate.c +186 -0
  299. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  300. data/vendor/liburing/test/unlink.c +112 -0
  301. data/vendor/liburing/test/version.c +25 -0
  302. data/vendor/liburing/test/wait-timeout.c +287 -0
  303. data/vendor/liburing/test/waitid.c +373 -0
  304. data/vendor/liburing/test/wakeup-hang.c +162 -0
  305. data/vendor/liburing/test/wq-aff.c +146 -0
  306. data/vendor/liburing/test/xattr.c +442 -0
  307. metadata +412 -0
@@ -0,0 +1,258 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * gcc -Wall -O2 -D_GNU_SOURCE -o ucontext-cp ucontext-cp.c -luring
4
+ */
5
+ #define _POSIX_C_SOURCE 199309L
6
+ #include <stdio.h>
7
+ #include <fcntl.h>
8
+ #include <string.h>
9
+ #include <stdlib.h>
10
+ #include <unistd.h>
11
+ #include <assert.h>
12
+ #include <errno.h>
13
+ #include <ucontext.h>
14
+ #include <signal.h>
15
+ #include <inttypes.h>
16
+ #include <sys/types.h>
17
+ #include <sys/ioctl.h>
18
+ #include <sys/timerfd.h>
19
+ #include <poll.h>
20
+ #include "liburing.h"
21
+
22
+ #define QD 64
23
+ #define BS 1024
24
+
25
+ #ifndef SIGSTKSZ
26
+ #define SIGSTKSZ 8192
27
+ #endif
28
+
29
+ typedef struct {
30
+ struct io_uring *ring;
31
+ unsigned char *stack_buf;
32
+ ucontext_t ctx_main, ctx_fnew;
33
+ } async_context;
34
+
35
+ typedef struct {
36
+ async_context *pctx;
37
+ int *psuccess;
38
+ int *pfailure;
39
+ int infd;
40
+ int outfd;
41
+ } arguments_bundle;
42
+
43
+ #define DEFINE_AWAIT_OP(operation) \
44
+ static ssize_t await_##operation( \
45
+ async_context *pctx, \
46
+ int fd, \
47
+ const struct iovec *ioves, \
48
+ unsigned int nr_vecs, \
49
+ off_t offset) \
50
+ { \
51
+ struct io_uring_sqe *sqe = io_uring_get_sqe(pctx->ring); \
52
+ struct io_uring_cqe *cqe; \
53
+ \
54
+ if (!sqe) \
55
+ return -1; \
56
+ \
57
+ io_uring_prep_##operation(sqe, fd, ioves, nr_vecs, offset); \
58
+ io_uring_sqe_set_data(sqe, pctx); \
59
+ swapcontext(&pctx->ctx_fnew, &pctx->ctx_main); \
60
+ io_uring_peek_cqe(pctx->ring, &cqe); \
61
+ assert(cqe); \
62
+ io_uring_cqe_seen(pctx->ring, cqe); \
63
+ \
64
+ return cqe->res; \
65
+ }
66
+
67
+ DEFINE_AWAIT_OP(readv)
68
+ DEFINE_AWAIT_OP(writev)
69
+ #undef DEFINE_AWAIT_OP
70
+
71
+ static int await_delay(async_context *pctx, time_t seconds)
72
+ {
73
+ struct io_uring_sqe *sqe = io_uring_get_sqe(pctx->ring);
74
+ struct io_uring_cqe *cqe;
75
+ struct __kernel_timespec ts = {
76
+ .tv_sec = seconds,
77
+ .tv_nsec = 0
78
+ };
79
+
80
+ if (!sqe)
81
+ return -1;
82
+
83
+ io_uring_prep_timeout(sqe, &ts, 0, 0);
84
+ io_uring_sqe_set_data(sqe, pctx);
85
+ swapcontext(&pctx->ctx_fnew, &pctx->ctx_main);
86
+ io_uring_peek_cqe(pctx->ring, &cqe);
87
+ assert(cqe);
88
+ io_uring_cqe_seen(pctx->ring, cqe);
89
+
90
+ return 0;
91
+ }
92
+
93
+ static int setup_context(async_context *pctx, struct io_uring *ring)
94
+ {
95
+ int ret;
96
+
97
+ pctx->ring = ring;
98
+ ret = getcontext(&pctx->ctx_fnew);
99
+ if (ret < 0) {
100
+ perror("getcontext");
101
+ return -1;
102
+ }
103
+ pctx->stack_buf = malloc(SIGSTKSZ);
104
+ if (!pctx->stack_buf) {
105
+ perror("malloc");
106
+ return -1;
107
+ }
108
+ pctx->ctx_fnew.uc_stack.ss_sp = pctx->stack_buf;
109
+ pctx->ctx_fnew.uc_stack.ss_size = SIGSTKSZ;
110
+ pctx->ctx_fnew.uc_link = &pctx->ctx_main;
111
+
112
+ return 0;
113
+ }
114
+
115
+ static int copy_file(async_context *pctx, int infd, int outfd, struct iovec* piov)
116
+ {
117
+ off_t offset = 0;
118
+
119
+ for (;;) {
120
+ ssize_t bytes_read;
121
+
122
+ printf("%d->%d: readv %ld bytes from %ld\n", infd, outfd, (long) piov->iov_len, (long) offset);
123
+ if ((bytes_read = await_readv(pctx, infd, piov, 1, offset)) < 0) {
124
+ perror("await_readv");
125
+ return 1;
126
+ }
127
+ if (bytes_read == 0)
128
+ return 0;
129
+
130
+ piov->iov_len = bytes_read;
131
+
132
+ printf("%d->%d: writev %ld bytes from %ld\n", infd, outfd, (long) piov->iov_len, (long) offset);
133
+ if (await_writev(pctx, outfd, piov, 1, offset) != bytes_read) {
134
+ perror("await_writev");
135
+ return 1;
136
+ }
137
+ if (bytes_read < BS)
138
+ return 0;
139
+ offset += bytes_read;
140
+
141
+ printf("%d->%d: wait %ds\n", infd, outfd, 1);
142
+ await_delay(pctx, 1);
143
+ }
144
+ }
145
+
146
+ static void copy_file_wrapper(arguments_bundle *pbundle)
147
+ {
148
+ struct iovec iov = {
149
+ .iov_base = malloc(BS),
150
+ .iov_len = BS,
151
+ };
152
+ async_context *pctx = pbundle->pctx;
153
+
154
+ int ret = copy_file(pctx, pbundle->infd, pbundle->outfd, &iov);
155
+
156
+ printf("%d->%d: done with ret code %d\n", pbundle->infd, pbundle->outfd, ret);
157
+
158
+ if (ret == 0) {
159
+ ++*pbundle->psuccess;
160
+ } else {
161
+ ++*pbundle->pfailure;
162
+ }
163
+
164
+ free(iov.iov_base);
165
+ close(pbundle->infd);
166
+ close(pbundle->outfd);
167
+ free(pbundle->pctx->stack_buf);
168
+ free(pbundle->pctx);
169
+ free(pbundle);
170
+
171
+ swapcontext(&pctx->ctx_fnew, &pctx->ctx_main);
172
+ }
173
+
174
+ int main(int argc, char *argv[])
175
+ {
176
+ struct io_uring ring;
177
+ int i, req_count, ret;
178
+ int success = 0, failure = 0;
179
+
180
+ if (argc < 3) {
181
+ fprintf(stderr, "%s: infile1 outfile1 [infile2 outfile2 [...]]\n", argv[0]);
182
+ return 1;
183
+ }
184
+
185
+ ret = io_uring_queue_init(QD, &ring, 0);
186
+ if (ret < 0) {
187
+ fprintf(stderr, "queue_init: %s\n", strerror(-ret));
188
+ return -1;
189
+ }
190
+
191
+ req_count = (argc - 1) / 2;
192
+ printf("copying %d files...\n", req_count);
193
+
194
+ for (i = 1; i < argc; i += 2) {
195
+ int infd, outfd;
196
+
197
+ async_context *pctx = malloc(sizeof(*pctx));
198
+
199
+ if (!pctx || setup_context(pctx, &ring))
200
+ return 1;
201
+
202
+ infd = open(argv[i], O_RDONLY);
203
+ if (infd < 0) {
204
+ perror("open infile");
205
+ return 1;
206
+ }
207
+ outfd = open(argv[i + 1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
208
+ if (outfd < 0) {
209
+ perror("open outfile");
210
+ return 1;
211
+ }
212
+
213
+ arguments_bundle *pbundle = malloc(sizeof(*pbundle));
214
+ pbundle->pctx = pctx;
215
+ pbundle->psuccess = &success;
216
+ pbundle->pfailure = &failure;
217
+ pbundle->infd = infd;
218
+ pbundle->outfd = outfd;
219
+
220
+ makecontext(&pctx->ctx_fnew, (void (*)(void)) copy_file_wrapper, 1, pbundle);
221
+
222
+ if (swapcontext(&pctx->ctx_main, &pctx->ctx_fnew)) {
223
+ perror("swapcontext");
224
+ return 1;
225
+ }
226
+ }
227
+
228
+ /* event loop */
229
+ while (success + failure < req_count) {
230
+ struct io_uring_cqe *cqe;
231
+
232
+ /* usually be timed waiting */
233
+ ret = io_uring_submit_and_wait(&ring, 1);
234
+ if (ret < 0) {
235
+ fprintf(stderr, "submit_and_wait: %s\n", strerror(-ret));
236
+ return 1;
237
+ }
238
+
239
+ ret = io_uring_wait_cqe(&ring, &cqe);
240
+ if (ret < 0) {
241
+ fprintf(stderr, "wait_cqe: %s\n", strerror(-ret));
242
+ return 1;
243
+ }
244
+
245
+ async_context *pctx = io_uring_cqe_get_data(cqe);
246
+
247
+ if (swapcontext(&pctx->ctx_main, &pctx->ctx_fnew)) {
248
+ perror("swapcontext");
249
+ return 1;
250
+ }
251
+ }
252
+
253
+ io_uring_queue_exit(&ring);
254
+
255
+ printf("finished with %d success(es) and %d failure(s)\n", success, failure);
256
+
257
+ return failure > 0;
258
+ }
@@ -0,0 +1,12 @@
1
+ prefix=@prefix@
2
+ exec_prefix=${prefix}
3
+ libdir=@libdir@
4
+ includedir=@includedir@
5
+
6
+ Name: @NAME@
7
+ Version: @VERSION@
8
+ Description: io_uring FFI library
9
+ URL: https://git.kernel.dk/cgit/liburing/
10
+
11
+ Libs: -L${libdir} -luring-ffi
12
+ Cflags: -I${includedir}
@@ -0,0 +1,12 @@
1
+ prefix=@prefix@
2
+ exec_prefix=${prefix}
3
+ libdir=@libdir@
4
+ includedir=@includedir@
5
+
6
+ Name: @NAME@
7
+ Version: @VERSION@
8
+ Description: io_uring library
9
+ URL: https://git.kernel.dk/cgit/liburing/
10
+
11
+ Libs: -L${libdir} -luring
12
+ Cflags: -I${includedir} -D_GNU_SOURCE
@@ -0,0 +1,66 @@
1
+ Name: liburing
2
+ Version: 2.8
3
+ Release: 1%{?dist}
4
+ Summary: Linux-native io_uring I/O access library
5
+ License: (GPLv2 with exceptions and LGPLv2+) or MIT
6
+ Source0: https://brick.kernel.dk/snaps/%{name}-%{version}.tar.gz
7
+ Source1: https://brick.kernel.dk/snaps/%{name}-%{version}.tar.gz.asc
8
+ URL: https://git.kernel.dk/cgit/liburing/
9
+ BuildRequires: gcc
10
+ BuildRequires: make
11
+
12
+ %description
13
+ Provides native async IO for the Linux kernel, in a fast and efficient
14
+ manner, for both buffered and O_DIRECT.
15
+
16
+ %package devel
17
+ Summary: Development files for Linux-native io_uring I/O access library
18
+ Requires: %{name}%{_isa} = %{version}-%{release}
19
+ Requires: pkgconfig
20
+
21
+ %description devel
22
+ This package provides header files to include and libraries to link with
23
+ for the Linux-native io_uring.
24
+
25
+ %prep
26
+ %autosetup
27
+
28
+ %build
29
+ %set_build_flags
30
+ ./configure --prefix=%{_prefix} --libdir=%{_libdir} --libdevdir=%{_libdir} --mandir=%{_mandir} --includedir=%{_includedir}
31
+
32
+ %make_build
33
+
34
+ %install
35
+ %make_install
36
+
37
+ %files
38
+ %attr(0755,root,root) %{_libdir}/liburing.so.*
39
+ %license COPYING
40
+
41
+ %files devel
42
+ %{_includedir}/liburing/
43
+ %{_includedir}/liburing.h
44
+ %{_libdir}/liburing.so
45
+ %exclude %{_libdir}/liburing.a
46
+ %{_libdir}/pkgconfig/*
47
+ %{_mandir}/man2/*
48
+ %{_mandir}/man3/*
49
+ %{_mandir}/man7/*
50
+
51
+ %changelog
52
+ * Thu Oct 31 2019 Jeff Moyer <jmoyer@redhat.com> - 0.2-1
53
+ - Add io_uring_cq_ready()
54
+ - Add io_uring_peek_batch_cqe()
55
+ - Add io_uring_prep_accept()
56
+ - Add io_uring_prep_{recv,send}msg()
57
+ - Add io_uring_prep_timeout_remove()
58
+ - Add io_uring_queue_init_params()
59
+ - Add io_uring_register_files_update()
60
+ - Add io_uring_sq_space_left()
61
+ - Add io_uring_wait_cqe_timeout()
62
+ - Add io_uring_wait_cqes()
63
+ - Add io_uring_wait_cqes_timeout()
64
+
65
+ * Tue Jan 8 2019 Jens Axboe <axboe@kernel.dk> - 0.1
66
+ - Initial version
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (C) 2019 Liu Changcheng <changcheng.liu@aliyun.com>
3
+ # Author: Liu Changcheng <changcheng.liu@aliyun.com>
4
+ #
5
+ # This program is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU General Public License
7
+ # as published by the Free Software Foundation; either version 2
8
+ # of the License, or (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+ set -xe
19
+
20
+ # Create dir for build
21
+ base=${1:-/tmp/release}
22
+ distro=unstable
23
+ releasedir=$base/$(lsb_release -si)/liburing
24
+ rm -rf $releasedir
25
+ mkdir -p $releasedir
26
+ HEAD=$(which head)
27
+ DCH=$(which dch)
28
+
29
+ src_dir=$(readlink -e `basename $0`)
30
+ liburing_dir=$(dirname $src_dir)
31
+ basename=$(basename $liburing_dir)
32
+ dirname=$(dirname $liburing_dir)
33
+ version=$(git describe --match "lib*" | cut -d '-' -f 2)
34
+ outfile="liburing-$version"
35
+ orgfile=$(echo $outfile | tr '-' '_')
36
+
37
+ # Prepare source code
38
+ cp -arf ${dirname}/${basename} ${releasedir}/${outfile}
39
+ cd ${releasedir}/${outfile}
40
+ git clean -dxf
41
+
42
+ # Change changelog if it's needed
43
+ cur_ver=`$HEAD < debian/changelog | sed -n -e 's/.* (\(.*\)) .*/\1/p'`
44
+ if [ "$cur_ver" != "$version-1" ]; then
45
+ $DCH -D $distro --force-distribution -b -v "$version-1" "new version"
46
+ fi
47
+
48
+ # Create tar archive
49
+ cd ../
50
+ tar cvzf ${outfile}.tar.gz ${outfile}
51
+ ln -s ${outfile}.tar.gz ${orgfile}.orig.tar.gz
52
+
53
+ # Build debian package
54
+ cd -
55
+ debuild
@@ -0,0 +1,129 @@
1
+ include ../Makefile.common
2
+
3
+ prefix ?= /usr
4
+ includedir ?= $(prefix)/include
5
+ libdir ?= $(prefix)/lib
6
+ libdevdir ?= $(prefix)/lib
7
+
8
+ LIBURING_CFLAGS ?=
9
+ CPPFLAGS ?=
10
+ override CPPFLAGS += -D_GNU_SOURCE \
11
+ -Iinclude/ -include ../config-host.h \
12
+ -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
13
+ CFLAGS ?= -O3 -Wall -Wextra -fno-stack-protector
14
+ override CFLAGS += -Wno-unused-parameter \
15
+ -DLIBURING_INTERNAL \
16
+ $(LIBURING_CFLAGS)
17
+ SO_CFLAGS=-fPIC $(CFLAGS)
18
+ L_CFLAGS=$(CFLAGS)
19
+ LINK_FLAGS=-Wl,-z,defs
20
+ LINK_FLAGS+=$(LDFLAGS)
21
+ ENABLE_SHARED ?= 1
22
+
23
+ soname=liburing.so.$(VERSION_MAJOR)
24
+ libname=liburing.so.$(VERSION)
25
+ ffi_soname=liburing-ffi.so.$(VERSION_MAJOR)
26
+ ffi_libname=liburing-ffi.so.$(VERSION)
27
+
28
+ all_targets += liburing.a
29
+ all_targets += liburing-ffi.a
30
+
31
+ ifeq ($(ENABLE_SHARED),1)
32
+ all_targets += $(libname)
33
+ all_targets += $(ffi_libname)
34
+ endif
35
+
36
+ include ../Makefile.quiet
37
+
38
+ ifneq ($(MAKECMDGOALS),clean)
39
+ include ../config-host.mak
40
+ endif
41
+
42
+ all: $(all_targets)
43
+
44
+ liburing_srcs := setup.c queue.c register.c syscall.c version.c
45
+
46
+ ifeq ($(CONFIG_NOLIBC),y)
47
+ liburing_srcs += nolibc.c
48
+ override CFLAGS += -nostdlib -nodefaultlibs -ffreestanding -fno-builtin -fno-stack-protector
49
+ override CPPFLAGS += -nostdlib -nodefaultlibs -ffreestanding -fno-builtin -fno-stack-protector
50
+ override LINK_FLAGS += -nostdlib -nodefaultlibs $(libgcc_link_flag)
51
+ endif
52
+
53
+ override CPPFLAGS += -MT "$@" -MMD -MP -MF "$@.d"
54
+ liburing_objs := $(patsubst %.c,%.ol,$(liburing_srcs))
55
+ liburing_sobjs := $(patsubst %.c,%.os,$(liburing_srcs))
56
+ liburing_ffi_objs := ffi.ol
57
+ liburing_ffi_sobjs := ffi.os
58
+
59
+ %.os: %.c
60
+ $(QUIET_CC)$(CC) $(CPPFLAGS) $(SO_CFLAGS) -c -o $@ $<
61
+
62
+ %.ol: %.c
63
+ $(QUIET_CC)$(CC) $(CPPFLAGS) $(L_CFLAGS) -c -o $@ $<
64
+
65
+ # Include compiler generated dependency files.
66
+ -include $(liburing_objs:%=%.d)
67
+ -include $(liburing_sobjs:%=%.d)
68
+
69
+ AR ?= ar
70
+ RANLIB ?= ranlib
71
+ liburing.a: $(liburing_objs)
72
+ @rm -f liburing.a
73
+ $(QUIET_AR)$(AR) r liburing.a $^
74
+ $(QUIET_RANLIB)$(RANLIB) liburing.a
75
+
76
+ liburing-ffi.a: $(liburing_objs) $(liburing_ffi_objs)
77
+ @rm -f liburing-ffi.a
78
+ $(QUIET_AR)$(AR) r liburing-ffi.a $^
79
+ $(QUIET_RANLIB)$(RANLIB) liburing-ffi.a
80
+
81
+ $(libname): $(liburing_sobjs) liburing.map
82
+ $(QUIET_CC)$(CC) $(SO_CFLAGS) -shared -Wl,--version-script=liburing.map -Wl,-soname=$(soname) -o $@ $(liburing_sobjs) $(LINK_FLAGS)
83
+
84
+ $(ffi_libname): $(liburing_ffi_objs) $(liburing_ffi_sobjs) $(liburing_sobjs) liburing-ffi.map
85
+ $(QUIET_CC)$(CC) $(SO_CFLAGS) -shared -Wl,--version-script=liburing-ffi.map -Wl,-soname=$(ffi_soname) -o $@ $(liburing_sobjs) $(liburing_ffi_sobjs) $(LINK_FLAGS)
86
+
87
+ install: $(all_targets)
88
+ install -D -m 644 include/liburing/io_uring.h $(includedir)/liburing/io_uring.h
89
+ install -D -m 644 include/liburing.h $(includedir)/liburing.h
90
+ install -D -m 644 include/liburing/compat.h $(includedir)/liburing/compat.h
91
+ install -D -m 644 include/liburing/barrier.h $(includedir)/liburing/barrier.h
92
+ install -D -m 644 include/liburing/io_uring_version.h $(includedir)/liburing/io_uring_version.h
93
+ install -D -m 644 liburing.a $(libdevdir)/liburing.a
94
+ install -D -m 644 liburing-ffi.a $(libdevdir)/liburing-ffi.a
95
+ ifeq ($(ENABLE_SHARED),1)
96
+ install -D -m 755 $(libname) $(libdir)/$(libname)
97
+ install -D -m 755 $(ffi_libname) $(libdir)/$(ffi_libname)
98
+ ln -sf $(libname) $(libdir)/$(soname)
99
+ ln -sf $(relativelibdir)$(libname) $(libdevdir)/liburing.so
100
+ ln -sf $(ffi_libname) $(libdir)/$(ffi_soname)
101
+ ln -sf $(relativelibdir)$(ffi_libname) $(libdevdir)/liburing-ffi.so
102
+ endif
103
+
104
+ uninstall:
105
+ @rm -f $(includedir)/liburing/io_uring.h
106
+ @rm -f $(includedir)/liburing.h
107
+ @rm -f $(includedir)/liburing/compat.h
108
+ @rm -f $(includedir)/liburing/barrier.h
109
+ @rm -f $(includedir)/liburing/io_uring_version.h
110
+ @rm -f $(libdevdir)/liburing.a
111
+ @rm -f $(libdevdir)/liburing-ffi.a
112
+ ifeq ($(ENABLE_SHARED),1)
113
+ @rm -f $(libdir)/$(libname)
114
+ @rm -f $(libdir)/$(ffi_libname)
115
+ @rm -f $(libdir)/$(soname)
116
+ @rm -f $(libdevdir)/liburing.so
117
+ @rm -f $(libdir)/$(ffi_soname)
118
+ @rm -f $(libdevdir)/liburing-ffi.so
119
+ endif
120
+
121
+ clean:
122
+ @rm -f $(all_targets) $(liburing_objs) $(liburing_sobjs) $(liburing_ffi_objs) $(liburing_ffi_sobjs) $(soname).new
123
+ @rm -f *.so* *.a *.o *.d
124
+ @rm -f include/liburing/compat.h
125
+ @rm -f include/liburing/io_uring_version.h
126
+
127
+ @# When cleaning, we don't include ../config-host.mak,
128
+ @# so the nolibc objects are always skipped, clean them up!
129
+ @rm -f nolibc.ol nolibc.os
@@ -0,0 +1,47 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ #ifndef LIBURING_ARCH_AARCH64_LIB_H
4
+ #define LIBURING_ARCH_AARCH64_LIB_H
5
+
6
+ #include <elf.h>
7
+ #include "../../syscall.h"
8
+
9
+ static inline long __get_page_size(void)
10
+ {
11
+ Elf64_Off buf[2];
12
+ long ret = 4096;
13
+ int fd;
14
+
15
+ fd = __sys_open("/proc/self/auxv", O_RDONLY, 0);
16
+ if (fd < 0)
17
+ return ret;
18
+
19
+ while (1) {
20
+ ssize_t x;
21
+
22
+ x = __sys_read(fd, buf, sizeof(buf));
23
+ if (x < (long) sizeof(buf))
24
+ break;
25
+
26
+ if (buf[0] == AT_PAGESZ) {
27
+ ret = buf[1];
28
+ break;
29
+ }
30
+ }
31
+
32
+ __sys_close(fd);
33
+ return ret;
34
+ }
35
+
36
+ static inline long get_page_size(void)
37
+ {
38
+ static long cache_val;
39
+
40
+ if (cache_val)
41
+ return cache_val;
42
+
43
+ cache_val = __get_page_size();
44
+ return cache_val;
45
+ }
46
+
47
+ #endif /* #ifndef LIBURING_ARCH_AARCH64_LIB_H */
@@ -0,0 +1,91 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ #ifndef LIBURING_ARCH_AARCH64_SYSCALL_H
4
+ #define LIBURING_ARCH_AARCH64_SYSCALL_H
5
+
6
+ #if defined(__aarch64__)
7
+
8
+ #define __do_syscallN(...) ({ \
9
+ __asm__ volatile ( \
10
+ "svc 0" \
11
+ : "=r"(x0) \
12
+ : __VA_ARGS__ \
13
+ : "memory", "cc"); \
14
+ (long) x0; \
15
+ })
16
+
17
+ #define __do_syscall0(__n) ({ \
18
+ register long x8 __asm__("x8") = __n; \
19
+ register long x0 __asm__("x0"); \
20
+ \
21
+ __do_syscallN("r" (x8)); \
22
+ })
23
+
24
+ #define __do_syscall1(__n, __a) ({ \
25
+ register long x8 __asm__("x8") = __n; \
26
+ register __typeof__(__a) x0 __asm__("x0") = __a; \
27
+ \
28
+ __do_syscallN("r" (x8), "0" (x0)); \
29
+ })
30
+
31
+ #define __do_syscall2(__n, __a, __b) ({ \
32
+ register long x8 __asm__("x8") = __n; \
33
+ register __typeof__(__a) x0 __asm__("x0") = __a; \
34
+ register __typeof__(__b) x1 __asm__("x1") = __b; \
35
+ \
36
+ __do_syscallN("r" (x8), "0" (x0), "r" (x1)); \
37
+ })
38
+
39
+ #define __do_syscall3(__n, __a, __b, __c) ({ \
40
+ register long x8 __asm__("x8") = __n; \
41
+ register __typeof__(__a) x0 __asm__("x0") = __a; \
42
+ register __typeof__(__b) x1 __asm__("x1") = __b; \
43
+ register __typeof__(__c) x2 __asm__("x2") = __c; \
44
+ \
45
+ __do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2)); \
46
+ })
47
+
48
+ #define __do_syscall4(__n, __a, __b, __c, __d) ({ \
49
+ register long x8 __asm__("x8") = __n; \
50
+ register __typeof__(__a) x0 __asm__("x0") = __a; \
51
+ register __typeof__(__b) x1 __asm__("x1") = __b; \
52
+ register __typeof__(__c) x2 __asm__("x2") = __c; \
53
+ register __typeof__(__d) x3 __asm__("x3") = __d; \
54
+ \
55
+ __do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2), "r" (x3));\
56
+ })
57
+
58
+ #define __do_syscall5(__n, __a, __b, __c, __d, __e) ({ \
59
+ register long x8 __asm__("x8") = __n; \
60
+ register __typeof__(__a) x0 __asm__("x0") = __a; \
61
+ register __typeof__(__b) x1 __asm__("x1") = __b; \
62
+ register __typeof__(__c) x2 __asm__("x2") = __c; \
63
+ register __typeof__(__d) x3 __asm__("x3") = __d; \
64
+ register __typeof__(__e) x4 __asm__("x4") = __e; \
65
+ \
66
+ __do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2), "r" (x3), \
67
+ "r"(x4)); \
68
+ })
69
+
70
+ #define __do_syscall6(__n, __a, __b, __c, __d, __e, __f) ({ \
71
+ register long x8 __asm__("x8") = __n; \
72
+ register __typeof__(__a) x0 __asm__("x0") = __a; \
73
+ register __typeof__(__b) x1 __asm__("x1") = __b; \
74
+ register __typeof__(__c) x2 __asm__("x2") = __c; \
75
+ register __typeof__(__d) x3 __asm__("x3") = __d; \
76
+ register __typeof__(__e) x4 __asm__("x4") = __e; \
77
+ register __typeof__(__f) x5 __asm__("x5") = __f; \
78
+ \
79
+ __do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2), "r" (x3), \
80
+ "r" (x4), "r"(x5)); \
81
+ })
82
+
83
+ #include "../syscall-defs.h"
84
+
85
+ #else /* #if defined(__aarch64__) */
86
+
87
+ #include "../generic/syscall.h"
88
+
89
+ #endif /* #if defined(__aarch64__) */
90
+
91
+ #endif /* #ifndef LIBURING_ARCH_AARCH64_SYSCALL_H */
@@ -0,0 +1,17 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+
3
+ #ifndef LIBURING_ARCH_GENERIC_LIB_H
4
+ #define LIBURING_ARCH_GENERIC_LIB_H
5
+
6
+ static inline long get_page_size(void)
7
+ {
8
+ long page_size;
9
+
10
+ page_size = sysconf(_SC_PAGESIZE);
11
+ if (page_size < 0)
12
+ page_size = 4096;
13
+
14
+ return page_size;
15
+ }
16
+
17
+ #endif /* #ifndef LIBURING_ARCH_GENERIC_LIB_H */