@nxtedition/rocksdb 5.2.36 → 5.2.39

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 (190) hide show
  1. package/binding.cc +66 -91
  2. package/deps/liburing/liburing/COPYING +502 -0
  3. package/deps/liburing/liburing/COPYING.GPL +339 -0
  4. package/deps/liburing/liburing/LICENSE +7 -0
  5. package/deps/liburing/liburing/Makefile +84 -0
  6. package/deps/liburing/liburing/Makefile.quiet +11 -0
  7. package/deps/liburing/liburing/README +46 -0
  8. package/deps/liburing/liburing/configure +420 -0
  9. package/deps/liburing/liburing/debian/README.Debian +7 -0
  10. package/deps/liburing/liburing/debian/changelog +27 -0
  11. package/deps/liburing/liburing/debian/compat +1 -0
  12. package/deps/liburing/liburing/debian/control +48 -0
  13. package/deps/liburing/liburing/debian/copyright +49 -0
  14. package/deps/liburing/liburing/debian/liburing-dev.install +4 -0
  15. package/deps/liburing/liburing/debian/liburing-dev.manpages +6 -0
  16. package/deps/liburing/liburing/debian/liburing1-udeb.install +1 -0
  17. package/deps/liburing/liburing/debian/liburing1.install +1 -0
  18. package/deps/liburing/liburing/debian/liburing1.symbols +32 -0
  19. package/deps/liburing/liburing/debian/patches/series +1 -0
  20. package/deps/liburing/liburing/debian/rules +81 -0
  21. package/deps/liburing/liburing/debian/source/format +1 -0
  22. package/deps/liburing/liburing/debian/source/local-options +2 -0
  23. package/deps/liburing/liburing/debian/source/options +1 -0
  24. package/deps/liburing/liburing/debian/watch +3 -0
  25. package/deps/liburing/liburing/examples/Makefile +29 -0
  26. package/deps/liburing/liburing/examples/io_uring-cp.c +279 -0
  27. package/deps/liburing/liburing/examples/io_uring-test.c +112 -0
  28. package/deps/liburing/liburing/examples/link-cp.c +193 -0
  29. package/deps/liburing/liburing/examples/ucontext-cp.c +273 -0
  30. package/deps/liburing/liburing/liburing.pc.in +12 -0
  31. package/deps/liburing/liburing/liburing.spec +66 -0
  32. package/deps/liburing/liburing/make-debs.sh +53 -0
  33. package/deps/liburing/liburing/man/io_uring.7 +736 -0
  34. package/deps/liburing/liburing/man/io_uring_enter.2 +1403 -0
  35. package/deps/liburing/liburing/man/io_uring_get_sqe.3 +37 -0
  36. package/deps/liburing/liburing/man/io_uring_queue_exit.3 +27 -0
  37. package/deps/liburing/liburing/man/io_uring_queue_init.3 +44 -0
  38. package/deps/liburing/liburing/man/io_uring_register.2 +605 -0
  39. package/deps/liburing/liburing/man/io_uring_setup.2 +515 -0
  40. package/deps/liburing/liburing/src/Makefile +76 -0
  41. package/deps/liburing/liburing/src/include/liburing/barrier.h +73 -0
  42. package/deps/liburing/liburing/src/include/liburing/io_uring.h +422 -0
  43. package/deps/liburing/liburing/src/include/liburing.h +775 -0
  44. package/deps/liburing/liburing/src/liburing.map +46 -0
  45. package/deps/liburing/liburing/src/queue.c +403 -0
  46. package/deps/liburing/liburing/src/register.c +299 -0
  47. package/deps/liburing/liburing/src/setup.c +356 -0
  48. package/deps/liburing/liburing/src/syscall.c +73 -0
  49. package/deps/liburing/liburing/src/syscall.h +20 -0
  50. package/deps/liburing/liburing/test/232c93d07b74-test.c +305 -0
  51. package/deps/liburing/liburing/test/35fa71a030ca-test.c +329 -0
  52. package/deps/liburing/liburing/test/500f9fbadef8-test.c +89 -0
  53. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +93 -0
  54. package/deps/liburing/liburing/test/8a9973408177-test.c +106 -0
  55. package/deps/liburing/liburing/test/917257daa0fe-test.c +53 -0
  56. package/deps/liburing/liburing/test/Makefile +312 -0
  57. package/deps/liburing/liburing/test/a0908ae19763-test.c +58 -0
  58. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +180 -0
  59. package/deps/liburing/liburing/test/accept-link.c +251 -0
  60. package/deps/liburing/liburing/test/accept-reuse.c +164 -0
  61. package/deps/liburing/liburing/test/accept-test.c +79 -0
  62. package/deps/liburing/liburing/test/accept.c +476 -0
  63. package/deps/liburing/liburing/test/across-fork.c +283 -0
  64. package/deps/liburing/liburing/test/b19062a56726-test.c +53 -0
  65. package/deps/liburing/liburing/test/b5837bd5311d-test.c +77 -0
  66. package/deps/liburing/liburing/test/ce593a6c480a-test.c +135 -0
  67. package/deps/liburing/liburing/test/close-opath.c +122 -0
  68. package/deps/liburing/liburing/test/config +10 -0
  69. package/deps/liburing/liburing/test/connect.c +398 -0
  70. package/deps/liburing/liburing/test/cq-full.c +96 -0
  71. package/deps/liburing/liburing/test/cq-overflow.c +294 -0
  72. package/deps/liburing/liburing/test/cq-peek-batch.c +102 -0
  73. package/deps/liburing/liburing/test/cq-ready.c +94 -0
  74. package/deps/liburing/liburing/test/cq-size.c +58 -0
  75. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +96 -0
  76. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +65 -0
  77. package/deps/liburing/liburing/test/defer.c +307 -0
  78. package/deps/liburing/liburing/test/double-poll-crash.c +186 -0
  79. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +114 -0
  80. package/deps/liburing/liburing/test/empty-eownerdead.c +42 -0
  81. package/deps/liburing/liburing/test/eventfd-disable.c +151 -0
  82. package/deps/liburing/liburing/test/eventfd-ring.c +97 -0
  83. package/deps/liburing/liburing/test/eventfd.c +112 -0
  84. package/deps/liburing/liburing/test/fadvise.c +202 -0
  85. package/deps/liburing/liburing/test/fallocate.c +249 -0
  86. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +138 -0
  87. package/deps/liburing/liburing/test/file-register.c +843 -0
  88. package/deps/liburing/liburing/test/file-update.c +173 -0
  89. package/deps/liburing/liburing/test/files-exit-hang-poll.c +128 -0
  90. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +134 -0
  91. package/deps/liburing/liburing/test/fixed-link.c +90 -0
  92. package/deps/liburing/liburing/test/fsync.c +224 -0
  93. package/deps/liburing/liburing/test/hardlink.c +136 -0
  94. package/deps/liburing/liburing/test/helpers.c +135 -0
  95. package/deps/liburing/liburing/test/helpers.h +67 -0
  96. package/deps/liburing/liburing/test/io-cancel.c +537 -0
  97. package/deps/liburing/liburing/test/io_uring_enter.c +296 -0
  98. package/deps/liburing/liburing/test/io_uring_register.c +664 -0
  99. package/deps/liburing/liburing/test/io_uring_setup.c +192 -0
  100. package/deps/liburing/liburing/test/iopoll.c +366 -0
  101. package/deps/liburing/liburing/test/lfs-openat-write.c +117 -0
  102. package/deps/liburing/liburing/test/lfs-openat.c +273 -0
  103. package/deps/liburing/liburing/test/link-timeout.c +1107 -0
  104. package/deps/liburing/liburing/test/link.c +496 -0
  105. package/deps/liburing/liburing/test/link_drain.c +229 -0
  106. package/deps/liburing/liburing/test/madvise.c +195 -0
  107. package/deps/liburing/liburing/test/mkdir.c +108 -0
  108. package/deps/liburing/liburing/test/multicqes_drain.c +383 -0
  109. package/deps/liburing/liburing/test/nop-all-sizes.c +107 -0
  110. package/deps/liburing/liburing/test/nop.c +115 -0
  111. package/deps/liburing/liburing/test/open-close.c +146 -0
  112. package/deps/liburing/liburing/test/openat2.c +240 -0
  113. package/deps/liburing/liburing/test/personality.c +204 -0
  114. package/deps/liburing/liburing/test/pipe-eof.c +81 -0
  115. package/deps/liburing/liburing/test/pipe-reuse.c +105 -0
  116. package/deps/liburing/liburing/test/poll-cancel-ton.c +139 -0
  117. package/deps/liburing/liburing/test/poll-cancel.c +135 -0
  118. package/deps/liburing/liburing/test/poll-link.c +227 -0
  119. package/deps/liburing/liburing/test/poll-many.c +208 -0
  120. package/deps/liburing/liburing/test/poll-mshot-update.c +273 -0
  121. package/deps/liburing/liburing/test/poll-ring.c +48 -0
  122. package/deps/liburing/liburing/test/poll-v-poll.c +353 -0
  123. package/deps/liburing/liburing/test/poll.c +109 -0
  124. package/deps/liburing/liburing/test/probe.c +137 -0
  125. package/deps/liburing/liburing/test/read-write.c +876 -0
  126. package/deps/liburing/liburing/test/register-restrictions.c +633 -0
  127. package/deps/liburing/liburing/test/rename.c +134 -0
  128. package/deps/liburing/liburing/test/ring-leak.c +173 -0
  129. package/deps/liburing/liburing/test/ring-leak2.c +249 -0
  130. package/deps/liburing/liburing/test/rsrc_tags.c +449 -0
  131. package/deps/liburing/liburing/test/runtests-loop.sh +16 -0
  132. package/deps/liburing/liburing/test/runtests.sh +170 -0
  133. package/deps/liburing/liburing/test/rw_merge_test.c +97 -0
  134. package/deps/liburing/liburing/test/self.c +91 -0
  135. package/deps/liburing/liburing/test/send_recv.c +291 -0
  136. package/deps/liburing/liburing/test/send_recvmsg.c +345 -0
  137. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +198 -0
  138. package/deps/liburing/liburing/test/shared-wq.c +84 -0
  139. package/deps/liburing/liburing/test/short-read.c +75 -0
  140. package/deps/liburing/liburing/test/shutdown.c +163 -0
  141. package/deps/liburing/liburing/test/sigfd-deadlock.c +74 -0
  142. package/deps/liburing/liburing/test/socket-rw-eagain.c +156 -0
  143. package/deps/liburing/liburing/test/socket-rw.c +147 -0
  144. package/deps/liburing/liburing/test/splice.c +511 -0
  145. package/deps/liburing/liburing/test/sq-full-cpp.cc +45 -0
  146. package/deps/liburing/liburing/test/sq-full.c +45 -0
  147. package/deps/liburing/liburing/test/sq-poll-dup.c +200 -0
  148. package/deps/liburing/liburing/test/sq-poll-kthread.c +168 -0
  149. package/deps/liburing/liburing/test/sq-poll-share.c +137 -0
  150. package/deps/liburing/liburing/test/sq-space_left.c +159 -0
  151. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +159 -0
  152. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +195 -0
  153. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +77 -0
  154. package/deps/liburing/liburing/test/sqpoll-sleep.c +68 -0
  155. package/deps/liburing/liburing/test/statx.c +172 -0
  156. package/deps/liburing/liburing/test/stdout.c +232 -0
  157. package/deps/liburing/liburing/test/submit-link-fail.c +154 -0
  158. package/deps/liburing/liburing/test/submit-reuse.c +239 -0
  159. package/deps/liburing/liburing/test/symlink.c +116 -0
  160. package/deps/liburing/liburing/test/teardowns.c +58 -0
  161. package/deps/liburing/liburing/test/thread-exit.c +131 -0
  162. package/deps/liburing/liburing/test/timeout-new.c +246 -0
  163. package/deps/liburing/liburing/test/timeout-overflow.c +204 -0
  164. package/deps/liburing/liburing/test/timeout.c +1354 -0
  165. package/deps/liburing/liburing/test/unlink.c +111 -0
  166. package/deps/liburing/liburing/test/wakeup-hang.c +162 -0
  167. package/deps/liburing/liburing.gyp +20 -0
  168. package/deps/rocksdb/rocksdb/db/corruption_test.cc +62 -0
  169. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -62
  170. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +25 -11
  171. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +74 -155
  172. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  173. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  174. package/deps/rocksdb/rocksdb/env/fs_posix.cc +13 -0
  175. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +4 -2
  176. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +22 -4
  177. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +5 -0
  178. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +15 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  181. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -0
  182. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +3 -7
  183. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -29
  185. package/deps/rocksdb/rocksdb.gyp +4 -3
  186. package/package.json +1 -1
  187. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  188. package/prebuilds/darwin-x64/node.napi.node +0 -0
  189. package/prebuilds/linux-x64/node.napi.node +0 -0
  190. package/prebuilds/prebuilds/linux-x64/node.napi.node +0 -0
