uringmachine 0.3 → 0.5
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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +2 -1
- data/CHANGELOG.md +23 -0
- data/README.md +128 -0
- data/TODO.md +14 -0
- data/examples/bm_snooze.rb +89 -0
- data/examples/bm_write.rb +56 -0
- data/examples/dns_client.rb +12 -0
- data/examples/echo_server.rb +18 -40
- data/examples/http_server.rb +42 -43
- data/examples/inout.rb +19 -0
- data/examples/nc.rb +36 -0
- data/examples/server_client.rb +64 -0
- data/examples/snooze.rb +44 -0
- data/examples/write_dev_null.rb +16 -0
- data/ext/um/extconf.rb +24 -23
- data/ext/um/um.c +524 -278
- data/ext/um/um.h +146 -44
- data/ext/um/um_buffer.c +49 -0
- data/ext/um/um_class.c +217 -106
- data/ext/um/um_const.c +213 -0
- data/ext/um/um_ext.c +4 -0
- data/ext/um/um_mutex_class.c +47 -0
- data/ext/um/um_op.c +86 -114
- data/ext/um/um_queue_class.c +58 -0
- data/ext/um/um_sync.c +273 -0
- data/ext/um/um_utils.c +49 -4
- data/lib/uringmachine/dns_resolver.rb +84 -0
- data/lib/uringmachine/version.rb +1 -1
- data/lib/uringmachine.rb +28 -0
- data/supressions/ruby.supp +71 -0
- data/test/helper.rb +8 -0
- data/test/test_um.rb +685 -46
- data/vendor/liburing/.github/workflows/build.yml +29 -1
- data/vendor/liburing/.gitignore +6 -0
- data/vendor/liburing/CHANGELOG +16 -0
- data/vendor/liburing/CONTRIBUTING.md +165 -0
- data/vendor/liburing/configure +64 -0
- data/vendor/liburing/examples/Makefile +9 -1
- data/vendor/liburing/examples/kdigest.c +405 -0
- data/vendor/liburing/examples/proxy.c +75 -8
- data/vendor/liburing/examples/reg-wait.c +159 -0
- data/vendor/liburing/liburing.pc.in +1 -1
- data/vendor/liburing/liburing.spec +1 -1
- data/vendor/liburing/src/Makefile +16 -2
- data/vendor/liburing/src/include/liburing/io_uring.h +77 -0
- data/vendor/liburing/src/include/liburing/sanitize.h +39 -0
- data/vendor/liburing/src/include/liburing.h +59 -6
- data/vendor/liburing/src/int_flags.h +10 -3
- data/vendor/liburing/src/liburing-ffi.map +16 -0
- data/vendor/liburing/src/liburing.map +10 -0
- data/vendor/liburing/src/queue.c +28 -16
- data/vendor/liburing/src/register.c +106 -1
- data/vendor/liburing/src/sanitize.c +176 -0
- data/vendor/liburing/src/setup.c +47 -19
- data/vendor/liburing/src/setup.h +6 -0
- data/vendor/liburing/test/35fa71a030ca.c +7 -0
- data/vendor/liburing/test/500f9fbadef8.c +2 -0
- data/vendor/liburing/test/7ad0e4b2f83c.c +0 -25
- data/vendor/liburing/test/917257daa0fe.c +7 -0
- data/vendor/liburing/test/Makefile +38 -4
- data/vendor/liburing/test/a0908ae19763.c +7 -0
- data/vendor/liburing/test/a4c0b3decb33.c +7 -0
- data/vendor/liburing/test/accept.c +14 -4
- data/vendor/liburing/test/b19062a56726.c +7 -0
- data/vendor/liburing/test/bind-listen.c +2 -2
- data/vendor/liburing/test/buf-ring-nommap.c +10 -3
- data/vendor/liburing/test/buf-ring.c +2 -0
- data/vendor/liburing/test/cmd-discard.c +427 -0
- data/vendor/liburing/test/coredump.c +7 -0
- data/vendor/liburing/test/cq-overflow.c +13 -1
- data/vendor/liburing/test/d4ae271dfaae.c +11 -3
- data/vendor/liburing/test/defer-taskrun.c +2 -2
- data/vendor/liburing/test/defer-tw-timeout.c +4 -1
- data/vendor/liburing/test/defer.c +2 -2
- data/vendor/liburing/test/double-poll-crash.c +1 -1
- data/vendor/liburing/test/eeed8b54e0df.c +2 -0
- data/vendor/liburing/test/eventfd.c +0 -1
- data/vendor/liburing/test/exit-no-cleanup.c +11 -0
- data/vendor/liburing/test/fadvise.c +9 -26
- data/vendor/liburing/test/fdinfo.c +9 -1
- data/vendor/liburing/test/fifo-nonblock-read.c +69 -0
- data/vendor/liburing/test/file-exit-unreg.c +48 -0
- data/vendor/liburing/test/file-register.c +14 -2
- data/vendor/liburing/test/file-update.c +1 -1
- data/vendor/liburing/test/file-verify.c +27 -16
- data/vendor/liburing/test/files-exit-hang-timeout.c +1 -2
- data/vendor/liburing/test/fixed-buf-iter.c +3 -1
- data/vendor/liburing/test/fixed-hugepage.c +12 -1
- data/vendor/liburing/test/fsnotify.c +1 -0
- data/vendor/liburing/test/futex.c +16 -4
- data/vendor/liburing/test/helpers.c +47 -0
- data/vendor/liburing/test/helpers.h +6 -0
- data/vendor/liburing/test/init-mem.c +5 -3
- data/vendor/liburing/test/io-cancel.c +0 -24
- data/vendor/liburing/test/io_uring_passthrough.c +4 -0
- data/vendor/liburing/test/io_uring_register.c +38 -8
- data/vendor/liburing/test/iopoll-leak.c +4 -0
- data/vendor/liburing/test/iopoll-overflow.c +1 -1
- data/vendor/liburing/test/iopoll.c +3 -3
- data/vendor/liburing/test/kallsyms.c +203 -0
- data/vendor/liburing/test/link-timeout.c +159 -0
- data/vendor/liburing/test/linked-defer-close.c +224 -0
- data/vendor/liburing/test/madvise.c +12 -25
- data/vendor/liburing/test/min-timeout-wait.c +0 -25
- data/vendor/liburing/test/min-timeout.c +0 -25
- data/vendor/liburing/test/mkdir.c +6 -0
- data/vendor/liburing/test/msg-ring.c +8 -2
- data/vendor/liburing/test/napi-test.c +16 -3
- data/vendor/liburing/test/no-mmap-inval.c +3 -1
- data/vendor/liburing/test/nop.c +44 -0
- data/vendor/liburing/test/ooo-file-unreg.c +1 -1
- data/vendor/liburing/test/open-close.c +40 -0
- data/vendor/liburing/test/openat2.c +37 -14
- data/vendor/liburing/test/poll-many.c +13 -7
- data/vendor/liburing/test/poll-mshot-update.c +17 -10
- data/vendor/liburing/test/poll-v-poll.c +6 -3
- data/vendor/liburing/test/pollfree.c +148 -0
- data/vendor/liburing/test/read-mshot-empty.c +158 -153
- data/vendor/liburing/test/read-mshot-stdin.c +121 -0
- data/vendor/liburing/test/read-mshot.c +282 -27
- data/vendor/liburing/test/read-write.c +78 -13
- data/vendor/liburing/test/recv-msgall-stream.c +3 -0
- data/vendor/liburing/test/recv-msgall.c +5 -0
- data/vendor/liburing/test/recvsend_bundle-inc.c +680 -0
- data/vendor/liburing/test/recvsend_bundle.c +94 -31
- data/vendor/liburing/test/reg-fd-only.c +15 -5
- data/vendor/liburing/test/reg-wait.c +251 -0
- data/vendor/liburing/test/regbuf-clone.c +645 -0
- data/vendor/liburing/test/regbuf-merge.c +7 -0
- data/vendor/liburing/test/register-restrictions.c +86 -85
- data/vendor/liburing/test/rename.c +59 -1
- data/vendor/liburing/test/resize-rings.c +643 -0
- data/vendor/liburing/test/ringbuf-read.c +5 -0
- data/vendor/liburing/test/ringbuf-status.c +5 -1
- data/vendor/liburing/test/rsrc_tags.c +1 -1
- data/vendor/liburing/test/runtests.sh +16 -1
- data/vendor/liburing/test/send-zerocopy.c +59 -0
- data/vendor/liburing/test/short-read.c +1 -0
- data/vendor/liburing/test/socket.c +43 -0
- data/vendor/liburing/test/splice.c +3 -1
- data/vendor/liburing/test/sq-poll-dup.c +1 -1
- data/vendor/liburing/test/sq-poll-share.c +2 -0
- data/vendor/liburing/test/sqpoll-disable-exit.c +8 -0
- data/vendor/liburing/test/sqpoll-exit-hang.c +1 -25
- data/vendor/liburing/test/sqpoll-sleep.c +40 -33
- data/vendor/liburing/test/sqwait.c +136 -0
- data/vendor/liburing/test/statx.c +89 -0
- data/vendor/liburing/test/stdout.c +2 -0
- data/vendor/liburing/test/submit-and-wait.c +1 -25
- data/vendor/liburing/test/submit-reuse.c +4 -26
- data/vendor/liburing/test/symlink.c +12 -1
- data/vendor/liburing/test/sync-cancel.c +56 -22
- data/vendor/liburing/test/thread-exit.c +5 -0
- data/vendor/liburing/test/timeout-new.c +1 -26
- data/vendor/liburing/test/timeout.c +25 -34
- data/vendor/liburing/test/unlink.c +94 -1
- data/vendor/liburing/test/uring_cmd_ublk.c +1252 -0
- data/vendor/liburing/test/waitid.c +62 -8
- data/vendor/liburing/test/wq-aff.c +35 -0
- data/vendor/liburing/test/xfail_prep_link_timeout_out_of_scope.c +46 -0
- data/vendor/liburing/test/xfail_register_buffers_out_of_scope.c +51 -0
- metadata +37 -6
- data/examples/event_loop.rb +0 -69
- data/examples/fibers.rb +0 -105
- data/examples/http_server_multishot.rb +0 -57
- data/examples/http_server_simpler.rb +0 -34
@@ -4,15 +4,18 @@
|
|
4
4
|
#include "lib.h"
|
5
5
|
#include "syscall.h"
|
6
6
|
#include "liburing.h"
|
7
|
+
#include "setup.h"
|
7
8
|
#include "int_flags.h"
|
8
|
-
#include "liburing/compat.h"
|
9
9
|
#include "liburing/io_uring.h"
|
10
|
+
#include "liburing/sanitize.h"
|
10
11
|
|
11
12
|
static inline int do_register(struct io_uring *ring, unsigned int opcode,
|
12
13
|
const void *arg, unsigned int nr_args)
|
13
14
|
{
|
14
15
|
int fd;
|
15
16
|
|
17
|
+
liburing_sanitize_address(arg);
|
18
|
+
|
16
19
|
if (ring->int_flags & INT_FLAG_REG_REG_RING) {
|
17
20
|
opcode |= IORING_REGISTER_USE_REGISTERED_RING;
|
18
21
|
fd = ring->enter_ring_fd;
|
@@ -28,6 +31,8 @@ int io_uring_register_buffers_update_tag(struct io_uring *ring, unsigned off,
|
|
28
31
|
const __u64 *tags,
|
29
32
|
unsigned nr)
|
30
33
|
{
|
34
|
+
liburing_sanitize_iovecs(iovecs, nr);
|
35
|
+
|
31
36
|
struct io_uring_rsrc_update2 up = {
|
32
37
|
.offset = off,
|
33
38
|
.data = (unsigned long)iovecs,
|
@@ -43,6 +48,8 @@ int io_uring_register_buffers_tags(struct io_uring *ring,
|
|
43
48
|
const __u64 *tags,
|
44
49
|
unsigned nr)
|
45
50
|
{
|
51
|
+
liburing_sanitize_iovecs(iovecs, nr);
|
52
|
+
|
46
53
|
struct io_uring_rsrc_register reg = {
|
47
54
|
.nr = nr,
|
48
55
|
.data = (unsigned long)iovecs,
|
@@ -65,6 +72,8 @@ int io_uring_register_buffers_sparse(struct io_uring *ring, unsigned nr)
|
|
65
72
|
int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
|
66
73
|
unsigned nr_iovecs)
|
67
74
|
{
|
75
|
+
liburing_sanitize_iovecs(iovecs, nr_iovecs);
|
76
|
+
|
68
77
|
return do_register(ring, IORING_REGISTER_BUFFERS, iovecs, nr_iovecs);
|
69
78
|
}
|
70
79
|
|
@@ -77,6 +86,9 @@ int io_uring_register_files_update_tag(struct io_uring *ring, unsigned off,
|
|
77
86
|
const int *files, const __u64 *tags,
|
78
87
|
unsigned nr_files)
|
79
88
|
{
|
89
|
+
liburing_sanitize_address(files);
|
90
|
+
liburing_sanitize_address(tags);
|
91
|
+
|
80
92
|
struct io_uring_rsrc_update2 up = {
|
81
93
|
.offset = off,
|
82
94
|
.data = (unsigned long)files,
|
@@ -97,6 +109,8 @@ int io_uring_register_files_update_tag(struct io_uring *ring, unsigned off,
|
|
97
109
|
int io_uring_register_files_update(struct io_uring *ring, unsigned off,
|
98
110
|
const int *files, unsigned nr_files)
|
99
111
|
{
|
112
|
+
liburing_sanitize_address(files);
|
113
|
+
|
100
114
|
struct io_uring_files_update up = {
|
101
115
|
.offset = off,
|
102
116
|
.fds = (unsigned long) files,
|
@@ -148,6 +162,9 @@ int io_uring_register_files_sparse(struct io_uring *ring, unsigned nr)
|
|
148
162
|
int io_uring_register_files_tags(struct io_uring *ring, const int *files,
|
149
163
|
const __u64 *tags, unsigned nr)
|
150
164
|
{
|
165
|
+
liburing_sanitize_address(files);
|
166
|
+
liburing_sanitize_address(tags);
|
167
|
+
|
151
168
|
struct io_uring_rsrc_register reg = {
|
152
169
|
.nr = nr,
|
153
170
|
.data = (unsigned long)files,
|
@@ -175,6 +192,8 @@ int io_uring_register_files(struct io_uring *ring, const int *files,
|
|
175
192
|
{
|
176
193
|
int ret, did_increase = 0;
|
177
194
|
|
195
|
+
liburing_sanitize_address(files);
|
196
|
+
|
178
197
|
do {
|
179
198
|
ret = do_register(ring, IORING_REGISTER_FILES, files, nr_files);
|
180
199
|
if (ret >= 0)
|
@@ -316,6 +335,7 @@ int io_uring_register_buf_ring(struct io_uring *ring,
|
|
316
335
|
struct io_uring_buf_reg *reg,
|
317
336
|
unsigned int __maybe_unused flags)
|
318
337
|
{
|
338
|
+
reg->flags |= flags;
|
319
339
|
return do_register(ring, IORING_REGISTER_PBUF_RING, reg, 1);
|
320
340
|
}
|
321
341
|
|
@@ -328,6 +348,8 @@ int io_uring_unregister_buf_ring(struct io_uring *ring, int bgid)
|
|
328
348
|
|
329
349
|
int io_uring_buf_ring_head(struct io_uring *ring, int buf_group, uint16_t *head)
|
330
350
|
{
|
351
|
+
liburing_sanitize_address(head);
|
352
|
+
|
331
353
|
struct io_uring_buf_status buf_status = {
|
332
354
|
.buf_group = buf_group,
|
333
355
|
};
|
@@ -372,3 +394,86 @@ int io_uring_register_clock(struct io_uring *ring,
|
|
372
394
|
{
|
373
395
|
return do_register(ring, IORING_REGISTER_CLOCK, arg, 0);
|
374
396
|
}
|
397
|
+
|
398
|
+
int io_uring_clone_buffers_offset(struct io_uring *dst, struct io_uring *src,
|
399
|
+
unsigned int dst_off, unsigned int src_off,
|
400
|
+
unsigned int nr, unsigned int flags)
|
401
|
+
{
|
402
|
+
struct io_uring_clone_buffers buf = {
|
403
|
+
.src_fd = src->ring_fd,
|
404
|
+
.flags = flags,
|
405
|
+
.src_off = src_off,
|
406
|
+
.dst_off = dst_off,
|
407
|
+
.nr = nr,
|
408
|
+
};
|
409
|
+
|
410
|
+
if (src->int_flags & INT_FLAG_REG_REG_RING) {
|
411
|
+
buf.src_fd = src->enter_ring_fd;
|
412
|
+
buf.flags |= IORING_REGISTER_SRC_REGISTERED;
|
413
|
+
} else {
|
414
|
+
buf.src_fd = src->ring_fd;
|
415
|
+
}
|
416
|
+
|
417
|
+
return do_register(dst, IORING_REGISTER_CLONE_BUFFERS, &buf, 1);
|
418
|
+
}
|
419
|
+
|
420
|
+
int io_uring_clone_buffers(struct io_uring *dst, struct io_uring *src)
|
421
|
+
{
|
422
|
+
return io_uring_clone_buffers_offset(dst, src, 0, 0, 0, 0);
|
423
|
+
}
|
424
|
+
|
425
|
+
int io_uring_resize_rings(struct io_uring *ring, struct io_uring_params *p)
|
426
|
+
{
|
427
|
+
unsigned sq_head, sq_tail;
|
428
|
+
int ret;
|
429
|
+
|
430
|
+
if (ring->flags & IORING_SETUP_NO_MMAP)
|
431
|
+
return -EINVAL;
|
432
|
+
|
433
|
+
memset(&p->sq_off, 0, sizeof(p->sq_off));
|
434
|
+
memset(&p->cq_off, 0, sizeof(p->cq_off));
|
435
|
+
|
436
|
+
ret = do_register(ring, IORING_REGISTER_RESIZE_RINGS, p, 1);
|
437
|
+
if (ret < 0)
|
438
|
+
goto out;
|
439
|
+
|
440
|
+
sq_head = ring->sq.sqe_head;
|
441
|
+
sq_tail = ring->sq.sqe_tail;
|
442
|
+
io_uring_unmap_rings(&ring->sq, &ring->cq);
|
443
|
+
memset(&ring->sq, 0, sizeof(ring->sq));
|
444
|
+
memset(&ring->cq, 0, sizeof(ring->cq));
|
445
|
+
ret = io_uring_mmap(ring->ring_fd, p, &ring->sq, &ring->cq);
|
446
|
+
if (ret)
|
447
|
+
goto out;
|
448
|
+
|
449
|
+
ring->sq.sqe_head = sq_head;
|
450
|
+
ring->sq.sqe_tail = sq_tail;
|
451
|
+
|
452
|
+
/*
|
453
|
+
* Directly map SQ slots to SQEs
|
454
|
+
*/
|
455
|
+
if (!(p->flags & IORING_SETUP_NO_SQARRAY)) {
|
456
|
+
unsigned index;
|
457
|
+
|
458
|
+
for (index = 0; index < p->sq_entries; index++)
|
459
|
+
ring->sq.array[index] = index;
|
460
|
+
}
|
461
|
+
|
462
|
+
/* clear for next use */
|
463
|
+
out:
|
464
|
+
p->flags = 0;
|
465
|
+
return ret;
|
466
|
+
}
|
467
|
+
|
468
|
+
int io_uring_register_wait_reg(struct io_uring *ring,
|
469
|
+
struct io_uring_reg_wait *reg, int nr)
|
470
|
+
{
|
471
|
+
struct io_uring_cqwait_reg_arg arg = {
|
472
|
+
.flags = 0,
|
473
|
+
.struct_size = sizeof(*reg),
|
474
|
+
.nr_entries = nr,
|
475
|
+
.user_addr = (unsigned long) (uintptr_t) reg,
|
476
|
+
};
|
477
|
+
|
478
|
+
return do_register(ring, IORING_REGISTER_CQWAIT_REG, &arg, 1);
|
479
|
+
}
|
@@ -0,0 +1,176 @@
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
2
|
+
|
3
|
+
#include "liburing/sanitize.h"
|
4
|
+
|
5
|
+
#include <sanitizer/asan_interface.h>
|
6
|
+
#include <stdlib.h>
|
7
|
+
#include "liburing.h"
|
8
|
+
|
9
|
+
static inline void sanitize_sqe_addr(struct io_uring_sqe *sqe)
|
10
|
+
{
|
11
|
+
if (__asan_address_is_poisoned((void *) (unsigned long) sqe->addr) != 0) {
|
12
|
+
__asan_describe_address((void *) (unsigned long) sqe->addr);
|
13
|
+
exit(1);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
static inline void sanitize_sqe_optval(struct io_uring_sqe *sqe)
|
17
|
+
{
|
18
|
+
if (__asan_region_is_poisoned((void *) (unsigned long) sqe->optval, sqe->optlen) != 0) {
|
19
|
+
__asan_describe_address((void *) (unsigned long) sqe->optval);
|
20
|
+
exit(1);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
static inline void sanitize_sqe_addr2(struct io_uring_sqe *sqe)
|
24
|
+
{
|
25
|
+
if (__asan_address_is_poisoned((void *) (unsigned long) sqe->addr2) != 0) {
|
26
|
+
__asan_describe_address((void *) (unsigned long) sqe->addr2);
|
27
|
+
exit(1);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
static inline void sanitize_sqe_addr3(struct io_uring_sqe *sqe)
|
31
|
+
{
|
32
|
+
if (__asan_address_is_poisoned((void *) (unsigned long) sqe->addr3) != 0) {
|
33
|
+
__asan_describe_address((void *) (unsigned long) sqe->addr3);
|
34
|
+
exit(1);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
static inline void sanitize_sqe_addr_and_add2(struct io_uring_sqe *sqe)
|
38
|
+
{
|
39
|
+
sanitize_sqe_addr(sqe);
|
40
|
+
sanitize_sqe_addr2(sqe);
|
41
|
+
}
|
42
|
+
static inline void sanitize_sqe_addr_and_add3(struct io_uring_sqe *sqe)
|
43
|
+
{
|
44
|
+
sanitize_sqe_addr(sqe);
|
45
|
+
sanitize_sqe_addr3(sqe);
|
46
|
+
}
|
47
|
+
static inline void sanitize_sqe_nop(struct io_uring_sqe *sqe)
|
48
|
+
{
|
49
|
+
}
|
50
|
+
|
51
|
+
typedef void (*sanitize_sqe_handler)(struct io_uring_sqe *sqe);
|
52
|
+
sanitize_sqe_handler sanitize_handlers[IORING_OP_LAST];
|
53
|
+
bool sanitize_handlers_initialized = false;
|
54
|
+
|
55
|
+
static inline void initialize_sanitize_handlers()
|
56
|
+
{
|
57
|
+
if (sanitize_handlers_initialized)
|
58
|
+
return;
|
59
|
+
|
60
|
+
sanitize_handlers[IORING_OP_NOP] = sanitize_sqe_nop;
|
61
|
+
sanitize_handlers[IORING_OP_READV] = sanitize_sqe_addr;
|
62
|
+
sanitize_handlers[IORING_OP_WRITEV] = sanitize_sqe_addr;
|
63
|
+
sanitize_handlers[IORING_OP_FSYNC] = sanitize_sqe_addr;
|
64
|
+
sanitize_handlers[IORING_OP_READ_FIXED] = sanitize_sqe_addr;
|
65
|
+
sanitize_handlers[IORING_OP_WRITE_FIXED] = sanitize_sqe_addr;
|
66
|
+
sanitize_handlers[IORING_OP_POLL_ADD] = sanitize_sqe_addr;
|
67
|
+
sanitize_handlers[IORING_OP_POLL_REMOVE] = sanitize_sqe_nop;
|
68
|
+
sanitize_handlers[IORING_OP_SYNC_FILE_RANGE] = sanitize_sqe_addr;
|
69
|
+
sanitize_handlers[IORING_OP_SENDMSG] = sanitize_sqe_addr;
|
70
|
+
sanitize_handlers[IORING_OP_RECVMSG] = sanitize_sqe_addr;
|
71
|
+
sanitize_handlers[IORING_OP_TIMEOUT] = sanitize_sqe_addr;
|
72
|
+
sanitize_handlers[IORING_OP_TIMEOUT_REMOVE] = sanitize_sqe_nop;
|
73
|
+
sanitize_handlers[IORING_OP_ACCEPT] = sanitize_sqe_addr;
|
74
|
+
sanitize_handlers[IORING_OP_ASYNC_CANCEL] = sanitize_sqe_nop;
|
75
|
+
sanitize_handlers[IORING_OP_LINK_TIMEOUT] = sanitize_sqe_addr;
|
76
|
+
sanitize_handlers[IORING_OP_CONNECT] = sanitize_sqe_addr;
|
77
|
+
sanitize_handlers[IORING_OP_FALLOCATE] = sanitize_sqe_nop;
|
78
|
+
sanitize_handlers[IORING_OP_OPENAT] = sanitize_sqe_addr;
|
79
|
+
sanitize_handlers[IORING_OP_CLOSE] = sanitize_sqe_addr;
|
80
|
+
sanitize_handlers[IORING_OP_FILES_UPDATE] = sanitize_sqe_addr;
|
81
|
+
sanitize_handlers[IORING_OP_STATX] = sanitize_sqe_addr;
|
82
|
+
sanitize_handlers[IORING_OP_READ] = sanitize_sqe_addr;
|
83
|
+
sanitize_handlers[IORING_OP_WRITE] = sanitize_sqe_addr;
|
84
|
+
sanitize_handlers[IORING_OP_FADVISE] = sanitize_sqe_nop;
|
85
|
+
sanitize_handlers[IORING_OP_MADVISE] = sanitize_sqe_addr;
|
86
|
+
sanitize_handlers[IORING_OP_SEND] = sanitize_sqe_addr_and_add2;
|
87
|
+
sanitize_handlers[IORING_OP_RECV] = sanitize_sqe_addr;
|
88
|
+
sanitize_handlers[IORING_OP_OPENAT2] = sanitize_sqe_addr;
|
89
|
+
sanitize_handlers[IORING_OP_EPOLL_CTL] = sanitize_sqe_addr;
|
90
|
+
sanitize_handlers[IORING_OP_SPLICE] = sanitize_sqe_nop;
|
91
|
+
sanitize_handlers[IORING_OP_PROVIDE_BUFFERS] = sanitize_sqe_addr;
|
92
|
+
sanitize_handlers[IORING_OP_REMOVE_BUFFERS] = sanitize_sqe_addr;
|
93
|
+
sanitize_handlers[IORING_OP_TEE] = sanitize_sqe_nop;
|
94
|
+
sanitize_handlers[IORING_OP_SHUTDOWN] = sanitize_sqe_addr;
|
95
|
+
sanitize_handlers[IORING_OP_RENAMEAT] = sanitize_sqe_addr;
|
96
|
+
sanitize_handlers[IORING_OP_UNLINKAT] = sanitize_sqe_addr;
|
97
|
+
sanitize_handlers[IORING_OP_MKDIRAT] = sanitize_sqe_addr;
|
98
|
+
sanitize_handlers[IORING_OP_SYMLINKAT] = sanitize_sqe_addr;
|
99
|
+
sanitize_handlers[IORING_OP_LINKAT] = sanitize_sqe_addr;
|
100
|
+
sanitize_handlers[IORING_OP_MSG_RING] = sanitize_sqe_addr_and_add3;
|
101
|
+
sanitize_handlers[IORING_OP_FSETXATTR] = sanitize_sqe_addr;
|
102
|
+
sanitize_handlers[IORING_OP_SETXATTR] = sanitize_sqe_addr_and_add3;
|
103
|
+
sanitize_handlers[IORING_OP_FGETXATTR] = sanitize_sqe_addr;
|
104
|
+
sanitize_handlers[IORING_OP_GETXATTR] = sanitize_sqe_addr_and_add3;
|
105
|
+
sanitize_handlers[IORING_OP_SOCKET] = sanitize_sqe_addr;
|
106
|
+
sanitize_handlers[IORING_OP_URING_CMD] = sanitize_sqe_optval;
|
107
|
+
sanitize_handlers[IORING_OP_SEND_ZC] = sanitize_sqe_addr;
|
108
|
+
sanitize_handlers[IORING_OP_SENDMSG_ZC] = sanitize_sqe_addr;
|
109
|
+
sanitize_handlers[IORING_OP_READ_MULTISHOT] = sanitize_sqe_addr;
|
110
|
+
sanitize_handlers[IORING_OP_WAITID] = sanitize_sqe_addr_and_add2;
|
111
|
+
sanitize_handlers[IORING_OP_FUTEX_WAIT] = sanitize_sqe_addr;
|
112
|
+
sanitize_handlers[IORING_OP_FUTEX_WAKE] = sanitize_sqe_addr;
|
113
|
+
sanitize_handlers[IORING_OP_FUTEX_WAITV] = sanitize_sqe_addr;
|
114
|
+
sanitize_handlers[IORING_OP_FIXED_FD_INSTALL] = sanitize_sqe_addr;
|
115
|
+
sanitize_handlers[IORING_OP_FTRUNCATE] = sanitize_sqe_addr;
|
116
|
+
sanitize_handlers[IORING_OP_BIND] = sanitize_sqe_addr;
|
117
|
+
sanitize_handlers[IORING_OP_LISTEN] = sanitize_sqe_addr;
|
118
|
+
sanitize_handlers_initialized = true;
|
119
|
+
}
|
120
|
+
|
121
|
+
void liburing_sanitize_ring(struct io_uring *ring)
|
122
|
+
{
|
123
|
+
struct io_uring_sq *sq = &ring->sq;
|
124
|
+
struct io_uring_sqe *sqe;
|
125
|
+
unsigned int head;
|
126
|
+
int shift = 0;
|
127
|
+
|
128
|
+
initialize_sanitize_handlers();
|
129
|
+
|
130
|
+
if (ring->flags & IORING_SETUP_SQE128)
|
131
|
+
shift = 1;
|
132
|
+
if (!(ring->flags & IORING_SETUP_SQPOLL))
|
133
|
+
head = *sq->khead;
|
134
|
+
else
|
135
|
+
head = io_uring_smp_load_acquire(sq->khead);
|
136
|
+
|
137
|
+
while (head != sq->sqe_tail) {
|
138
|
+
sqe = &sq->sqes[(head & sq->ring_mask) << shift];
|
139
|
+
if (sqe->opcode < IORING_OP_LAST)
|
140
|
+
sanitize_handlers[sqe->opcode](sqe);
|
141
|
+
head++;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
void liburing_sanitize_address(const void *addr)
|
146
|
+
{
|
147
|
+
if (__asan_address_is_poisoned(addr) != 0) {
|
148
|
+
__asan_describe_address((void *)addr);
|
149
|
+
exit(1);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
void liburing_sanitize_region(const void *addr, unsigned int len)
|
154
|
+
{
|
155
|
+
if (__asan_region_is_poisoned((void *)addr, len) != 0) {
|
156
|
+
__asan_describe_address((void *)addr);
|
157
|
+
exit(1);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
void liburing_sanitize_iovecs(const struct iovec *iovecs, unsigned nr)
|
162
|
+
{
|
163
|
+
unsigned i;
|
164
|
+
|
165
|
+
if (__asan_address_is_poisoned((void *)iovecs) != 0) {
|
166
|
+
__asan_describe_address((void *)iovecs);
|
167
|
+
exit(1);
|
168
|
+
}
|
169
|
+
|
170
|
+
for (i = 0; i < nr; i++) {
|
171
|
+
if (__asan_region_is_poisoned((void *)iovecs[i].iov_base, iovecs[i].iov_len) != 0) {
|
172
|
+
__asan_describe_address((void *)iovecs[i].iov_base);
|
173
|
+
exit(1);
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
data/vendor/liburing/src/setup.c
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
#include "liburing.h"
|
7
7
|
#include "int_flags.h"
|
8
8
|
#include "setup.h"
|
9
|
-
#include "liburing/compat.h"
|
10
9
|
#include "liburing/io_uring.h"
|
11
10
|
|
12
11
|
#define KERN_MAX_ENTRIES 32768
|
@@ -59,7 +58,7 @@ static int get_sq_cq_entries(unsigned entries, struct io_uring_params *p,
|
|
59
58
|
return 0;
|
60
59
|
}
|
61
60
|
|
62
|
-
|
61
|
+
void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
|
63
62
|
{
|
64
63
|
if (sq->ring_sz)
|
65
64
|
__sys_munmap(sq->ring_ptr, sq->ring_sz);
|
@@ -67,9 +66,9 @@ static void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
|
|
67
66
|
__sys_munmap(cq->ring_ptr, cq->ring_sz);
|
68
67
|
}
|
69
68
|
|
70
|
-
|
71
|
-
|
72
|
-
|
69
|
+
void io_uring_setup_ring_pointers(struct io_uring_params *p,
|
70
|
+
struct io_uring_sq *sq,
|
71
|
+
struct io_uring_cq *cq)
|
73
72
|
{
|
74
73
|
sq->khead = sq->ring_ptr + p->sq_off.head;
|
75
74
|
sq->ktail = sq->ring_ptr + p->sq_off.tail;
|
@@ -95,8 +94,8 @@ static void io_uring_setup_ring_pointers(struct io_uring_params *p,
|
|
95
94
|
cq->ring_entries = *cq->kring_entries;
|
96
95
|
}
|
97
96
|
|
98
|
-
|
99
|
-
|
97
|
+
int io_uring_mmap(int fd, struct io_uring_params *p, struct io_uring_sq *sq,
|
98
|
+
struct io_uring_cq *cq)
|
100
99
|
{
|
101
100
|
size_t size;
|
102
101
|
int ret;
|
@@ -222,9 +221,9 @@ static int io_uring_alloc_huge(unsigned entries, struct io_uring_params *p,
|
|
222
221
|
ring_mem = KRING_SIZE;
|
223
222
|
|
224
223
|
sqes_mem = sq_entries * sizeof(struct io_uring_sqe);
|
225
|
-
sqes_mem = (sqes_mem + page_size - 1) & ~(page_size - 1);
|
226
224
|
if (!(p->flags & IORING_SETUP_NO_SQARRAY))
|
227
225
|
sqes_mem += sq_entries * sizeof(unsigned);
|
226
|
+
sqes_mem = (sqes_mem + page_size - 1) & ~(page_size - 1);
|
228
227
|
|
229
228
|
cqes_mem = cq_entries * sizeof(struct io_uring_cqe);
|
230
229
|
if (p->flags & IORING_SETUP_CQE32)
|
@@ -433,7 +432,7 @@ __cold void io_uring_queue_exit(struct io_uring *ring)
|
|
433
432
|
struct io_uring_cq *cq = &ring->cq;
|
434
433
|
size_t sqe_size;
|
435
434
|
|
436
|
-
if (!sq->ring_sz) {
|
435
|
+
if (!sq->ring_sz && !(ring->int_flags & INT_FLAG_APP_MEM)) {
|
437
436
|
sqe_size = sizeof(struct io_uring_sqe);
|
438
437
|
if (ring->flags & IORING_SETUP_SQE128)
|
439
438
|
sqe_size += 64;
|
@@ -595,7 +594,7 @@ __cold ssize_t io_uring_mlock_size(unsigned entries, unsigned flags)
|
|
595
594
|
#if defined(__hppa__)
|
596
595
|
static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
597
596
|
unsigned int nentries, int bgid,
|
598
|
-
unsigned int flags, int *
|
597
|
+
unsigned int flags, int *err)
|
599
598
|
{
|
600
599
|
struct io_uring_buf_ring *br;
|
601
600
|
struct io_uring_buf_reg reg;
|
@@ -608,10 +607,10 @@ static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
|
608
607
|
reg.bgid = bgid;
|
609
608
|
reg.flags = IOU_PBUF_RING_MMAP;
|
610
609
|
|
611
|
-
*
|
610
|
+
*err = 0;
|
612
611
|
lret = io_uring_register_buf_ring(ring, ®, flags);
|
613
612
|
if (lret) {
|
614
|
-
*
|
613
|
+
*err = lret;
|
615
614
|
return NULL;
|
616
615
|
}
|
617
616
|
|
@@ -620,7 +619,7 @@ static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
|
620
619
|
br = __sys_mmap(NULL, ring_size, PROT_READ | PROT_WRITE,
|
621
620
|
MAP_SHARED | MAP_POPULATE, ring->ring_fd, off);
|
622
621
|
if (IS_ERR(br)) {
|
623
|
-
*
|
622
|
+
*err = PTR_ERR(br);
|
624
623
|
return NULL;
|
625
624
|
}
|
626
625
|
|
@@ -629,7 +628,7 @@ static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
|
629
628
|
#else
|
630
629
|
static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
631
630
|
unsigned int nentries, int bgid,
|
632
|
-
unsigned int flags, int *
|
631
|
+
unsigned int flags, int *err)
|
633
632
|
{
|
634
633
|
struct io_uring_buf_ring *br;
|
635
634
|
struct io_uring_buf_reg reg;
|
@@ -641,7 +640,7 @@ static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
|
641
640
|
br = __sys_mmap(NULL, ring_size, PROT_READ | PROT_WRITE,
|
642
641
|
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
643
642
|
if (IS_ERR(br)) {
|
644
|
-
*
|
643
|
+
*err = PTR_ERR(br);
|
645
644
|
return NULL;
|
646
645
|
}
|
647
646
|
|
@@ -649,11 +648,11 @@ static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
|
649
648
|
reg.ring_entries = nentries;
|
650
649
|
reg.bgid = bgid;
|
651
650
|
|
652
|
-
*
|
651
|
+
*err = 0;
|
653
652
|
lret = io_uring_register_buf_ring(ring, ®, flags);
|
654
653
|
if (lret) {
|
655
654
|
__sys_munmap(br, ring_size);
|
656
|
-
*
|
655
|
+
*err = lret;
|
657
656
|
br = NULL;
|
658
657
|
}
|
659
658
|
|
@@ -664,11 +663,11 @@ static struct io_uring_buf_ring *br_setup(struct io_uring *ring,
|
|
664
663
|
struct io_uring_buf_ring *io_uring_setup_buf_ring(struct io_uring *ring,
|
665
664
|
unsigned int nentries,
|
666
665
|
int bgid, unsigned int flags,
|
667
|
-
int *
|
666
|
+
int *err)
|
668
667
|
{
|
669
668
|
struct io_uring_buf_ring *br;
|
670
669
|
|
671
|
-
br = br_setup(ring, nentries, bgid, flags,
|
670
|
+
br = br_setup(ring, nentries, bgid, flags, err);
|
672
671
|
if (br)
|
673
672
|
io_uring_buf_ring_init(br);
|
674
673
|
|
@@ -687,3 +686,32 @@ int io_uring_free_buf_ring(struct io_uring *ring, struct io_uring_buf_ring *br,
|
|
687
686
|
__sys_munmap(br, nentries * sizeof(struct io_uring_buf));
|
688
687
|
return 0;
|
689
688
|
}
|
689
|
+
|
690
|
+
void io_uring_free_reg_wait(struct io_uring_reg_wait *reg, unsigned nentries)
|
691
|
+
{
|
692
|
+
__sys_munmap(reg, nentries * sizeof(struct io_uring_reg_wait));
|
693
|
+
}
|
694
|
+
|
695
|
+
struct io_uring_reg_wait *io_uring_setup_reg_wait(struct io_uring *ring,
|
696
|
+
unsigned nentries, int *err)
|
697
|
+
{
|
698
|
+
struct io_uring_reg_wait *reg;
|
699
|
+
size_t size = nentries * sizeof(*reg);
|
700
|
+
int ret;
|
701
|
+
|
702
|
+
reg = __sys_mmap(NULL, size, PROT_READ | PROT_WRITE,
|
703
|
+
MAP_SHARED|MAP_POPULATE|MAP_ANONYMOUS, -1, 0);
|
704
|
+
if (IS_ERR(reg)) {
|
705
|
+
*err = PTR_ERR(reg);
|
706
|
+
return NULL;
|
707
|
+
}
|
708
|
+
|
709
|
+
memset(reg, 0, size);
|
710
|
+
ret = io_uring_register_wait_reg(ring, reg, nentries);
|
711
|
+
if (!ret)
|
712
|
+
return reg;
|
713
|
+
|
714
|
+
__sys_munmap(reg, size);
|
715
|
+
*err = ret;
|
716
|
+
return NULL;
|
717
|
+
}
|
data/vendor/liburing/src/setup.h
CHANGED
@@ -5,5 +5,11 @@
|
|
5
5
|
int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring,
|
6
6
|
struct io_uring_params *p, void *buf,
|
7
7
|
size_t buf_size);
|
8
|
+
void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq);
|
9
|
+
int io_uring_mmap(int fd, struct io_uring_params *p, struct io_uring_sq *sq,
|
10
|
+
struct io_uring_cq *cq);
|
11
|
+
void io_uring_setup_ring_pointers(struct io_uring_params *p,
|
12
|
+
struct io_uring_sq *sq,
|
13
|
+
struct io_uring_cq *cq);
|
8
14
|
|
9
15
|
#endif
|
@@ -28,6 +28,7 @@
|
|
28
28
|
#include "helpers.h"
|
29
29
|
#include "../src/syscall.h"
|
30
30
|
|
31
|
+
#ifndef CONFIG_USE_SANITIZER
|
31
32
|
#if !defined(SYS_futex) && defined(SYS_futex_time64)
|
32
33
|
# define SYS_futex SYS_futex_time64
|
33
34
|
#endif
|
@@ -327,3 +328,9 @@ int main(int argc, char *argv[])
|
|
327
328
|
loop();
|
328
329
|
return T_EXIT_PASS;
|
329
330
|
}
|
331
|
+
#else
|
332
|
+
int main(int argc, char *argv[])
|
333
|
+
{
|
334
|
+
return T_EXIT_SKIP;
|
335
|
+
}
|
336
|
+
#endif
|
@@ -78,10 +78,12 @@ int main(int argc, char *argv[])
|
|
78
78
|
|
79
79
|
close(fd);
|
80
80
|
unlink(buf);
|
81
|
+
free(iov.iov_base);
|
81
82
|
return T_EXIT_PASS;
|
82
83
|
err:
|
83
84
|
close(fd);
|
84
85
|
unlink(buf);
|
86
|
+
free(iov.iov_base);
|
85
87
|
return T_EXIT_FAIL;
|
86
88
|
skipped:
|
87
89
|
fprintf(stderr, "Polling not supported in current dir, test skipped\n");
|
@@ -5,31 +5,6 @@
|
|
5
5
|
#include "liburing.h"
|
6
6
|
#include "helpers.h"
|
7
7
|
|
8
|
-
static unsigned long long mtime_since(const struct timeval *s,
|
9
|
-
const struct timeval *e)
|
10
|
-
{
|
11
|
-
long long sec, usec;
|
12
|
-
|
13
|
-
sec = e->tv_sec - s->tv_sec;
|
14
|
-
usec = (e->tv_usec - s->tv_usec);
|
15
|
-
if (sec > 0 && usec < 0) {
|
16
|
-
sec--;
|
17
|
-
usec += 1000000;
|
18
|
-
}
|
19
|
-
|
20
|
-
sec *= 1000;
|
21
|
-
usec /= 1000;
|
22
|
-
return sec + usec;
|
23
|
-
}
|
24
|
-
|
25
|
-
static unsigned long long mtime_since_now(struct timeval *tv)
|
26
|
-
{
|
27
|
-
struct timeval end;
|
28
|
-
|
29
|
-
gettimeofday(&end, NULL);
|
30
|
-
return mtime_since(tv, &end);
|
31
|
-
}
|
32
|
-
|
33
8
|
int main(int argc, char *argv[])
|
34
9
|
{
|
35
10
|
struct __kernel_timespec ts1, ts2;
|
@@ -14,6 +14,7 @@
|
|
14
14
|
#include "helpers.h"
|
15
15
|
#include "../src/syscall.h"
|
16
16
|
|
17
|
+
#ifndef CONFIG_USE_SANITIZER
|
17
18
|
int main(int argc, char *argv[])
|
18
19
|
{
|
19
20
|
if (argc > 1)
|
@@ -52,3 +53,9 @@ int main(int argc, char *argv[])
|
|
52
53
|
__sys_io_uring_setup(0x7a6, (struct io_uring_params *) 0x20000000UL);
|
53
54
|
return T_EXIT_PASS;
|
54
55
|
}
|
56
|
+
#else
|
57
|
+
int main(int argc, char *argv[])
|
58
|
+
{
|
59
|
+
return T_EXIT_SKIP;
|
60
|
+
}
|
61
|
+
#endif
|