polyphony 0.85 → 0.86

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 (230) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile.lock +1 -1
  4. data/ext/polyphony/io_extensions.c +2 -3
  5. data/lib/polyphony/version.rb +1 -1
  6. data/polyphony.gemspec +1 -1
  7. data/test/test_backend.rb +1 -1
  8. data/test/test_signal.rb +3 -3
  9. data/vendor/liburing/.github/pull_request_template.md +86 -0
  10. data/vendor/liburing/.github/workflows/build.yml +85 -0
  11. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  12. data/vendor/liburing/.gitignore +149 -0
  13. data/vendor/liburing/COPYING +502 -0
  14. data/vendor/liburing/COPYING.GPL +339 -0
  15. data/vendor/liburing/LICENSE +7 -0
  16. data/vendor/liburing/Makefile +82 -0
  17. data/vendor/liburing/Makefile.common +5 -0
  18. data/vendor/liburing/Makefile.quiet +11 -0
  19. data/vendor/liburing/README +46 -0
  20. data/vendor/liburing/configure +486 -0
  21. data/vendor/liburing/debian/README.Debian +7 -0
  22. data/vendor/liburing/debian/changelog +27 -0
  23. data/vendor/liburing/debian/compat +1 -0
  24. data/vendor/liburing/debian/control +48 -0
  25. data/vendor/liburing/debian/copyright +49 -0
  26. data/vendor/liburing/debian/liburing-dev.install +4 -0
  27. data/vendor/liburing/debian/liburing-dev.manpages +6 -0
  28. data/vendor/liburing/debian/liburing1-udeb.install +1 -0
  29. data/vendor/liburing/debian/liburing1.install +1 -0
  30. data/vendor/liburing/debian/liburing1.symbols +32 -0
  31. data/vendor/liburing/debian/patches/series +1 -0
  32. data/vendor/liburing/debian/rules +81 -0
  33. data/vendor/liburing/debian/source/format +1 -0
  34. data/vendor/liburing/debian/source/local-options +2 -0
  35. data/vendor/liburing/debian/source/options +1 -0
  36. data/vendor/liburing/debian/watch +3 -0
  37. data/vendor/liburing/examples/Makefile +38 -0
  38. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  39. data/vendor/liburing/examples/io_uring-test.c +112 -0
  40. data/vendor/liburing/examples/link-cp.c +193 -0
  41. data/vendor/liburing/examples/ucontext-cp.c +273 -0
  42. data/vendor/liburing/liburing.pc.in +12 -0
  43. data/vendor/liburing/liburing.spec +66 -0
  44. data/vendor/liburing/make-debs.sh +53 -0
  45. data/vendor/liburing/man/io_uring.7 +754 -0
  46. data/vendor/liburing/man/io_uring_cq_advance.3 +35 -0
  47. data/vendor/liburing/man/io_uring_cq_ready.3 +25 -0
  48. data/vendor/liburing/man/io_uring_cqe_get_data.3 +34 -0
  49. data/vendor/liburing/man/io_uring_cqe_seen.3 +32 -0
  50. data/vendor/liburing/man/io_uring_enter.2 +1483 -0
  51. data/vendor/liburing/man/io_uring_free_probe.3 +24 -0
  52. data/vendor/liburing/man/io_uring_get_probe.3 +29 -0
  53. data/vendor/liburing/man/io_uring_get_sqe.3 +38 -0
  54. data/vendor/liburing/man/io_uring_opcode_supported.3 +29 -0
  55. data/vendor/liburing/man/io_uring_prep_msg_ring.3 +58 -0
  56. data/vendor/liburing/man/io_uring_prep_read.3 +50 -0
  57. data/vendor/liburing/man/io_uring_prep_read_fixed.3 +54 -0
  58. data/vendor/liburing/man/io_uring_prep_readv.3 +51 -0
  59. data/vendor/liburing/man/io_uring_prep_readv2.3 +79 -0
  60. data/vendor/liburing/man/io_uring_prep_write.3 +50 -0
  61. data/vendor/liburing/man/io_uring_prep_write_fixed.3 +54 -0
  62. data/vendor/liburing/man/io_uring_prep_writev.3 +51 -0
  63. data/vendor/liburing/man/io_uring_prep_writev2.3 +78 -0
  64. data/vendor/liburing/man/io_uring_queue_exit.3 +27 -0
  65. data/vendor/liburing/man/io_uring_queue_init.3 +44 -0
  66. data/vendor/liburing/man/io_uring_register.2 +688 -0
  67. data/vendor/liburing/man/io_uring_register_buffers.3 +41 -0
  68. data/vendor/liburing/man/io_uring_register_files.3 +35 -0
  69. data/vendor/liburing/man/io_uring_setup.2 +534 -0
  70. data/vendor/liburing/man/io_uring_sq_ready.3 +25 -0
  71. data/vendor/liburing/man/io_uring_sq_space_left.3 +25 -0
  72. data/vendor/liburing/man/io_uring_sqe_set_data.3 +30 -0
  73. data/vendor/liburing/man/io_uring_sqe_set_flags.3 +60 -0
  74. data/vendor/liburing/man/io_uring_sqring_wait.3 +30 -0
  75. data/vendor/liburing/man/io_uring_submit.3 +29 -0
  76. data/vendor/liburing/man/io_uring_submit_and_wait.3 +34 -0
  77. data/vendor/liburing/man/io_uring_submit_and_wait_timeout.3 +49 -0
  78. data/vendor/liburing/man/io_uring_unregister_buffers.3 +26 -0
  79. data/vendor/liburing/man/io_uring_unregister_files.3 +26 -0
  80. data/vendor/liburing/man/io_uring_wait_cqe.3 +33 -0
  81. data/vendor/liburing/man/io_uring_wait_cqe_nr.3 +36 -0
  82. data/vendor/liburing/man/io_uring_wait_cqe_timeout.3 +39 -0
  83. data/vendor/liburing/man/io_uring_wait_cqes.3 +46 -0
  84. data/vendor/liburing/src/Makefile +89 -0
  85. data/vendor/liburing/src/arch/aarch64/syscall.h +95 -0
  86. data/vendor/liburing/src/arch/generic/lib.h +21 -0
  87. data/vendor/liburing/src/arch/generic/syscall.h +87 -0
  88. data/vendor/liburing/src/arch/syscall-defs.h +67 -0
  89. data/vendor/liburing/src/arch/x86/lib.h +32 -0
  90. data/vendor/liburing/src/arch/x86/syscall.h +160 -0
  91. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  92. data/vendor/liburing/src/include/liburing/io_uring.h +442 -0
  93. data/vendor/liburing/src/include/liburing.h +921 -0
  94. data/vendor/liburing/src/int_flags.h +8 -0
  95. data/vendor/liburing/src/lib.h +57 -0
  96. data/vendor/liburing/src/liburing.map +53 -0
  97. data/vendor/liburing/src/nolibc.c +48 -0
  98. data/vendor/liburing/src/queue.c +403 -0
  99. data/vendor/liburing/src/register.c +293 -0
  100. data/vendor/liburing/src/setup.c +332 -0
  101. data/vendor/liburing/src/syscall.c +47 -0
  102. data/vendor/liburing/src/syscall.h +103 -0
  103. data/vendor/liburing/test/232c93d07b74-test.c +306 -0
  104. data/vendor/liburing/test/35fa71a030ca-test.c +329 -0
  105. data/vendor/liburing/test/500f9fbadef8-test.c +89 -0
  106. data/vendor/liburing/test/7ad0e4b2f83c-test.c +93 -0
  107. data/vendor/liburing/test/8a9973408177-test.c +106 -0
  108. data/vendor/liburing/test/917257daa0fe-test.c +53 -0
  109. data/vendor/liburing/test/Makefile +244 -0
  110. data/vendor/liburing/test/a0908ae19763-test.c +58 -0
  111. data/vendor/liburing/test/a4c0b3decb33-test.c +180 -0
  112. data/vendor/liburing/test/accept-link.c +254 -0
  113. data/vendor/liburing/test/accept-reuse.c +164 -0
  114. data/vendor/liburing/test/accept-test.c +79 -0
  115. data/vendor/liburing/test/accept.c +477 -0
  116. data/vendor/liburing/test/across-fork.c +283 -0
  117. data/vendor/liburing/test/b19062a56726-test.c +53 -0
  118. data/vendor/liburing/test/b5837bd5311d-test.c +77 -0
  119. data/vendor/liburing/test/ce593a6c480a-test.c +136 -0
  120. data/vendor/liburing/test/close-opath.c +122 -0
  121. data/vendor/liburing/test/config +10 -0
  122. data/vendor/liburing/test/connect.c +398 -0
  123. data/vendor/liburing/test/cq-full.c +96 -0
  124. data/vendor/liburing/test/cq-overflow.c +294 -0
  125. data/vendor/liburing/test/cq-peek-batch.c +102 -0
  126. data/vendor/liburing/test/cq-ready.c +94 -0
  127. data/vendor/liburing/test/cq-size.c +64 -0
  128. data/vendor/liburing/test/d4ae271dfaae-test.c +96 -0
  129. data/vendor/liburing/test/d77a67ed5f27-test.c +65 -0
  130. data/vendor/liburing/test/defer.c +307 -0
  131. data/vendor/liburing/test/double-poll-crash.c +185 -0
  132. data/vendor/liburing/test/drop-submit.c +92 -0
  133. data/vendor/liburing/test/eeed8b54e0df-test.c +114 -0
  134. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  135. data/vendor/liburing/test/eventfd-disable.c +151 -0
  136. data/vendor/liburing/test/eventfd-reg.c +76 -0
  137. data/vendor/liburing/test/eventfd-ring.c +97 -0
  138. data/vendor/liburing/test/eventfd.c +112 -0
  139. data/vendor/liburing/test/exec-target.c +6 -0
  140. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  141. data/vendor/liburing/test/fadvise.c +202 -0
  142. data/vendor/liburing/test/fallocate.c +249 -0
  143. data/vendor/liburing/test/fc2a85cb02ef-test.c +131 -0
  144. data/vendor/liburing/test/file-register.c +858 -0
  145. data/vendor/liburing/test/file-update.c +173 -0
  146. data/vendor/liburing/test/file-verify.c +629 -0
  147. data/vendor/liburing/test/files-exit-hang-poll.c +128 -0
  148. data/vendor/liburing/test/files-exit-hang-timeout.c +134 -0
  149. data/vendor/liburing/test/fixed-link.c +90 -0
  150. data/vendor/liburing/test/fpos.c +252 -0
  151. data/vendor/liburing/test/fsync.c +224 -0
  152. data/vendor/liburing/test/hardlink.c +136 -0
  153. data/vendor/liburing/test/helpers.c +135 -0
  154. data/vendor/liburing/test/helpers.h +67 -0
  155. data/vendor/liburing/test/io-cancel.c +550 -0
  156. data/vendor/liburing/test/io_uring_enter.c +296 -0
  157. data/vendor/liburing/test/io_uring_register.c +676 -0
  158. data/vendor/liburing/test/io_uring_setup.c +192 -0
  159. data/vendor/liburing/test/iopoll.c +372 -0
  160. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  161. data/vendor/liburing/test/lfs-openat.c +275 -0
  162. data/vendor/liburing/test/link-timeout.c +1107 -0
  163. data/vendor/liburing/test/link.c +496 -0
  164. data/vendor/liburing/test/link_drain.c +229 -0
  165. data/vendor/liburing/test/madvise.c +195 -0
  166. data/vendor/liburing/test/mkdir.c +108 -0
  167. data/vendor/liburing/test/msg-ring.c +234 -0
  168. data/vendor/liburing/test/multicqes_drain.c +387 -0
  169. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  170. data/vendor/liburing/test/nop.c +115 -0
  171. data/vendor/liburing/test/open-close.c +261 -0
  172. data/vendor/liburing/test/openat2.c +308 -0
  173. data/vendor/liburing/test/personality.c +204 -0
  174. data/vendor/liburing/test/pipe-eof.c +83 -0
  175. data/vendor/liburing/test/pipe-reuse.c +105 -0
  176. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  177. data/vendor/liburing/test/poll-cancel.c +228 -0
  178. data/vendor/liburing/test/poll-link.c +230 -0
  179. data/vendor/liburing/test/poll-many.c +208 -0
  180. data/vendor/liburing/test/poll-mshot-update.c +273 -0
  181. data/vendor/liburing/test/poll-ring.c +48 -0
  182. data/vendor/liburing/test/poll-v-poll.c +353 -0
  183. data/vendor/liburing/test/poll.c +109 -0
  184. data/vendor/liburing/test/pollfree.c +426 -0
  185. data/vendor/liburing/test/probe.c +135 -0
  186. data/vendor/liburing/test/read-write.c +876 -0
  187. data/vendor/liburing/test/register-restrictions.c +633 -0
  188. data/vendor/liburing/test/rename.c +135 -0
  189. data/vendor/liburing/test/ring-leak.c +173 -0
  190. data/vendor/liburing/test/ring-leak2.c +249 -0
  191. data/vendor/liburing/test/rsrc_tags.c +449 -0
  192. data/vendor/liburing/test/runtests-loop.sh +16 -0
  193. data/vendor/liburing/test/runtests.sh +170 -0
  194. data/vendor/liburing/test/rw_merge_test.c +97 -0
  195. data/vendor/liburing/test/self.c +91 -0
  196. data/vendor/liburing/test/send_recv.c +286 -0
  197. data/vendor/liburing/test/send_recvmsg.c +345 -0
  198. data/vendor/liburing/test/sendmsg_fs_cve.c +200 -0
  199. data/vendor/liburing/test/shared-wq.c +84 -0
  200. data/vendor/liburing/test/short-read.c +75 -0
  201. data/vendor/liburing/test/shutdown.c +165 -0
  202. data/vendor/liburing/test/sigfd-deadlock.c +74 -0
  203. data/vendor/liburing/test/skip-cqe.c +429 -0
  204. data/vendor/liburing/test/socket-rw-eagain.c +158 -0
  205. data/vendor/liburing/test/socket-rw-offset.c +157 -0
  206. data/vendor/liburing/test/socket-rw.c +145 -0
  207. data/vendor/liburing/test/splice.c +512 -0
  208. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  209. data/vendor/liburing/test/sq-full.c +45 -0
  210. data/vendor/liburing/test/sq-poll-dup.c +204 -0
  211. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  212. data/vendor/liburing/test/sq-poll-share.c +137 -0
  213. data/vendor/liburing/test/sq-space_left.c +159 -0
  214. data/vendor/liburing/test/sqpoll-cancel-hang.c +157 -0
  215. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  216. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  217. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  218. data/vendor/liburing/test/statx.c +172 -0
  219. data/vendor/liburing/test/stdout.c +232 -0
  220. data/vendor/liburing/test/submit-link-fail.c +154 -0
  221. data/vendor/liburing/test/submit-reuse.c +239 -0
  222. data/vendor/liburing/test/symlink.c +116 -0
  223. data/vendor/liburing/test/teardowns.c +58 -0
  224. data/vendor/liburing/test/thread-exit.c +143 -0
  225. data/vendor/liburing/test/timeout-new.c +252 -0
  226. data/vendor/liburing/test/timeout-overflow.c +204 -0
  227. data/vendor/liburing/test/timeout.c +1523 -0
  228. data/vendor/liburing/test/unlink.c +112 -0
  229. data/vendor/liburing/test/wakeup-hang.c +162 -0
  230. metadata +223 -2