@@ -0,0 +1,294 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: run various CQ ring overflow tests
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "helpers.h"
14
+ #include "liburing.h"
15
+
16
+ #define FILE_SIZE (256 * 1024)
17
+ #define BS 4096
18
+ #define BUFFERS (FILE_SIZE / BS)
19
+
20
+ static struct iovec *vecs;
21
+
22
+ #define ENTRIES 8
23
+
24
+ static int test_io(const char *file, unsigned long usecs, unsigned *drops, int fault)
25
+ {
26
+ struct io_uring_sqe *sqe;
27
+ struct io_uring_cqe *cqe;
28
+ struct io_uring_params p;
29
+ unsigned reaped, total;
30
+ struct io_uring ring;
31
+ int nodrop, i, fd, ret;
32
+
33
+ fd = open(file, O_RDONLY | O_DIRECT);
34
+ if (fd < 0) {
35
+ perror("file open");
36
+ goto err;
37
+ }
38
+
39
+ memset(&p, 0, sizeof(p));
40
+ ret = io_uring_queue_init_params(ENTRIES, &ring, &p);
41
+ if (ret) {
42
+ fprintf(stderr, "ring create failed: %d\n", ret);
43
+ goto err;
44
+ }
45
+ nodrop = 0;
46
+ if (p.features & IORING_FEAT_NODROP)
47
+ nodrop = 1;
48
+
49
+ total = 0;
50
+ for (i = 0; i < BUFFERS / 2; i++) {
51
+ off_t offset;
52
+
53
+ sqe = io_uring_get_sqe(&ring);
54
+ if (!sqe) {
55
+ fprintf(stderr, "sqe get failed\n");
56
+ goto err;
57
+ }
58
+ offset = BS * (rand() % BUFFERS);
59
+ if (fault && i == ENTRIES + 4)
60
+ vecs[i].iov_base = NULL;
61
+ io_uring_prep_readv(sqe, fd, &vecs[i], 1, offset);
62
+
63
+ ret = io_uring_submit(&ring);
64
+ if (nodrop && ret == -EBUSY) {
65
+ *drops = 1;
66
+ total = i;
67
+ break;
68
+ } else if (ret != 1) {
69
+ fprintf(stderr, "submit got %d, wanted %d\n", ret, 1);
70
+ total = i;
71
+ break;
72
+ }
73
+ total++;
74
+ }
75
+
76
+ if (*drops)
77
+ goto reap_it;
78
+
79
+ usleep(usecs);
80
+
81
+ for (i = total; i < BUFFERS; i++) {
82
+ off_t offset;
83
+
84
+ sqe = io_uring_get_sqe(&ring);
85
+ if (!sqe) {
86
+ fprintf(stderr, "sqe get failed\n");
87
+ goto err;
88
+ }
89
+ offset = BS * (rand() % BUFFERS);
90
+ io_uring_prep_readv(sqe, fd, &vecs[i], 1, offset);
91
+
92
+ ret = io_uring_submit(&ring);
93
+ if (nodrop && ret == -EBUSY) {
94
+ *drops = 1;
95
+ break;
96
+ } else if (ret != 1) {
97
+ fprintf(stderr, "submit got %d, wanted %d\n", ret, 1);
98
+ break;
99
+ }
100
+ total++;
101
+ }
102
+
103
+ reap_it:
104
+ reaped = 0;
105
+ do {
106
+ if (nodrop) {
107
+ /* nodrop should never lose events */
108
+ if (reaped == total)
109
+ break;
110
+ } else {
111
+ if (reaped + *ring.cq.koverflow == total)
112
+ break;
113
+ }
114
+ ret = io_uring_wait_cqe(&ring, &cqe);
115
+ if (ret) {
116
+ fprintf(stderr, "wait_cqe=%d\n", ret);
117
+ goto err;
118
+ }
119
+ if (cqe->res != BS) {
120
+ if (!(fault && cqe->res == -EFAULT)) {
121
+ fprintf(stderr, "cqe res %d, wanted %d\n",
122
+ cqe->res, BS);
123
+ goto err;
124
+ }
125
+ }
126
+ io_uring_cqe_seen(&ring, cqe);
127
+ reaped++;
128
+ } while (1);
129
+
130
+ if (!io_uring_peek_cqe(&ring, &cqe)) {
131
+ fprintf(stderr, "found unexpected completion\n");
132
+ goto err;
133
+ }
134
+
135
+ if (!nodrop) {
136
+ *drops = *ring.cq.koverflow;
137
+ } else if (*ring.cq.koverflow) {
138
+ fprintf(stderr, "Found %u overflows\n", *ring.cq.koverflow);
139
+ goto err;
140
+ }
141
+
142
+ io_uring_queue_exit(&ring);
143
+ close(fd);
144
+ return 0;
145
+ err:
146
+ if (fd != -1)
147
+ close(fd);
148
+ io_uring_queue_exit(&ring);
149
+ return 1;
150
+ }
151
+
152
+ static int reap_events(struct io_uring *ring, unsigned nr_events, int do_wait)
153
+ {
154
+ struct io_uring_cqe *cqe;
155
+ int i, ret = 0, seq = 0;
156
+
157
+ for (i = 0; i < nr_events; i++) {
158
+ if (do_wait)
159
+ ret = io_uring_wait_cqe(ring, &cqe);
160
+ else
161
+ ret = io_uring_peek_cqe(ring, &cqe);
162
+ if (ret) {
163
+ if (ret != -EAGAIN)
164
+ fprintf(stderr, "cqe peek failed: %d\n", ret);
165
+ break;
166
+ }
167
+ if (cqe->user_data != seq) {
168
+ fprintf(stderr, "cqe sequence out-of-order\n");
169
+ fprintf(stderr, "got %d, wanted %d\n", (int) cqe->user_data,
170
+ seq);
171
+ return -EINVAL;
172
+ }
173
+ seq++;
174
+ io_uring_cqe_seen(ring, cqe);
175
+ }
176
+
177
+ return i ? i : ret;
178
+ }
179
+
180
+ /*
181
+ * Submit some NOPs and watch if the overflow is correct
182
+ */
183
+ static int test_overflow(void)
184
+ {
185
+ struct io_uring ring;
186
+ struct io_uring_params p;
187
+ struct io_uring_sqe *sqe;
188
+ unsigned pending;
189
+ int ret, i, j;
190
+
191
+ memset(&p, 0, sizeof(p));
192
+ ret = io_uring_queue_init_params(4, &ring, &p);
193
+ if (ret) {
194
+ fprintf(stderr, "io_uring_queue_init failed %d\n", ret);
195
+ return 1;
196
+ }
197
+
198
+ /* submit 4x4 SQEs, should overflow the ring by 8 */
199
+ pending = 0;
200
+ for (i = 0; i < 4; i++) {
201
+ for (j = 0; j < 4; j++) {
202
+ sqe = io_uring_get_sqe(&ring);
203
+ if (!sqe) {
204
+ fprintf(stderr, "get sqe failed\n");
205
+ goto err;
206
+ }
207
+
208
+ io_uring_prep_nop(sqe);
209
+ sqe->user_data = (i * 4) + j;
210
+ }
211
+
212
+ ret = io_uring_submit(&ring);
213
+ if (ret == 4) {
214
+ pending += 4;
215
+ continue;
216
+ }
217
+ if (p.features & IORING_FEAT_NODROP) {
218
+ if (ret == -EBUSY)
219
+ break;
220
+ }
221
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
222
+ goto err;
223
+ }
224
+
225
+ /* we should now have 8 completions ready */
226
+ ret = reap_events(&ring, pending, 0);
227
+ if (ret < 0)
228
+ goto err;
229
+
230
+ if (!(p.features & IORING_FEAT_NODROP)) {
231
+ if (*ring.cq.koverflow != 8) {
232
+ fprintf(stderr, "cq ring overflow %d, expected 8\n",
233
+ *ring.cq.koverflow);
234
+ goto err;
235
+ }
236
+ }
237
+ io_uring_queue_exit(&ring);
238
+ return 0;
239
+ err:
240
+ io_uring_queue_exit(&ring);
241
+ return 1;
242
+ }
243
+
244
+ int main(int argc, char *argv[])
245
+ {
246
+ const char *fname = ".cq-overflow";
247
+ unsigned iters, drops;
248
+ unsigned long usecs;
249
+ int ret;
250
+
251
+ if (argc > 1)
252
+ return 0;
253
+
254
+ ret = test_overflow();
255
+ if (ret) {
256
+ printf("test_overflow failed\n");
257
+ return ret;
258
+ }
259
+
260
+ t_create_file(fname, FILE_SIZE);
261
+
262
+ vecs = t_create_buffers(BUFFERS, BS);
263
+
264
+ iters = 0;
265
+ usecs = 1000;
266
+ do {
267
+ drops = 0;
268
+
269
+ if (test_io(fname, usecs, &drops, 0)) {
270
+ fprintf(stderr, "test_io nofault failed\n");
271
+ goto err;
272
+ }
273
+ if (drops)
274
+ break;
275
+ usecs = (usecs * 12) / 10;
276
+ iters++;
277
+ } while (iters < 40);
278
+
279
+ if (test_io(fname, usecs, &drops, 0)) {
280
+ fprintf(stderr, "test_io nofault failed\n");
281
+ goto err;
282
+ }
283
+
284
+ if (test_io(fname, usecs, &drops, 1)) {
285
+ fprintf(stderr, "test_io fault failed\n");
286
+ goto err;
287
+ }
288
+
289
+ unlink(fname);
290
+ return 0;
291
+ err:
292
+ unlink(fname);
293
+ return 1;
294
+ }
@@ -0,0 +1,102 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test CQ peek-batch
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "liburing.h"
14
+
15
+ static int queue_n_nops(struct io_uring *ring, int n, int offset)
16
+ {
17
+ struct io_uring_sqe *sqe;
18
+ int i, ret;
19
+
20
+ for (i = 0; i < n; i++) {
21
+ sqe = io_uring_get_sqe(ring);
22
+ if (!sqe) {
23
+ printf("get sqe failed\n");
24
+ goto err;
25
+ }
26
+
27
+ io_uring_prep_nop(sqe);
28
+ sqe->user_data = i + offset;
29
+ }
30
+
31
+ ret = io_uring_submit(ring);
32
+ if (ret < n) {
33
+ printf("Submitted only %d\n", ret);
34
+ goto err;
35
+ } else if (ret < 0) {
36
+ printf("sqe submit failed: %d\n", ret);
37
+ goto err;
38
+ }
39
+
40
+ return 0;
41
+ err:
42
+ return 1;
43
+ }
44
+
45
+ #define CHECK_BATCH(ring, got, cqes, count, expected) do {\
46
+ got = io_uring_peek_batch_cqe((ring), cqes, count);\
47
+ if (got != expected) {\
48
+ printf("Got %d CQs, expected %d\n", got, expected);\
49
+ goto err;\
50
+ }\
51
+ } while(0)
52
+
53
+ int main(int argc, char *argv[])
54
+ {
55
+ struct io_uring_cqe *cqes[8];
56
+ struct io_uring ring;
57
+ int ret, i;
58
+ unsigned got;
59
+
60
+ if (argc > 1)
61
+ return 0;
62
+
63
+ ret = io_uring_queue_init(4, &ring, 0);
64
+ if (ret) {
65
+ printf("ring setup failed\n");
66
+ return 1;
67
+
68
+ }
69
+
70
+ CHECK_BATCH(&ring, got, cqes, 4, 0);
71
+ if (queue_n_nops(&ring, 4, 0))
72
+ goto err;
73
+
74
+ CHECK_BATCH(&ring, got, cqes, 4, 4);
75
+ for (i=0;i<4;i++) {
76
+ if (i != cqes[i]->user_data) {
77
+ printf("Got user_data %" PRIu64 ", expected %d\n",
78
+ (uint64_t) cqes[i]->user_data, i);
79
+ goto err;
80
+ }
81
+ }
82
+
83
+ if (queue_n_nops(&ring, 4, 4))
84
+ goto err;
85
+
86
+ io_uring_cq_advance(&ring, 4);
87
+ CHECK_BATCH(&ring, got, cqes, 4, 4);
88
+ for (i=0;i<4;i++) {
89
+ if (i + 4 != cqes[i]->user_data) {
90
+ printf("Got user_data %" PRIu64 ", expected %d\n",
91
+ (uint64_t) cqes[i]->user_data, i + 4);
92
+ goto err;
93
+ }
94
+ }
95
+
96
+ io_uring_cq_advance(&ring, 8);
97
+ io_uring_queue_exit(&ring);
98
+ return 0;
99
+ err:
100
+ io_uring_queue_exit(&ring);
101
+ return 1;
102
+ }
@@ -0,0 +1,94 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test CQ ready
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "liburing.h"
14
+
15
+ static int queue_n_nops(struct io_uring *ring, int n)
16
+ {
17
+ struct io_uring_sqe *sqe;
18
+ int i, ret;
19
+
20
+ for (i = 0; i < n; i++) {
21
+ sqe = io_uring_get_sqe(ring);
22
+ if (!sqe) {
23
+ printf("get sqe failed\n");
24
+ goto err;
25
+ }
26
+
27
+ io_uring_prep_nop(sqe);
28
+ }
29
+
30
+ ret = io_uring_submit(ring);
31
+ if (ret < n) {
32
+ printf("Submitted only %d\n", ret);
33
+ goto err;
34
+ } else if (ret < 0) {
35
+ printf("sqe submit failed: %d\n", ret);
36
+ goto err;
37
+ }
38
+
39
+ return 0;
40
+ err:
41
+ return 1;
42
+ }
43
+
44
+ #define CHECK_READY(ring, expected) do {\
45
+ ready = io_uring_cq_ready((ring));\
46
+ if (ready != expected) {\
47
+ printf("Got %d CQs ready, expected %d\n", ready, expected);\
48
+ goto err;\
49
+ }\
50
+ } while(0)
51
+
52
+ int main(int argc, char *argv[])
53
+ {
54
+ struct io_uring ring;
55
+ int ret;
56
+ unsigned ready;
57
+
58
+ if (argc > 1)
59
+ return 0;
60
+
61
+ ret = io_uring_queue_init(4, &ring, 0);
62
+ if (ret) {
63
+ printf("ring setup failed\n");
64
+ return 1;
65
+
66
+ }
67
+
68
+ CHECK_READY(&ring, 0);
69
+ if (queue_n_nops(&ring, 4))
70
+ goto err;
71
+
72
+ CHECK_READY(&ring, 4);
73
+ io_uring_cq_advance(&ring, 4);
74
+ CHECK_READY(&ring, 0);
75
+ if (queue_n_nops(&ring, 4))
76
+ goto err;
77
+
78
+ CHECK_READY(&ring, 4);
79
+
80
+ io_uring_cq_advance(&ring, 1);
81
+ CHECK_READY(&ring, 3);
82
+
83
+ io_uring_cq_advance(&ring, 2);
84
+ CHECK_READY(&ring, 1);
85
+
86
+ io_uring_cq_advance(&ring, 1);
87
+ CHECK_READY(&ring, 0);
88
+
89
+ io_uring_queue_exit(&ring);
90
+ return 0;
91
+ err:
92
+ io_uring_queue_exit(&ring);
93
+ return 1;
94
+ }
@@ -0,0 +1,58 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test CQ ring sizing
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
+
12
+ #include "liburing.h"
13
+
14
+ int main(int argc, char *argv[])
15
+ {
16
+ struct io_uring_params p;
17
+ struct io_uring ring;
18
+ int ret;
19
+
20
+ if (argc > 1)
21
+ return 0;
22
+
23
+ memset(&p, 0, sizeof(p));
24
+ p.flags = IORING_SETUP_CQSIZE;
25
+ p.cq_entries = 64;
26
+
27
+ ret = io_uring_queue_init_params(4, &ring, &p);
28
+ if (ret) {
29
+ if (ret == -EINVAL) {
30
+ printf("Skipped, not supported on this kernel\n");
31
+ goto done;
32
+ }
33
+ printf("ring setup failed\n");
34
+ return 1;
35
+ }
36
+
37
+ if (p.cq_entries < 64) {
38
+ printf("cq entries invalid (%d)\n", p.cq_entries);
39
+ goto err;
40
+ }
41
+ io_uring_queue_exit(&ring);
42
+
43
+ memset(&p, 0, sizeof(p));
44
+ p.flags = IORING_SETUP_CQSIZE;
45
+ p.cq_entries = 0;
46
+
47
+ ret = io_uring_queue_init_params(4, &ring, &p);
48
+ if (ret >= 0 || errno != EINVAL) {
49
+ printf("zero sized cq ring succeeded\n");
50
+ goto err;
51
+ }
52
+
53
+ done:
54
+ return 0;
55
+ err:
56
+ io_uring_queue_exit(&ring);
57
+ return 1;
58
+ }
@@ -0,0 +1,96 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test case for SQPOLL missing a 'ret' clear in case of busy.
4
+ *
5
+ * Heavily based on a test case from
6
+ * Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
7
+ */
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <fcntl.h>
11
+ #include <unistd.h>
12
+ #include <string.h>
13
+
14
+ #include "helpers.h"
15
+ #include "liburing.h"
16
+
17
+ #define FILE_SIZE (128 * 1024)
18
+
19
+ int main(int argc, char *argv[])
20
+ {
21
+ struct io_uring ring;
22
+ int i, fd, ret;
23
+ struct io_uring_sqe *sqe;
24
+ struct io_uring_cqe *cqe;
25
+ struct iovec *iovecs;
26
+ struct io_uring_params p;
27
+ char *fname;
28
+ void *buf;
29
+
30
+ memset(&p, 0, sizeof(p));
31
+ p.flags = IORING_SETUP_SQPOLL;
32
+ ret = t_create_ring_params(4, &ring, &p);
33
+ if (ret == T_SETUP_SKIP)
34
+ return 0;
35
+ else if (ret < 0)
36
+ return 1;
37
+
38
+ if (argc > 1) {
39
+ fname = argv[1];
40
+ } else {
41
+ fname = ".sqpoll.tmp";
42
+ t_create_file(fname, FILE_SIZE);
43
+ }
44
+
45
+ fd = open(fname, O_RDONLY | O_DIRECT);
46
+ if (fname != argv[1])
47
+ unlink(fname);
48
+ if (fd < 0) {
49
+ perror("open");
50
+ goto out;
51
+ }
52
+
53
+ iovecs = t_calloc(10, sizeof(struct iovec));
54
+ for (i = 0; i < 10; i++) {
55
+ t_posix_memalign(&buf, 4096, 4096);
56
+ iovecs[i].iov_base = buf;
57
+ iovecs[i].iov_len = 4096;
58
+ }
59
+
60
+ ret = io_uring_register_files(&ring, &fd, 1);
61
+ if (ret < 0) {
62
+ fprintf(stderr, "register files %d\n", ret);
63
+ goto out;
64
+ }
65
+
66
+ for (i = 0; i < 10; i++) {
67
+ sqe = io_uring_get_sqe(&ring);
68
+ if (!sqe)
69
+ break;
70
+
71
+ io_uring_prep_readv(sqe, 0, &iovecs[i], 1, 0);
72
+ sqe->flags |= IOSQE_FIXED_FILE;
73
+
74
+ ret = io_uring_submit(&ring);
75
+ usleep(1000);
76
+ }
77
+
78
+ for (i = 0; i < 10; i++) {
79
+ ret = io_uring_wait_cqe(&ring, &cqe);
80
+ if (ret) {
81
+ fprintf(stderr, "wait_cqe=%d\n", ret);
82
+ break;
83
+ }
84
+ if (cqe->res != 4096) {
85
+ fprintf(stderr, "ret=%d, wanted 4096\n", cqe->res);
86
+ ret = 1;
87
+ break;
88
+ }
89
+ io_uring_cqe_seen(&ring, cqe);
90
+ }
91
+
92
+ close(fd);
93
+ out:
94
+ io_uring_queue_exit(&ring);
95
+ return ret;
96
+ }
@@ -0,0 +1,65 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #include <stdio.h>
3
+ #include <unistd.h>
4
+ #include <string.h>
5
+ #include <signal.h>
6
+ #include <stdlib.h>
7
+ #include "liburing.h"
8
+ #include "helpers.h"
9
+
10
+ static void sig_alrm(int sig)
11
+ {
12
+ fprintf(stderr, "Timed out!\n");
13
+ exit(1);
14
+ }
15
+
16
+ int main(int argc, char *argv[])
17
+ {
18
+ struct io_uring_sqe *sqe;
19
+ struct io_uring_cqe *cqe;
20
+ struct io_uring_params p;
21
+ struct io_uring ring;
22
+ int ret, data;
23
+
24
+ if (argc > 1)
25
+ return 0;
26
+
27
+ signal(SIGALRM, sig_alrm);
28
+
29
+ memset(&p, 0, sizeof(p));
30
+ p.sq_thread_idle = 100;
31
+ p.flags = IORING_SETUP_SQPOLL;
32
+ ret = t_create_ring_params(4, &ring, &p);
33
+ if (ret == T_SETUP_SKIP)
34
+ return 0;
35
+ else if (ret < 0)
36
+ return 1;
37
+
38
+ /* make sure sq thread is sleeping at this point */
39
+ usleep(150000);
40
+ alarm(1);
41
+
42
+ sqe = io_uring_get_sqe(&ring);
43
+ if (!sqe) {
44
+ fprintf(stderr, "sqe get failed\n");
45
+ return 1;
46
+ }
47
+
48
+ io_uring_prep_nop(sqe);
49
+ io_uring_sqe_set_data(sqe, (void *) (unsigned long) 42);
50
+ io_uring_submit_and_wait(&ring, 1);
51
+
52
+ ret = io_uring_peek_cqe(&ring, &cqe);
53
+ if (ret) {
54
+ fprintf(stderr, "cqe get failed\n");
55
+ return 1;
56
+ }
57
+
58
+ data = (unsigned long) io_uring_cqe_get_data(cqe);
59
+ if (data != 42) {
60
+ fprintf(stderr, "invalid data: %d\n", data);
61
+ return 1;
62
+ }
63
+
64
+ return 0;
65
+ }