@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,299 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #define _POSIX_C_SOURCE 200112L
3
+
4
+ #include <sys/types.h>
5
+ #include <sys/stat.h>
6
+ #include <sys/mman.h>
7
+ #include <unistd.h>
8
+ #include <errno.h>
9
+ #include <string.h>
10
+
11
+ #include "liburing/compat.h"
12
+ #include "liburing/io_uring.h"
13
+ #include "liburing.h"
14
+
15
+ #include "syscall.h"
16
+
17
+ int io_uring_register_buffers_update_tag(struct io_uring *ring, unsigned off,
18
+ const struct iovec *iovecs,
19
+ const __u64 *tags,
20
+ unsigned nr)
21
+ {
22
+ struct io_uring_rsrc_update2 up = {
23
+ .offset = off,
24
+ .data = (unsigned long)iovecs,
25
+ .tags = (unsigned long)tags,
26
+ .nr = nr,
27
+ };
28
+ int ret;
29
+
30
+ ret = __sys_io_uring_register(ring->ring_fd,
31
+ IORING_REGISTER_BUFFERS_UPDATE,
32
+ &up, sizeof(up));
33
+ return ret < 0 ? -errno : ret;
34
+ }
35
+
36
+ int io_uring_register_buffers_tags(struct io_uring *ring,
37
+ const struct iovec *iovecs,
38
+ const __u64 *tags,
39
+ unsigned nr)
40
+ {
41
+ struct io_uring_rsrc_register reg = {
42
+ .nr = nr,
43
+ .data = (unsigned long)iovecs,
44
+ .tags = (unsigned long)tags,
45
+ };
46
+ int ret;
47
+
48
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_BUFFERS2,
49
+ &reg, sizeof(reg));
50
+ return ret < 0 ? -errno : ret;
51
+ }
52
+
53
+ int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
54
+ unsigned nr_iovecs)
55
+ {
56
+ int ret;
57
+
58
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_BUFFERS,
59
+ iovecs, nr_iovecs);
60
+ if (ret < 0)
61
+ return -errno;
62
+
63
+ return 0;
64
+ }
65
+
66
+ int io_uring_unregister_buffers(struct io_uring *ring)
67
+ {
68
+ int ret;
69
+
70
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_BUFFERS,
71
+ NULL, 0);
72
+ if (ret < 0)
73
+ return -errno;
74
+
75
+ return 0;
76
+ }
77
+
78
+ int io_uring_register_files_update_tag(struct io_uring *ring, unsigned off,
79
+ const int *files, const __u64 *tags,
80
+ unsigned nr_files)
81
+ {
82
+ struct io_uring_rsrc_update2 up = {
83
+ .offset = off,
84
+ .data = (unsigned long)files,
85
+ .tags = (unsigned long)tags,
86
+ .nr = nr_files,
87
+ };
88
+ int ret;
89
+
90
+ ret = __sys_io_uring_register(ring->ring_fd,
91
+ IORING_REGISTER_FILES_UPDATE2,
92
+ &up, sizeof(up));
93
+ return ret < 0 ? -errno : ret;
94
+ }
95
+
96
+ /*
97
+ * Register an update for an existing file set. The updates will start at
98
+ * 'off' in the original array, and 'nr_files' is the number of files we'll
99
+ * update.
100
+ *
101
+ * Returns number of files updated on success, -ERROR on failure.
102
+ */
103
+ int io_uring_register_files_update(struct io_uring *ring, unsigned off,
104
+ int *files, unsigned nr_files)
105
+ {
106
+ struct io_uring_files_update up = {
107
+ .offset = off,
108
+ .fds = (unsigned long) files,
109
+ };
110
+ int ret;
111
+
112
+ ret = __sys_io_uring_register(ring->ring_fd,
113
+ IORING_REGISTER_FILES_UPDATE, &up,
114
+ nr_files);
115
+ if (ret < 0)
116
+ return -errno;
117
+
118
+ return ret;
119
+ }
120
+
121
+
122
+ int io_uring_register_files_tags(struct io_uring *ring,
123
+ const int *files, const __u64 *tags,
124
+ unsigned nr)
125
+ {
126
+ struct io_uring_rsrc_register reg = {
127
+ .nr = nr,
128
+ .data = (unsigned long)files,
129
+ .tags = (unsigned long)tags,
130
+ };
131
+ int ret;
132
+
133
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_FILES2,
134
+ &reg, sizeof(reg));
135
+ return ret < 0 ? -errno : ret;
136
+ }
137
+
138
+ int io_uring_register_files(struct io_uring *ring, const int *files,
139
+ unsigned nr_files)
140
+ {
141
+ int ret;
142
+
143
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_FILES,
144
+ files, nr_files);
145
+ if (ret < 0)
146
+ return -errno;
147
+
148
+ return 0;
149
+ }
150
+
151
+ int io_uring_unregister_files(struct io_uring *ring)
152
+ {
153
+ int ret;
154
+
155
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_FILES,
156
+ NULL, 0);
157
+ if (ret < 0)
158
+ return -errno;
159
+
160
+ return 0;
161
+ }
162
+
163
+ int io_uring_register_eventfd(struct io_uring *ring, int event_fd)
164
+ {
165
+ int ret;
166
+
167
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_EVENTFD,
168
+ &event_fd, 1);
169
+ if (ret < 0)
170
+ return -errno;
171
+
172
+ return 0;
173
+ }
174
+
175
+ int io_uring_unregister_eventfd(struct io_uring *ring)
176
+ {
177
+ int ret;
178
+
179
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_EVENTFD,
180
+ NULL, 0);
181
+ if (ret < 0)
182
+ return -errno;
183
+
184
+ return 0;
185
+ }
186
+
187
+ int io_uring_register_eventfd_async(struct io_uring *ring, int event_fd)
188
+ {
189
+ int ret;
190
+
191
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_EVENTFD_ASYNC,
192
+ &event_fd, 1);
193
+ if (ret < 0)
194
+ return -errno;
195
+
196
+ return 0;
197
+ }
198
+
199
+ int io_uring_register_probe(struct io_uring *ring, struct io_uring_probe *p,
200
+ unsigned int nr_ops)
201
+ {
202
+ int ret;
203
+
204
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_PROBE,
205
+ p, nr_ops);
206
+ if (ret < 0)
207
+ return -errno;
208
+
209
+ return 0;
210
+ }
211
+
212
+ int io_uring_register_personality(struct io_uring *ring)
213
+ {
214
+ int ret;
215
+
216
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_PERSONALITY,
217
+ NULL, 0);
218
+ if (ret < 0)
219
+ return -errno;
220
+
221
+ return ret;
222
+ }
223
+
224
+ int io_uring_unregister_personality(struct io_uring *ring, int id)
225
+ {
226
+ int ret;
227
+
228
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_PERSONALITY,
229
+ NULL, id);
230
+ if (ret < 0)
231
+ return -errno;
232
+
233
+ return ret;
234
+ }
235
+
236
+ int io_uring_register_restrictions(struct io_uring *ring,
237
+ struct io_uring_restriction *res,
238
+ unsigned int nr_res)
239
+ {
240
+ int ret;
241
+
242
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_RESTRICTIONS,
243
+ res, nr_res);
244
+ if (ret < 0)
245
+ return -errno;
246
+
247
+ return 0;
248
+ }
249
+
250
+ int io_uring_enable_rings(struct io_uring *ring)
251
+ {
252
+ int ret;
253
+
254
+ ret = __sys_io_uring_register(ring->ring_fd,
255
+ IORING_REGISTER_ENABLE_RINGS, NULL, 0);
256
+ if (ret < 0)
257
+ return -errno;
258
+
259
+ return ret;
260
+ }
261
+
262
+ int io_uring_register_iowq_aff(struct io_uring *ring, size_t cpusz,
263
+ const cpu_set_t *mask)
264
+ {
265
+ int ret;
266
+
267
+ ret = __sys_io_uring_register(ring->ring_fd,
268
+ IORING_REGISTER_IOWQ_AFF, mask, cpusz);
269
+ if (ret < 0)
270
+ return -errno;
271
+
272
+ return ret;
273
+ }
274
+
275
+ int io_uring_unregister_iowq_aff(struct io_uring *ring)
276
+ {
277
+ int ret;
278
+
279
+ ret = __sys_io_uring_register(ring->ring_fd,
280
+ IORING_REGISTER_IOWQ_AFF, NULL, 0);
281
+ if (ret < 0)
282
+ return -errno;
283
+
284
+ return ret;
285
+ }
286
+
287
+ int io_uring_register_iowq_max_workers(struct io_uring *ring, unsigned int *val)
288
+ {
289
+ int ret;
290
+
291
+ ret = __sys_io_uring_register(ring->ring_fd,
292
+ IORING_REGISTER_IOWQ_MAX_WORKERS,
293
+ val, 2);
294
+ if (ret < 0)
295
+ return -errno;
296
+
297
+ return ret;
298
+
299
+ }
@@ -0,0 +1,356 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #define _DEFAULT_SOURCE
3
+
4
+ #include <sys/types.h>
5
+ #include <sys/stat.h>
6
+ #include <sys/mman.h>
7
+ #include <unistd.h>
8
+ #include <errno.h>
9
+ #include <string.h>
10
+ #include <stdlib.h>
11
+ #include <signal.h>
12
+
13
+ #include "liburing/compat.h"
14
+ #include "liburing/io_uring.h"
15
+ #include "liburing.h"
16
+
17
+ #include "syscall.h"
18
+
19
+ static void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
20
+ {
21
+ munmap(sq->ring_ptr, sq->ring_sz);
22
+ if (cq->ring_ptr && cq->ring_ptr != sq->ring_ptr)
23
+ munmap(cq->ring_ptr, cq->ring_sz);
24
+ }
25
+
26
+ static int io_uring_mmap(int fd, struct io_uring_params *p,
27
+ struct io_uring_sq *sq, struct io_uring_cq *cq)
28
+ {
29
+ size_t size;
30
+ int ret;
31
+
32
+ sq->ring_sz = p->sq_off.array + p->sq_entries * sizeof(unsigned);
33
+ cq->ring_sz = p->cq_off.cqes + p->cq_entries * sizeof(struct io_uring_cqe);
34
+
35
+ if (p->features & IORING_FEAT_SINGLE_MMAP) {
36
+ if (cq->ring_sz > sq->ring_sz)
37
+ sq->ring_sz = cq->ring_sz;
38
+ cq->ring_sz = sq->ring_sz;
39
+ }
40
+ sq->ring_ptr = mmap(0, sq->ring_sz, PROT_READ | PROT_WRITE,
41
+ MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQ_RING);
42
+ if (sq->ring_ptr == MAP_FAILED)
43
+ return -errno;
44
+
45
+ if (p->features & IORING_FEAT_SINGLE_MMAP) {
46
+ cq->ring_ptr = sq->ring_ptr;
47
+ } else {
48
+ cq->ring_ptr = mmap(0, cq->ring_sz, PROT_READ | PROT_WRITE,
49
+ MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_CQ_RING);
50
+ if (cq->ring_ptr == MAP_FAILED) {
51
+ cq->ring_ptr = NULL;
52
+ ret = -errno;
53
+ goto err;
54
+ }
55
+ }
56
+
57
+ sq->khead = sq->ring_ptr + p->sq_off.head;
58
+ sq->ktail = sq->ring_ptr + p->sq_off.tail;
59
+ sq->kring_mask = sq->ring_ptr + p->sq_off.ring_mask;
60
+ sq->kring_entries = sq->ring_ptr + p->sq_off.ring_entries;
61
+ sq->kflags = sq->ring_ptr + p->sq_off.flags;
62
+ sq->kdropped = sq->ring_ptr + p->sq_off.dropped;
63
+ sq->array = sq->ring_ptr + p->sq_off.array;
64
+
65
+ size = p->sq_entries * sizeof(struct io_uring_sqe);
66
+ sq->sqes = mmap(0, size, PROT_READ | PROT_WRITE,
67
+ MAP_SHARED | MAP_POPULATE, fd,
68
+ IORING_OFF_SQES);
69
+ if (sq->sqes == MAP_FAILED) {
70
+ ret = -errno;
71
+ err:
72
+ io_uring_unmap_rings(sq, cq);
73
+ return ret;
74
+ }
75
+
76
+ cq->khead = cq->ring_ptr + p->cq_off.head;
77
+ cq->ktail = cq->ring_ptr + p->cq_off.tail;
78
+ cq->kring_mask = cq->ring_ptr + p->cq_off.ring_mask;
79
+ cq->kring_entries = cq->ring_ptr + p->cq_off.ring_entries;
80
+ cq->koverflow = cq->ring_ptr + p->cq_off.overflow;
81
+ cq->cqes = cq->ring_ptr + p->cq_off.cqes;
82
+ if (p->cq_off.flags)
83
+ cq->kflags = cq->ring_ptr + p->cq_off.flags;
84
+ return 0;
85
+ }
86
+
87
+ /*
88
+ * For users that want to specify sq_thread_cpu or sq_thread_idle, this
89
+ * interface is a convenient helper for mmap()ing the rings.
90
+ * Returns -errno on error, or zero on success. On success, 'ring'
91
+ * contains the necessary information to read/write to the rings.
92
+ */
93
+ int io_uring_queue_mmap(int fd, struct io_uring_params *p, struct io_uring *ring)
94
+ {
95
+ int ret;
96
+
97
+ memset(ring, 0, sizeof(*ring));
98
+ ret = io_uring_mmap(fd, p, &ring->sq, &ring->cq);
99
+ if (!ret) {
100
+ ring->flags = p->flags;
101
+ ring->ring_fd = fd;
102
+ }
103
+ return ret;
104
+ }
105
+
106
+ /*
107
+ * Ensure that the mmap'ed rings aren't available to a child after a fork(2).
108
+ * This uses madvise(..., MADV_DONTFORK) on the mmap'ed ranges.
109
+ */
110
+ int io_uring_ring_dontfork(struct io_uring *ring)
111
+ {
112
+ size_t len;
113
+ int ret;
114
+
115
+ if (!ring->sq.ring_ptr || !ring->sq.sqes || !ring->cq.ring_ptr)
116
+ return -EINVAL;
117
+
118
+ len = *ring->sq.kring_entries * sizeof(struct io_uring_sqe);
119
+ ret = madvise(ring->sq.sqes, len, MADV_DONTFORK);
120
+ if (ret == -1)
121
+ return -errno;
122
+
123
+ len = ring->sq.ring_sz;
124
+ ret = madvise(ring->sq.ring_ptr, len, MADV_DONTFORK);
125
+ if (ret == -1)
126
+ return -errno;
127
+
128
+ if (ring->cq.ring_ptr != ring->sq.ring_ptr) {
129
+ len = ring->cq.ring_sz;
130
+ ret = madvise(ring->cq.ring_ptr, len, MADV_DONTFORK);
131
+ if (ret == -1)
132
+ return -errno;
133
+ }
134
+
135
+ return 0;
136
+ }
137
+
138
+ int io_uring_queue_init_params(unsigned entries, struct io_uring *ring,
139
+ struct io_uring_params *p)
140
+ {
141
+ int fd, ret;
142
+
143
+ fd = __sys_io_uring_setup(entries, p);
144
+ if (fd < 0)
145
+ return -errno;
146
+
147
+ ret = io_uring_queue_mmap(fd, p, ring);
148
+ if (ret) {
149
+ close(fd);
150
+ return ret;
151
+ }
152
+
153
+ ring->features = p->features;
154
+ return 0;
155
+ }
156
+
157
+ /*
158
+ * Returns -errno on error, or zero on success. On success, 'ring'
159
+ * contains the necessary information to read/write to the rings.
160
+ */
161
+ int io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags)
162
+ {
163
+ struct io_uring_params p;
164
+
165
+ memset(&p, 0, sizeof(p));
166
+ p.flags = flags;
167
+
168
+ return io_uring_queue_init_params(entries, ring, &p);
169
+ }
170
+
171
+ void io_uring_queue_exit(struct io_uring *ring)
172
+ {
173
+ struct io_uring_sq *sq = &ring->sq;
174
+ struct io_uring_cq *cq = &ring->cq;
175
+
176
+ munmap(sq->sqes, *sq->kring_entries * sizeof(struct io_uring_sqe));
177
+ io_uring_unmap_rings(sq, cq);
178
+ close(ring->ring_fd);
179
+ }
180
+
181
+ struct io_uring_probe *io_uring_get_probe_ring(struct io_uring *ring)
182
+ {
183
+ struct io_uring_probe *probe;
184
+ size_t len;
185
+ int r;
186
+
187
+ len = sizeof(*probe) + 256 * sizeof(struct io_uring_probe_op);
188
+ probe = malloc(len);
189
+ if (!probe)
190
+ return NULL;
191
+ memset(probe, 0, len);
192
+
193
+ r = io_uring_register_probe(ring, probe, 256);
194
+ if (r >= 0)
195
+ return probe;
196
+
197
+ free(probe);
198
+ return NULL;
199
+ }
200
+
201
+ struct io_uring_probe *io_uring_get_probe(void)
202
+ {
203
+ struct io_uring ring;
204
+ struct io_uring_probe *probe;
205
+ int r;
206
+
207
+ r = io_uring_queue_init(2, &ring, 0);
208
+ if (r < 0)
209
+ return NULL;
210
+
211
+ probe = io_uring_get_probe_ring(&ring);
212
+ io_uring_queue_exit(&ring);
213
+ return probe;
214
+ }
215
+
216
+ void io_uring_free_probe(struct io_uring_probe *probe)
217
+ {
218
+ free(probe);
219
+ }
220
+
221
+ static int __fls(int x)
222
+ {
223
+ int r = 32;
224
+
225
+ if (!x)
226
+ return 0;
227
+ if (!(x & 0xffff0000u)) {
228
+ x <<= 16;
229
+ r -= 16;
230
+ }
231
+ if (!(x & 0xff000000u)) {
232
+ x <<= 8;
233
+ r -= 8;
234
+ }
235
+ if (!(x & 0xf0000000u)) {
236
+ x <<= 4;
237
+ r -= 4;
238
+ }
239
+ if (!(x & 0xc0000000u)) {
240
+ x <<= 2;
241
+ r -= 2;
242
+ }
243
+ if (!(x & 0x80000000u)) {
244
+ x <<= 1;
245
+ r -= 1;
246
+ }
247
+ return r;
248
+ }
249
+
250
+ static unsigned roundup_pow2(unsigned depth)
251
+ {
252
+ return 1UL << __fls(depth - 1);
253
+ }
254
+
255
+ static size_t npages(size_t size, unsigned page_size)
256
+ {
257
+ size--;
258
+ size /= page_size;
259
+ return __fls(size);
260
+ }
261
+
262
+ #define KRING_SIZE 320
263
+
264
+ static size_t rings_size(unsigned entries, unsigned cq_entries, unsigned page_size)
265
+ {
266
+ size_t pages, sq_size, cq_size;
267
+
268
+ cq_size = KRING_SIZE;
269
+ cq_size += cq_entries * sizeof(struct io_uring_cqe);
270
+ cq_size = (cq_size + 63) & ~63UL;
271
+ pages = (size_t) 1 << npages(cq_size, page_size);
272
+
273
+ sq_size = sizeof(struct io_uring_sqe) * entries;
274
+ pages += (size_t) 1 << npages(sq_size, page_size);
275
+ return pages * page_size;
276
+ }
277
+
278
+ #define KERN_MAX_ENTRIES 32768
279
+ #define KERN_MAX_CQ_ENTRIES (2 * KERN_MAX_ENTRIES)
280
+
281
+ /*
282
+ * Return the required ulimit -l memlock memory required for a given ring
283
+ * setup, in bytes. May return -errno on error. On newer (5.12+) kernels,
284
+ * io_uring no longer requires any memlock memory, and hence this function
285
+ * will return 0 for that case. On older (5.11 and prior) kernels, this will
286
+ * return the required memory so that the caller can ensure that enough space
287
+ * is available before setting up a ring with the specified parameters.
288
+ */
289
+ ssize_t io_uring_mlock_size_params(unsigned entries, struct io_uring_params *p)
290
+ {
291
+ struct io_uring_params lp = { };
292
+ struct io_uring ring;
293
+ unsigned cq_entries;
294
+ long page_size;
295
+ ssize_t ret;
296
+
297
+ /*
298
+ * We only really use this inited ring to see if the kernel is newer
299
+ * or not. Newer kernels don't require memlocked memory. If we fail,
300
+ * it's most likely because it's an older kernel and we have no
301
+ * available memlock space. Just continue on, lp.features will still
302
+ * be zeroed at this point and we'll do the right thing.
303
+ */
304
+ ret = io_uring_queue_init_params(entries, &ring, &lp);
305
+ if (!ret)
306
+ io_uring_queue_exit(&ring);
307
+
308
+ /*
309
+ * Native workers imply using cgroup memory accounting, and hence no
310
+ * memlock memory is needed for the ring allocations.
311
+ */
312
+ if (lp.features & IORING_FEAT_NATIVE_WORKERS)
313
+ return 0;
314
+
315
+ if (!entries)
316
+ return -EINVAL;
317
+ if (entries > KERN_MAX_ENTRIES) {
318
+ if (!(p->flags & IORING_SETUP_CLAMP))
319
+ return -EINVAL;
320
+ entries = KERN_MAX_ENTRIES;
321
+ }
322
+
323
+ entries = roundup_pow2(entries);
324
+ if (p->flags & IORING_SETUP_CQSIZE) {
325
+ if (!p->cq_entries)
326
+ return -EINVAL;
327
+ cq_entries = p->cq_entries;
328
+ if (cq_entries > KERN_MAX_CQ_ENTRIES) {
329
+ if (!(p->flags & IORING_SETUP_CLAMP))
330
+ return -EINVAL;
331
+ cq_entries = KERN_MAX_CQ_ENTRIES;
332
+ }
333
+ cq_entries = roundup_pow2(cq_entries);
334
+ if (cq_entries < entries)
335
+ return -EINVAL;
336
+ } else {
337
+ cq_entries = 2 * entries;
338
+ }
339
+
340
+ page_size = sysconf(_SC_PAGESIZE);
341
+ if (page_size < 0)
342
+ page_size = 4096;
343
+
344
+ return rings_size(entries, cq_entries, page_size);
345
+ }
346
+
347
+ /*
348
+ * Return required ulimit -l memory space for a given ring setup. See
349
+ * @io_uring_mlock_size_params().
350
+ */
351
+ ssize_t io_uring_mlock_size(unsigned entries, unsigned flags)
352
+ {
353
+ struct io_uring_params p = { .flags = flags, };
354
+
355
+ return io_uring_mlock_size_params(entries, &p);
356
+ }
@@ -0,0 +1,73 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #define _DEFAULT_SOURCE
3
+
4
+ /*
5
+ * Will go away once libc support is there
6
+ */
7
+ #include <unistd.h>
8
+ #include <sys/syscall.h>
9
+ #include <sys/uio.h>
10
+ #include "liburing/compat.h"
11
+ #include "liburing/io_uring.h"
12
+ #include "syscall.h"
13
+
14
+ #ifdef __alpha__
15
+ /*
16
+ * alpha and mips are exception, other architectures have
17
+ * common numbers for new system calls.
18
+ */
19
+ # ifndef __NR_io_uring_setup
20
+ # define __NR_io_uring_setup 535
21
+ # endif
22
+ # ifndef __NR_io_uring_enter
23
+ # define __NR_io_uring_enter 536
24
+ # endif
25
+ # ifndef __NR_io_uring_register
26
+ # define __NR_io_uring_register 537
27
+ # endif
28
+ #elif defined __mips__
29
+ # ifndef __NR_io_uring_setup
30
+ # define __NR_io_uring_setup (__NR_Linux + 425)
31
+ # endif
32
+ # ifndef __NR_io_uring_enter
33
+ # define __NR_io_uring_enter (__NR_Linux + 426)
34
+ # endif
35
+ # ifndef __NR_io_uring_register
36
+ # define __NR_io_uring_register (__NR_Linux + 427)
37
+ # endif
38
+ #else /* !__alpha__ and !__mips__ */
39
+ # ifndef __NR_io_uring_setup
40
+ # define __NR_io_uring_setup 425
41
+ # endif
42
+ # ifndef __NR_io_uring_enter
43
+ # define __NR_io_uring_enter 426
44
+ # endif
45
+ # ifndef __NR_io_uring_register
46
+ # define __NR_io_uring_register 427
47
+ # endif
48
+ #endif
49
+
50
+ int __sys_io_uring_register(int fd, unsigned opcode, const void *arg,
51
+ unsigned nr_args)
52
+ {
53
+ return syscall(__NR_io_uring_register, fd, opcode, arg, nr_args);
54
+ }
55
+
56
+ int __sys_io_uring_setup(unsigned entries, struct io_uring_params *p)
57
+ {
58
+ return syscall(__NR_io_uring_setup, entries, p);
59
+ }
60
+
61
+ int __sys_io_uring_enter2(int fd, unsigned to_submit, unsigned min_complete,
62
+ unsigned flags, sigset_t *sig, int sz)
63
+ {
64
+ return syscall(__NR_io_uring_enter, fd, to_submit, min_complete,
65
+ flags, sig, sz);
66
+ }
67
+
68
+ int __sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete,
69
+ unsigned flags, sigset_t *sig)
70
+ {
71
+ return __sys_io_uring_enter2(fd, to_submit, min_complete, flags, sig,
72
+ _NSIG / 8);
73
+ }