@@ -0,0 +1,195 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: basic madvise test
4
+ */
5
+ #include <errno.h>
6
+ #include <stdio.h>
7
+ #include <unistd.h>
8
+ #include <stdlib.h>
9
+ #include <string.h>
10
+ #include <fcntl.h>
11
+ #include <sys/types.h>
12
+ #include <sys/time.h>
13
+ #include <sys/mman.h>
14
+
15
+ #include "helpers.h"
16
+ #include "liburing.h"
17
+
18
+ #define FILE_SIZE (128 * 1024)
19
+
20
+ #define LOOPS 100
21
+ #define MIN_LOOPS 10
22
+
23
+ static unsigned long long utime_since(const struct timeval *s,
24
+ const struct timeval *e)
25
+ {
26
+ long long sec, usec;
27
+
28
+ sec = e->tv_sec - s->tv_sec;
29
+ usec = (e->tv_usec - s->tv_usec);
30
+ if (sec > 0 && usec < 0) {
31
+ sec--;
32
+ usec += 1000000;
33
+ }
34
+
35
+ sec *= 1000000;
36
+ return sec + usec;
37
+ }
38
+
39
+ static unsigned long long utime_since_now(struct timeval *tv)
40
+ {
41
+ struct timeval end;
42
+
43
+ gettimeofday(&end, NULL);
44
+ return utime_since(tv, &end);
45
+ }
46
+
47
+ static int do_madvise(struct io_uring *ring, void *addr, off_t len, int advice)
48
+ {
49
+ struct io_uring_sqe *sqe;
50
+ struct io_uring_cqe *cqe;
51
+ int ret;
52
+
53
+ sqe = io_uring_get_sqe(ring);
54
+ if (!sqe) {
55
+ fprintf(stderr, "failed to get sqe\n");
56
+ return 1;
57
+ }
58
+
59
+ io_uring_prep_madvise(sqe, addr, len, advice);
60
+ sqe->user_data = advice;
61
+ ret = io_uring_submit_and_wait(ring, 1);
62
+ if (ret != 1) {
63
+ fprintf(stderr, "submit: %d\n", ret);
64
+ return 1;
65
+ }
66
+
67
+ ret = io_uring_wait_cqe(ring, &cqe);
68
+ if (ret) {
69
+ fprintf(stderr, "wait: %d\n", ret);
70
+ return 1;
71
+ }
72
+
73
+ ret = cqe->res;
74
+ if (ret == -EINVAL || ret == -EBADF) {
75
+ fprintf(stdout, "Madvise not supported, skipping\n");
76
+ unlink(".madvise.tmp");
77
+ exit(0);
78
+ } else if (ret) {
79
+ fprintf(stderr, "cqe->res=%d\n", cqe->res);
80
+ }
81
+ io_uring_cqe_seen(ring, cqe);
82
+ return ret;
83
+ }
84
+
85
+ static long do_copy(int fd, char *buf, void *ptr)
86
+ {
87
+ struct timeval tv;
88
+
89
+ gettimeofday(&tv, NULL);
90
+ memcpy(buf, ptr, FILE_SIZE);
91
+ return utime_since_now(&tv);
92
+ }
93
+
94
+ static int test_madvise(struct io_uring *ring, const char *filename)
95
+ {
96
+ unsigned long cached_read, uncached_read, cached_read2;
97
+ int fd, ret;
98
+ char *buf;
99
+ void *ptr;
100
+
101
+ fd = open(filename, O_RDONLY);
102
+ if (fd < 0) {
103
+ perror("open");
104
+ return 1;
105
+ }
106
+
107
+ buf = t_malloc(FILE_SIZE);
108
+
109
+ ptr = mmap(NULL, FILE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);
110
+ if (ptr == MAP_FAILED) {
111
+ perror("mmap");
112
+ return 1;
113
+ }
114
+
115
+ cached_read = do_copy(fd, buf, ptr);
116
+ if (cached_read == -1)
117
+ return 1;
118
+
119
+ cached_read = do_copy(fd, buf, ptr);
120
+ if (cached_read == -1)
121
+ return 1;
122
+
123
+ ret = do_madvise(ring, ptr, FILE_SIZE, MADV_DONTNEED);
124
+ if (ret)
125
+ return 1;
126
+
127
+ uncached_read = do_copy(fd, buf, ptr);
128
+ if (uncached_read == -1)
129
+ return 1;
130
+
131
+ ret = do_madvise(ring, ptr, FILE_SIZE, MADV_DONTNEED);
132
+ if (ret)
133
+ return 1;
134
+
135
+ ret = do_madvise(ring, ptr, FILE_SIZE, MADV_WILLNEED);
136
+ if (ret)
137
+ return 1;
138
+
139
+ msync(ptr, FILE_SIZE, MS_SYNC);
140
+
141
+ cached_read2 = do_copy(fd, buf, ptr);
142
+ if (cached_read2 == -1)
143
+ return 1;
144
+
145
+ if (cached_read < uncached_read &&
146
+ cached_read2 < uncached_read)
147
+ return 0;
148
+
149
+ return 2;
150
+ }
151
+
152
+ int main(int argc, char *argv[])
153
+ {
154
+ struct io_uring ring;
155
+ int ret, i, good, bad;
156
+ char *fname;
157
+
158
+ if (argc > 1) {
159
+ fname = argv[1];
160
+ } else {
161
+ fname = ".madvise.tmp";
162
+ t_create_file(fname, FILE_SIZE);
163
+ }
164
+
165
+ if (io_uring_queue_init(8, &ring, 0)) {
166
+ fprintf(stderr, "ring creation failed\n");
167
+ goto err;
168
+ }
169
+
170
+ good = bad = 0;
171
+ for (i = 0; i < LOOPS; i++) {
172
+ ret = test_madvise(&ring, fname);
173
+ if (ret == 1) {
174
+ fprintf(stderr, "test_madvise failed\n");
175
+ goto err;
176
+ } else if (!ret)
177
+ good++;
178
+ else if (ret == 2)
179
+ bad++;
180
+ if (i >= MIN_LOOPS && !bad)
181
+ break;
182
+ }
183
+
184
+ /* too hard to reliably test, just ignore */
185
+ if (0 && bad > good)
186
+ fprintf(stderr, "Suspicious timings (%u > %u)\n", bad, good);
187
+ if (fname != argv[1])
188
+ unlink(fname);
189
+ io_uring_queue_exit(&ring);
190
+ return 0;
191
+ err:
192
+ if (fname != argv[1])
193
+ unlink(fname);
194
+ return 1;
195
+ }
@@ -0,0 +1,108 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test io_uring mkdirat handling
4
+ */
5
+ #include <fcntl.h>
6
+ #include <stdio.h>
7
+ #include <string.h>
8
+ #include <sys/stat.h>
9
+ #include <sys/types.h>
10
+ #include <unistd.h>
11
+
12
+ #include "liburing.h"
13
+
14
+ static int do_mkdirat(struct io_uring *ring, const char *fn)
15
+ {
16
+ int ret;
17
+ struct io_uring_sqe *sqe;
18
+ struct io_uring_cqe *cqe;
19
+
20
+ sqe = io_uring_get_sqe(ring);
21
+ if (!sqe) {
22
+ fprintf(stderr, "sqe get failed\n");
23
+ goto err;
24
+ }
25
+ io_uring_prep_mkdirat(sqe, AT_FDCWD, fn, 0700);
26
+
27
+ ret = io_uring_submit(ring);
28
+ if (ret != 1) {
29
+ fprintf(stderr, "submit failed: %d\n", ret);
30
+ goto err;
31
+ }
32
+
33
+ ret = io_uring_wait_cqes(ring, &cqe, 1, 0, 0);
34
+ if (ret) {
35
+ fprintf(stderr, "wait_cqe failed: %d\n", ret);
36
+ goto err;
37
+ }
38
+ ret = cqe->res;
39
+ io_uring_cqe_seen(ring, cqe);
40
+ return ret;
41
+ err:
42
+ return 1;
43
+ }
44
+
45
+ static int stat_file(const char *fn)
46
+ {
47
+ struct stat sb;
48
+
49
+ if (!stat(fn, &sb))
50
+ return 0;
51
+
52
+ return errno;
53
+ }
54
+
55
+ int main(int argc, char *argv[])
56
+ {
57
+ static const char fn[] = "io_uring-mkdirat-test";
58
+ int ret;
59
+ struct io_uring ring;
60
+
61
+ if (argc > 1)
62
+ return 0;
63
+
64
+ ret = io_uring_queue_init(8, &ring, 0);
65
+ if (ret) {
66
+ fprintf(stderr, "queue init failed: %d\n", ret);
67
+ return ret;
68
+ }
69
+
70
+ ret = do_mkdirat(&ring, fn);
71
+ if (ret < 0) {
72
+ if (ret == -EBADF || ret == -EINVAL) {
73
+ fprintf(stdout, "mkdirat not supported, skipping\n");
74
+ goto out;
75
+ }
76
+ fprintf(stderr, "mkdirat: %s\n", strerror(-ret));
77
+ goto err;
78
+ } else if (ret) {
79
+ goto err;
80
+ }
81
+
82
+ if (stat_file(fn)) {
83
+ perror("stat");
84
+ goto err;
85
+ }
86
+
87
+ ret = do_mkdirat(&ring, fn);
88
+ if (ret != -EEXIST) {
89
+ fprintf(stderr, "do_mkdirat already exists failed: %d\n", ret);
90
+ goto err1;
91
+ }
92
+
93
+ ret = do_mkdirat(&ring, "surely/this/wont/exist");
94
+ if (ret != -ENOENT) {
95
+ fprintf(stderr, "do_mkdirat no parent failed: %d\n", ret);
96
+ goto err1;
97
+ }
98
+
99
+ out:
100
+ unlinkat(AT_FDCWD, fn, AT_REMOVEDIR);
101
+ io_uring_queue_exit(&ring);
102
+ return 0;
103
+ err1:
104
+ unlinkat(AT_FDCWD, fn, AT_REMOVEDIR);
105
+ err:
106
+ io_uring_queue_exit(&ring);
107
+ return 1;
108
+ }
@@ -0,0 +1,234 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test ring messaging command
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+ #include <pthread.h>
13
+
14
+ #include "liburing.h"
15
+
16
+ static int no_msg;
17
+
18
+ static int test_own(struct io_uring *ring)
19
+ {
20
+ struct io_uring_cqe *cqe;
21
+ struct io_uring_sqe *sqe;
22
+ int ret, i;
23
+
24
+ sqe = io_uring_get_sqe(ring);
25
+ if (!sqe) {
26
+ fprintf(stderr, "get sqe failed\n");
27
+ goto err;
28
+ }
29
+
30
+ io_uring_prep_msg_ring(sqe, ring->ring_fd, 0x10, 0x1234, 0);
31
+ sqe->user_data = 1;
32
+
33
+ ret = io_uring_submit(ring);
34
+ if (ret <= 0) {
35
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
36
+ goto err;
37
+ }
38
+
39
+ for (i = 0; i < 2; i++) {
40
+ ret = io_uring_wait_cqe(ring, &cqe);
41
+ if (ret < 0) {
42
+ fprintf(stderr, "wait completion %d\n", ret);
43
+ goto err;
44
+ }
45
+ switch (cqe->user_data) {
46
+ case 1:
47
+ if (cqe->res == -EINVAL || cqe->res == -EOPNOTSUPP) {
48
+ no_msg = 1;
49
+ return 0;
50
+ }
51
+ if (cqe->res != 0) {
52
+ fprintf(stderr, "cqe res %d\n", cqe->res);
53
+ return -1;
54
+ }
55
+ break;
56
+ case 0x1234:
57
+ if (!(cqe->flags & IORING_CQE_F_MSG)) {
58
+ fprintf(stderr, "invalid flags %x\n", cqe->flags);
59
+ return -1;
60
+ }
61
+ if (cqe->res != 0x10) {
62
+ fprintf(stderr, "invalid len %x\n", cqe->res);
63
+ return -1;
64
+ }
65
+ break;
66
+ default:
67
+ fprintf(stderr, "Invalid user_data\n");
68
+ return -1;
69
+ }
70
+ io_uring_cqe_seen(ring, cqe);
71
+ }
72
+
73
+ return 0;
74
+ err:
75
+ return 1;
76
+ }
77
+
78
+ static void *wait_cqe_fn(void *data)
79
+ {
80
+ struct io_uring *ring = data;
81
+ struct io_uring_cqe *cqe;
82
+ int ret;
83
+
84
+ ret = io_uring_wait_cqe(ring, &cqe);
85
+ if (ret) {
86
+ fprintf(stderr, "wait cqe %d\n", ret);
87
+ goto err;
88
+ }
89
+
90
+ if (!(cqe->flags & IORING_CQE_F_MSG)) {
91
+ fprintf(stderr, "invalid flags %x\n", cqe->flags);
92
+ goto err;
93
+ }
94
+ if (cqe->user_data != 0x5aa5) {
95
+ fprintf(stderr, "user_data %llx\n", (long long) cqe->user_data);
96
+ goto err;
97
+ }
98
+ if (cqe->res != 0x20) {
99
+ fprintf(stderr, "len %x\n", cqe->res);
100
+ goto err;
101
+ }
102
+
103
+ return NULL;
104
+ err:
105
+ return (void *) (unsigned long) 1;
106
+ }
107
+
108
+ static int test_remote(struct io_uring *ring, struct io_uring *target)
109
+ {
110
+ struct io_uring_cqe *cqe;
111
+ struct io_uring_sqe *sqe;
112
+ int ret;
113
+
114
+ sqe = io_uring_get_sqe(ring);
115
+ if (!sqe) {
116
+ fprintf(stderr, "get sqe failed\n");
117
+ goto err;
118
+ }
119
+
120
+ io_uring_prep_msg_ring(sqe, target->ring_fd, 0x20, 0x5aa5, 0);
121
+ sqe->user_data = 1;
122
+
123
+ ret = io_uring_submit(ring);
124
+ if (ret <= 0) {
125
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
126
+ goto err;
127
+ }
128
+
129
+ ret = io_uring_wait_cqe(ring, &cqe);
130
+ if (ret < 0) {
131
+ fprintf(stderr, "wait completion %d\n", ret);
132
+ goto err;
133
+ }
134
+ if (cqe->res != 0) {
135
+ fprintf(stderr, "cqe res %d\n", cqe->res);
136
+ return -1;
137
+ }
138
+ if (cqe->user_data != 1) {
139
+ fprintf(stderr, "user_data %llx\n", (long long) cqe->user_data);
140
+ return -1;
141
+ }
142
+
143
+ io_uring_cqe_seen(ring, cqe);
144
+ return 0;
145
+ err:
146
+ return 1;
147
+ }
148
+
149
+ static int test_invalid(struct io_uring *ring)
150
+ {
151
+ struct io_uring_cqe *cqe;
152
+ struct io_uring_sqe *sqe;
153
+ int ret;
154
+
155
+ sqe = io_uring_get_sqe(ring);
156
+ if (!sqe) {
157
+ fprintf(stderr, "get sqe failed\n");
158
+ goto err;
159
+ }
160
+
161
+ io_uring_prep_msg_ring(sqe, 1, 0, 0x8989, 0);
162
+ sqe->user_data = 1;
163
+
164
+ ret = io_uring_submit(ring);
165
+ if (ret <= 0) {
166
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
167
+ goto err;
168
+ }
169
+
170
+ ret = io_uring_wait_cqe(ring, &cqe);
171
+ if (ret < 0) {
172
+ fprintf(stderr, "wait completion %d\n", ret);
173
+ goto err;
174
+ }
175
+ if (cqe->res != -EBADFD) {
176
+ fprintf(stderr, "cqe res %d\n", cqe->res);
177
+ return -1;
178
+ }
179
+
180
+ io_uring_cqe_seen(ring, cqe);
181
+ return 0;
182
+ err:
183
+ return 1;
184
+ }
185
+
186
+ int main(int argc, char *argv[])
187
+ {
188
+ struct io_uring ring, ring2;
189
+ pthread_t thread;
190
+ void *tret;
191
+ int ret;
192
+
193
+ if (argc > 1)
194
+ return 0;
195
+
196
+ ret = io_uring_queue_init(8, &ring, 0);
197
+ if (ret) {
198
+ fprintf(stderr, "ring setup failed: %d\n", ret);
199
+ return 1;
200
+ }
201
+ ret = io_uring_queue_init(8, &ring2, 0);
202
+ if (ret) {
203
+ fprintf(stderr, "ring setup failed: %d\n", ret);
204
+ return 1;
205
+ }
206
+
207
+ ret = test_own(&ring);
208
+ if (ret) {
209
+ fprintf(stderr, "test_own failed\n");
210
+ return ret;
211
+ }
212
+ if (no_msg) {
213
+ fprintf(stdout, "Skipped\n");
214
+ return 0;
215
+ }
216
+
217
+ ret = test_invalid(&ring);
218
+ if (ret) {
219
+ fprintf(stderr, "test_invalid failed\n");
220
+ return ret;
221
+ }
222
+
223
+ pthread_create(&thread, NULL, wait_cqe_fn, &ring2);
224
+
225
+ ret = test_remote(&ring, &ring2);
226
+ if (ret) {
227
+ fprintf(stderr, "test_remote failed\n");
228
+ return ret;
229
+ }
230
+
231
+ pthread_join(thread, &tret);
232
+
233
+ return 0;
234
+ }