uringmachine 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +85 -0
- data/TODO.md +5 -0
- data/examples/echo_server.rb +18 -40
- data/examples/inout.rb +19 -0
- data/examples/nc.rb +36 -0
- data/ext/um/extconf.rb +6 -15
- data/ext/um/um.c +245 -53
- data/ext/um/um.h +21 -9
- data/ext/um/um_class.c +74 -87
- data/ext/um/um_const.c +184 -0
- data/ext/um/um_op.c +10 -13
- data/ext/um/um_utils.c +48 -3
- data/lib/uringmachine/version.rb +1 -1
- data/lib/uringmachine.rb +12 -0
- data/test/helper.rb +8 -0
- data/test/test_um.rb +227 -7
- data/vendor/liburing/.github/workflows/build.yml +29 -1
- data/vendor/liburing/.gitignore +1 -0
- data/vendor/liburing/CHANGELOG +15 -0
- data/vendor/liburing/CONTRIBUTING.md +165 -0
- data/vendor/liburing/configure +32 -0
- data/vendor/liburing/examples/Makefile +8 -1
- data/vendor/liburing/examples/kdigest.c +405 -0
- data/vendor/liburing/examples/proxy.c +75 -8
- data/vendor/liburing/liburing.pc.in +1 -1
- data/vendor/liburing/src/Makefile +16 -2
- data/vendor/liburing/src/include/liburing/io_uring.h +31 -0
- data/vendor/liburing/src/include/liburing/sanitize.h +39 -0
- data/vendor/liburing/src/include/liburing.h +31 -4
- data/vendor/liburing/src/liburing-ffi.map +5 -0
- data/vendor/liburing/src/liburing.map +1 -0
- data/vendor/liburing/src/queue.c +3 -0
- data/vendor/liburing/src/register.c +36 -0
- data/vendor/liburing/src/sanitize.c +176 -0
- data/vendor/liburing/src/setup.c +1 -1
- 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 +31 -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/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/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 +2 -0
- data/vendor/liburing/test/io_uring_register.c +25 -6
- 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 +15 -2
- data/vendor/liburing/test/no-mmap-inval.c +2 -0
- 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 +156 -153
- data/vendor/liburing/test/read-mshot.c +276 -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 +92 -29
- data/vendor/liburing/test/reg-fd-only.c +14 -4
- data/vendor/liburing/test/regbuf-clone.c +187 -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/ringbuf-read.c +5 -0
- data/vendor/liburing/test/ringbuf-status.c +5 -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 +1 -25
- 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 +48 -21
- data/vendor/liburing/test/thread-exit.c +5 -0
- data/vendor/liburing/test/timeout-new.c +1 -26
- data/vendor/liburing/test/timeout.c +12 -26
- 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 +17 -4
- data/examples/event_loop.rb +0 -69
- data/examples/fibers.rb +0 -105
@@ -60,7 +60,7 @@ static void close_sock_fds(int s_fd[], int c_fd[], int nr, bool fixed)
|
|
60
60
|
close_fds(c_fd, nr);
|
61
61
|
}
|
62
62
|
|
63
|
-
static void queue_send(struct io_uring *ring, int fd)
|
63
|
+
static void *queue_send(struct io_uring *ring, int fd)
|
64
64
|
{
|
65
65
|
struct io_uring_sqe *sqe;
|
66
66
|
struct data *d;
|
@@ -72,9 +72,11 @@ static void queue_send(struct io_uring *ring, int fd)
|
|
72
72
|
sqe = io_uring_get_sqe(ring);
|
73
73
|
io_uring_prep_writev(sqe, fd, &d->iov, 1, 0);
|
74
74
|
sqe->user_data = 1;
|
75
|
+
|
76
|
+
return d;
|
75
77
|
}
|
76
78
|
|
77
|
-
static void queue_recv(struct io_uring *ring, int fd, bool fixed)
|
79
|
+
static void *queue_recv(struct io_uring *ring, int fd, bool fixed)
|
78
80
|
{
|
79
81
|
struct io_uring_sqe *sqe;
|
80
82
|
struct data *d;
|
@@ -88,6 +90,8 @@ static void queue_recv(struct io_uring *ring, int fd, bool fixed)
|
|
88
90
|
sqe->user_data = 2;
|
89
91
|
if (fixed)
|
90
92
|
sqe->flags |= IOSQE_FIXED_FILE;
|
93
|
+
|
94
|
+
return d;
|
91
95
|
}
|
92
96
|
|
93
97
|
static void queue_accept_multishot(struct io_uring *ring, int fd,
|
@@ -274,6 +278,8 @@ static int test_loop(struct io_uring *ring,
|
|
274
278
|
int nr_fds = multishot ? MAX_FDS : 1;
|
275
279
|
int multishot_idx = multishot ? INITIAL_USER_DATA : 0;
|
276
280
|
int err_ret = T_EXIT_FAIL;
|
281
|
+
void* send_d = 0;
|
282
|
+
void* recv_d = 0;
|
277
283
|
|
278
284
|
if (args.overflow)
|
279
285
|
cause_overflow(ring);
|
@@ -340,8 +346,8 @@ static int test_loop(struct io_uring *ring,
|
|
340
346
|
goto out;
|
341
347
|
}
|
342
348
|
|
343
|
-
queue_send(ring, c_fd[0]);
|
344
|
-
queue_recv(ring, s_fd[0], fixed);
|
349
|
+
send_d = queue_send(ring, c_fd[0]);
|
350
|
+
recv_d = queue_recv(ring, s_fd[0], fixed);
|
345
351
|
|
346
352
|
ret = io_uring_submit_and_wait(ring, 2);
|
347
353
|
assert(ret != -1);
|
@@ -365,9 +371,13 @@ static int test_loop(struct io_uring *ring,
|
|
365
371
|
}
|
366
372
|
|
367
373
|
out:
|
374
|
+
free(send_d);
|
375
|
+
free(recv_d);
|
368
376
|
close_sock_fds(s_fd, c_fd, nr_fds, fixed);
|
369
377
|
return T_EXIT_PASS;
|
370
378
|
err:
|
379
|
+
free(send_d);
|
380
|
+
free(recv_d);
|
371
381
|
close_sock_fds(s_fd, c_fd, nr_fds, fixed);
|
372
382
|
return err_ret;
|
373
383
|
}
|
@@ -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(0xc9f, (struct io_uring_params *) 0x20000200);
|
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
|
@@ -54,7 +54,7 @@ static int connect_client(struct io_uring *ring, unsigned short peer_port)
|
|
54
54
|
|
55
55
|
sqe = io_uring_get_sqe(ring);
|
56
56
|
io_uring_prep_send(sqe, CLI_INDEX, magic, strlen(magic), 0);
|
57
|
-
sqe->flags |= IOSQE_FIXED_FILE
|
57
|
+
sqe->flags |= IOSQE_FIXED_FILE;
|
58
58
|
|
59
59
|
submitted = ret = io_uring_submit(ring);
|
60
60
|
if (ret < 0)
|
@@ -180,7 +180,7 @@ static int test_good_server(unsigned int ring_flags)
|
|
180
180
|
io_uring_cqe_seen(&ring, cqe);
|
181
181
|
|
182
182
|
sqe = io_uring_get_sqe(&ring);
|
183
|
-
io_uring_prep_recv(sqe, CONN_INDEX, buf,
|
183
|
+
io_uring_prep_recv(sqe, CONN_INDEX, buf, sizeof(buf), 0);
|
184
184
|
sqe->flags |= IOSQE_FIXED_FILE;
|
185
185
|
|
186
186
|
io_uring_submit(&ring);
|
@@ -46,8 +46,10 @@ int main(int argc, char *argv[])
|
|
46
46
|
p.flags = IORING_SETUP_NO_MMAP;
|
47
47
|
ret = io_uring_queue_init_mem(1, &ring, &p, ring_mem, 16384);
|
48
48
|
if (ret < 0) {
|
49
|
-
if (ret == -EINVAL || ret == -ENOMEM)
|
49
|
+
if (ret == -EINVAL || ret == -ENOMEM) {
|
50
|
+
free(ring_mem);
|
50
51
|
return T_EXIT_SKIP;
|
52
|
+
}
|
51
53
|
fprintf(stderr, "queue init failed %d\n", ret);
|
52
54
|
return T_EXIT_FAIL;
|
53
55
|
}
|
@@ -62,8 +64,10 @@ int main(int argc, char *argv[])
|
|
62
64
|
|
63
65
|
ret = io_uring_register_buf_ring(&ring, ®, 0);
|
64
66
|
if (ret) {
|
65
|
-
if (ret == -EINVAL)
|
67
|
+
if (ret == -EINVAL) {
|
68
|
+
free(ring_mem);
|
66
69
|
return T_EXIT_SKIP;
|
70
|
+
}
|
67
71
|
fprintf(stderr, "reg buf ring: %d\n", ret);
|
68
72
|
return T_EXIT_FAIL;
|
69
73
|
}
|
@@ -73,8 +77,10 @@ int main(int argc, char *argv[])
|
|
73
77
|
br = mmap(NULL, ring_size, PROT_READ | PROT_WRITE,
|
74
78
|
MAP_SHARED | MAP_POPULATE, ring.ring_fd, off);
|
75
79
|
if (br == MAP_FAILED) {
|
76
|
-
if (errno == ENOMEM)
|
80
|
+
if (errno == ENOMEM) {
|
81
|
+
free(ring_mem);
|
77
82
|
return T_EXIT_SKIP;
|
83
|
+
}
|
78
84
|
perror("mmap");
|
79
85
|
return T_EXIT_FAIL;
|
80
86
|
}
|
@@ -119,5 +125,6 @@ int main(int argc, char *argv[])
|
|
119
125
|
io_uring_cqe_seen(&ring, cqe);
|
120
126
|
|
121
127
|
io_uring_queue_exit(&ring);
|
128
|
+
free(ring_mem);
|
122
129
|
return T_EXIT_PASS;
|
123
130
|
}
|
@@ -57,6 +57,7 @@ static int test_mixed_reg2(int bgid)
|
|
57
57
|
|
58
58
|
io_uring_free_buf_ring(&ring, br, 32, bgid);
|
59
59
|
io_uring_queue_exit(&ring);
|
60
|
+
free(bufs);
|
60
61
|
return 0;
|
61
62
|
}
|
62
63
|
|
@@ -99,6 +100,7 @@ static int test_mixed_reg(int bgid)
|
|
99
100
|
}
|
100
101
|
|
101
102
|
io_uring_queue_exit(&ring);
|
103
|
+
free(bufs);
|
102
104
|
return 0;
|
103
105
|
}
|
104
106
|
|
@@ -16,6 +16,7 @@
|
|
16
16
|
#include "liburing.h"
|
17
17
|
#include "helpers.h"
|
18
18
|
|
19
|
+
#ifndef CONFIG_USE_SANITIZER
|
19
20
|
static void test(void)
|
20
21
|
{
|
21
22
|
struct io_uring_sqe *sqe;
|
@@ -58,3 +59,9 @@ int main(int argc, char *argv[])
|
|
58
59
|
unlink("core");
|
59
60
|
return T_EXIT_PASS;
|
60
61
|
}
|
62
|
+
#else
|
63
|
+
int main(int argc, char *argv[])
|
64
|
+
{
|
65
|
+
return T_EXIT_SKIP;
|
66
|
+
}
|
67
|
+
#endif
|
@@ -88,8 +88,10 @@ static int test_io(const char *file, unsigned long usecs, unsigned *drops,
|
|
88
88
|
goto err;
|
89
89
|
}
|
90
90
|
offset = BS * (rand() % BUFFERS);
|
91
|
-
if (fault && i == ENTRIES + 4)
|
91
|
+
if (fault && i == ENTRIES + 4) {
|
92
|
+
free(vecs[i].iov_base);
|
92
93
|
vecs[i].iov_base = NULL;
|
94
|
+
}
|
93
95
|
io_uring_prep_readv(sqe, fd, &vecs[i], 1, offset);
|
94
96
|
|
95
97
|
ret = io_uring_submit(&ring);
|
@@ -523,8 +525,18 @@ int main(int argc, char *argv[])
|
|
523
525
|
}
|
524
526
|
|
525
527
|
unlink(fname);
|
528
|
+
if(vecs != NULL) {
|
529
|
+
for (i = 0; i < BUFFERS; i++)
|
530
|
+
free(vecs[i].iov_base);
|
531
|
+
}
|
532
|
+
free(vecs);
|
526
533
|
return T_EXIT_PASS;
|
527
534
|
err:
|
528
535
|
unlink(fname);
|
536
|
+
if(vecs != NULL) {
|
537
|
+
for (i = 0; i < BUFFERS; i++)
|
538
|
+
free(vecs[i].iov_base);
|
539
|
+
}
|
540
|
+
free(vecs);
|
529
541
|
return T_EXIT_FAIL;
|
530
542
|
}
|
@@ -19,10 +19,10 @@
|
|
19
19
|
int main(int argc, char *argv[])
|
20
20
|
{
|
21
21
|
struct io_uring ring;
|
22
|
-
int i, fd, ret;
|
22
|
+
int i, fd, ret, __e;
|
23
23
|
struct io_uring_sqe *sqe;
|
24
24
|
struct io_uring_cqe *cqe;
|
25
|
-
struct iovec *iovecs;
|
25
|
+
struct iovec *iovecs = NULL;
|
26
26
|
struct io_uring_params p;
|
27
27
|
char *fname;
|
28
28
|
void *buf;
|
@@ -43,10 +43,13 @@ int main(int argc, char *argv[])
|
|
43
43
|
}
|
44
44
|
|
45
45
|
fd = open(fname, O_RDONLY | O_DIRECT);
|
46
|
+
__e = errno;
|
46
47
|
if (fname != argv[1])
|
47
48
|
unlink(fname);
|
48
49
|
if (fd < 0) {
|
49
|
-
|
50
|
+
if (__e == EINVAL || __e == EPERM || __e == EACCES)
|
51
|
+
return T_EXIT_SKIP;
|
52
|
+
fprintf(stderr, "open: %s\n", strerror(__e));
|
50
53
|
goto out;
|
51
54
|
}
|
52
55
|
|
@@ -92,5 +95,10 @@ int main(int argc, char *argv[])
|
|
92
95
|
close(fd);
|
93
96
|
out:
|
94
97
|
io_uring_queue_exit(&ring);
|
98
|
+
if (iovecs != NULL) { //
|
99
|
+
for (i = 0; i < 10; i++)
|
100
|
+
free(iovecs[i].iov_base);
|
101
|
+
free(iovecs);
|
102
|
+
}
|
95
103
|
return ret;
|
96
104
|
}
|
@@ -196,12 +196,12 @@ static int test_exec(const char *filename)
|
|
196
196
|
|
197
197
|
if (filename) {
|
198
198
|
fd = open(filename, O_RDONLY | O_DIRECT);
|
199
|
-
if (fd < 0 && errno == EINVAL)
|
199
|
+
if (fd < 0 && (errno == EINVAL || errno == EPERM || errno == EACCES))
|
200
200
|
return T_EXIT_SKIP;
|
201
201
|
} else {
|
202
202
|
t_create_file(EXEC_FILENAME, EXEC_FILESIZE);
|
203
203
|
fd = open(EXEC_FILENAME, O_RDONLY | O_DIRECT);
|
204
|
-
if (fd < 0 && errno == EINVAL) {
|
204
|
+
if (fd < 0 && (errno == EINVAL || errno == EPERM || errno == EACCES)) {
|
205
205
|
unlink(EXEC_FILENAME);
|
206
206
|
return T_EXIT_SKIP;
|
207
207
|
}
|
@@ -99,7 +99,7 @@ static int test_file(struct io_uring *ring, char *__fname)
|
|
99
99
|
|
100
100
|
fd = open(fname, O_RDONLY | O_DIRECT);
|
101
101
|
if (fd < 0) {
|
102
|
-
if (errno == EINVAL) {
|
102
|
+
if (errno == EINVAL || errno == EPERM || errno == EACCES) {
|
103
103
|
if (!__fname)
|
104
104
|
unlink(fname);
|
105
105
|
return T_EXIT_SKIP;
|
@@ -128,6 +128,7 @@ static int test_file(struct io_uring *ring, char *__fname)
|
|
128
128
|
if (ret != 1) {
|
129
129
|
fprintf(stderr, "unexpected wait ret %d\n", ret);
|
130
130
|
close(fd);
|
131
|
+
free(buf);
|
131
132
|
return T_EXIT_FAIL;
|
132
133
|
}
|
133
134
|
|
@@ -141,10 +142,12 @@ static int test_file(struct io_uring *ring, char *__fname)
|
|
141
142
|
if (i != 1) {
|
142
143
|
fprintf(stderr, "Got %d request, expected 1\n", i);
|
143
144
|
close(fd);
|
145
|
+
free(buf);
|
144
146
|
return T_EXIT_FAIL;
|
145
147
|
}
|
146
148
|
|
147
149
|
close(fd);
|
150
|
+
free(buf);
|
148
151
|
return T_EXIT_PASS;
|
149
152
|
}
|
150
153
|
|
@@ -96,7 +96,7 @@ static int test_canceled_userdata(struct io_uring *ring)
|
|
96
96
|
if (init_context(&ctx, ring, nr, OP_NOP))
|
97
97
|
return 1;
|
98
98
|
|
99
|
-
for (i = 0; i < nr; i++)
|
99
|
+
for (i = 0; i < nr - 1; i++)
|
100
100
|
ctx.sqes[i]->flags |= IOSQE_IO_LINK;
|
101
101
|
|
102
102
|
ret = io_uring_submit(ring);
|
@@ -130,7 +130,7 @@ static int test_thread_link_cancel(struct io_uring *ring)
|
|
130
130
|
if (init_context(&ctx, ring, nr, OP_REMOVE_BUFFERS))
|
131
131
|
return 1;
|
132
132
|
|
133
|
-
for (i = 0; i < nr; i++)
|
133
|
+
for (i = 0; i < nr - 1; i++)
|
134
134
|
ctx.sqes[i]->flags |= IOSQE_IO_LINK;
|
135
135
|
|
136
136
|
ret = io_uring_submit(ring);
|
@@ -114,7 +114,7 @@ static uint64_t r[4] = {0xffffffffffffffff, 0x0, 0x0, 0xffffffffffffffff};
|
|
114
114
|
int main(int argc, char *argv[])
|
115
115
|
{
|
116
116
|
void *mmap_ret;
|
117
|
-
#if !defined(__i386) && !defined(__x86_64__)
|
117
|
+
#if (!defined(__i386) && !defined(__x86_64__)) || defined(CONFIG_USE_SANITIZER)
|
118
118
|
return T_EXIT_SKIP;
|
119
119
|
#endif
|
120
120
|
|
@@ -19,6 +19,11 @@
|
|
19
19
|
#include "liburing.h"
|
20
20
|
#include "helpers.h"
|
21
21
|
|
22
|
+
// on fast enough machines with enough cores, the first few threads will post
|
23
|
+
// enough sem's to cause the main thread to exit while some threads are half way
|
24
|
+
// initialization. This causes a null deference somewhere in thread cleanup,
|
25
|
+
// which trips ASAN.
|
26
|
+
#ifndef CONFIG_USE_SANITIZER
|
22
27
|
#define IORING_ENTRIES 8
|
23
28
|
|
24
29
|
static pthread_t *threads;
|
@@ -115,3 +120,9 @@ int main(int argc, char *argv[])
|
|
115
120
|
// Exit without resource cleanup
|
116
121
|
exit(EXIT_SUCCESS);
|
117
122
|
}
|
123
|
+
#else
|
124
|
+
int main(int argc, char *argv[])
|
125
|
+
{
|
126
|
+
return T_EXIT_SKIP;
|
127
|
+
}
|
128
|
+
#endif
|
@@ -18,30 +18,6 @@
|
|
18
18
|
#define LOOPS 100
|
19
19
|
#define MIN_LOOPS 10
|
20
20
|
|
21
|
-
static unsigned long long utime_since(const struct timeval *s,
|
22
|
-
const struct timeval *e)
|
23
|
-
{
|
24
|
-
long long sec, usec;
|
25
|
-
|
26
|
-
sec = e->tv_sec - s->tv_sec;
|
27
|
-
usec = (e->tv_usec - s->tv_usec);
|
28
|
-
if (sec > 0 && usec < 0) {
|
29
|
-
sec--;
|
30
|
-
usec += 1000000;
|
31
|
-
}
|
32
|
-
|
33
|
-
sec *= 1000000;
|
34
|
-
return sec + usec;
|
35
|
-
}
|
36
|
-
|
37
|
-
static unsigned long long utime_since_now(struct timeval *tv)
|
38
|
-
{
|
39
|
-
struct timeval end;
|
40
|
-
|
41
|
-
gettimeofday(&end, NULL);
|
42
|
-
return utime_since(tv, &end);
|
43
|
-
}
|
44
|
-
|
45
21
|
static int do_fadvise(struct io_uring *ring, int fd, off_t offset, off_t len,
|
46
22
|
int advice)
|
47
23
|
{
|
@@ -92,7 +68,7 @@ static long do_read(int fd, char *buf)
|
|
92
68
|
perror("lseek");
|
93
69
|
return -1;
|
94
70
|
}
|
95
|
-
|
71
|
+
|
96
72
|
gettimeofday(&tv, NULL);
|
97
73
|
ret = read(fd, buf, FILE_SIZE);
|
98
74
|
t = utime_since_now(&tv);
|
@@ -115,6 +91,8 @@ static int test_fadvise(struct io_uring *ring, const char *filename)
|
|
115
91
|
|
116
92
|
fd = open(filename, O_RDONLY);
|
117
93
|
if (fd < 0) {
|
94
|
+
if (errno == EPERM || errno == EACCES)
|
95
|
+
return T_EXIT_SKIP;
|
118
96
|
perror("open");
|
119
97
|
return 1;
|
120
98
|
}
|
@@ -148,9 +126,12 @@ static int test_fadvise(struct io_uring *ring, const char *filename)
|
|
148
126
|
return 1;
|
149
127
|
|
150
128
|
if (cached_read < uncached_read &&
|
151
|
-
|
129
|
+
cached_read2 < uncached_read) {
|
130
|
+
free(buf);
|
152
131
|
return 0;
|
132
|
+
}
|
153
133
|
|
134
|
+
free(buf);
|
154
135
|
return 2;
|
155
136
|
}
|
156
137
|
|
@@ -174,6 +155,8 @@ int main(int argc, char *argv[])
|
|
174
155
|
good = bad = 0;
|
175
156
|
for (i = 0; i < LOOPS; i++) {
|
176
157
|
ret = test_fadvise(&ring, fname);
|
158
|
+
if (ret == T_EXIT_SKIP)
|
159
|
+
return T_EXIT_SKIP;
|
177
160
|
if (ret == 1) {
|
178
161
|
fprintf(stderr, "read_fadvise failed\n");
|
179
162
|
goto err;
|
@@ -80,7 +80,7 @@ static int __test_io(const char *file, struct io_uring *ring, int write,
|
|
80
80
|
if (fixed) {
|
81
81
|
ret = t_register_buffers(ring, vecs, BUFFERS);
|
82
82
|
if (ret == T_SETUP_SKIP)
|
83
|
-
return
|
83
|
+
return T_EXIT_SKIP;
|
84
84
|
if (ret != T_SETUP_OK) {
|
85
85
|
fprintf(stderr, "buffer reg failed: %d\n", ret);
|
86
86
|
goto err;
|
@@ -91,6 +91,8 @@ static int __test_io(const char *file, struct io_uring *ring, int write,
|
|
91
91
|
if (fd < 0) {
|
92
92
|
if (errno == EINVAL)
|
93
93
|
return 0;
|
94
|
+
if (errno == EPERM || errno == EACCES)
|
95
|
+
return T_EXIT_SKIP;
|
94
96
|
perror("file open");
|
95
97
|
goto err;
|
96
98
|
}
|
@@ -290,6 +292,7 @@ static int has_nonvec_read(void)
|
|
290
292
|
if (ret == -EINVAL) {
|
291
293
|
out:
|
292
294
|
io_uring_queue_exit(&ring);
|
295
|
+
free(p);
|
293
296
|
return 0;
|
294
297
|
} else if (ret) {
|
295
298
|
fprintf(stderr, "register_probe: %d\n", ret);
|
@@ -301,6 +304,7 @@ out:
|
|
301
304
|
if (!(p->ops[IORING_OP_READ].flags & IO_URING_OP_SUPPORTED))
|
302
305
|
goto out;
|
303
306
|
io_uring_queue_exit(&ring);
|
307
|
+
free(p);
|
304
308
|
return 1;
|
305
309
|
}
|
306
310
|
|
@@ -318,6 +322,8 @@ static int test_eventfd_read(int flags)
|
|
318
322
|
if (ret == T_SETUP_SKIP)
|
319
323
|
return 0;
|
320
324
|
if (ret != T_SETUP_OK) {
|
325
|
+
if (ret == -EINVAL)
|
326
|
+
return 0;
|
321
327
|
fprintf(stderr, "ring create failed: %d\n", ret);
|
322
328
|
return 1;
|
323
329
|
}
|
@@ -384,6 +390,8 @@ int main(int argc, char *argv[])
|
|
384
390
|
|
385
391
|
ret = test_io(fname, write, buffered, sqthread, fixed, nonvec,
|
386
392
|
BS);
|
393
|
+
if (ret == T_EXIT_SKIP)
|
394
|
+
continue;
|
387
395
|
if (ret) {
|
388
396
|
fprintf(stderr, "test_io failed %d/%d/%d/%d/%d\n",
|
389
397
|
write, buffered, sqthread, fixed, nonvec);
|
@@ -120,16 +120,21 @@ static int test_grow(struct io_uring *ring)
|
|
120
120
|
fds = open_files(1, 0, off);
|
121
121
|
ret = io_uring_register_files_update(ring, off, fds, 1);
|
122
122
|
if (ret != 1) {
|
123
|
-
if (off == 300 && ret == -EINVAL)
|
123
|
+
if (off == 300 && ret == -EINVAL) {
|
124
|
+
free(fds);
|
124
125
|
break;
|
126
|
+
}
|
125
127
|
fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
|
128
|
+
free(fds);
|
126
129
|
break;
|
127
130
|
}
|
128
131
|
if (off >= 300) {
|
129
132
|
fprintf(stderr, "%s: Succeeded beyond end-of-list?\n", __FUNCTION__);
|
133
|
+
free(fds);
|
130
134
|
goto err;
|
131
135
|
}
|
132
136
|
off++;
|
137
|
+
free(fds);
|
133
138
|
} while (1);
|
134
139
|
|
135
140
|
ret = io_uring_unregister_files(ring);
|
@@ -363,8 +368,10 @@ static int test_basic(struct io_uring *ring, int fail)
|
|
363
368
|
ret = io_uring_register_files(ring, files, 100);
|
364
369
|
if (ret) {
|
365
370
|
if (fail) {
|
366
|
-
if (ret == -EBADF || ret == -EFAULT)
|
371
|
+
if (ret == -EBADF || ret == -EFAULT) {
|
372
|
+
close_files(files, nr_files, 0);
|
367
373
|
return 0;
|
374
|
+
}
|
368
375
|
}
|
369
376
|
fprintf(stderr, "%s: register %d\n", __FUNCTION__, ret);
|
370
377
|
goto err;
|
@@ -631,6 +638,7 @@ static int test_sparse_updates(void)
|
|
631
638
|
ret = io_uring_register_files(&ring, fds, 256);
|
632
639
|
if (ret) {
|
633
640
|
fprintf(stderr, "file_register: %d\n", ret);
|
641
|
+
free(fds);
|
634
642
|
return ret;
|
635
643
|
}
|
636
644
|
|
@@ -639,6 +647,7 @@ static int test_sparse_updates(void)
|
|
639
647
|
ret = io_uring_register_files_update(&ring, i, &newfd, 1);
|
640
648
|
if (ret != 1) {
|
641
649
|
fprintf(stderr, "file_update: %d\n", ret);
|
650
|
+
free(fds);
|
642
651
|
return ret;
|
643
652
|
}
|
644
653
|
}
|
@@ -650,6 +659,7 @@ static int test_sparse_updates(void)
|
|
650
659
|
ret = io_uring_register_files(&ring, fds, 256);
|
651
660
|
if (ret) {
|
652
661
|
fprintf(stderr, "file_register: %d\n", ret);
|
662
|
+
free(fds);
|
653
663
|
return ret;
|
654
664
|
}
|
655
665
|
|
@@ -658,12 +668,14 @@ static int test_sparse_updates(void)
|
|
658
668
|
ret = io_uring_register_files_update(&ring, i, &newfd, 1);
|
659
669
|
if (ret != 1) {
|
660
670
|
fprintf(stderr, "file_update: %d\n", ret);
|
671
|
+
free(fds);
|
661
672
|
return ret;
|
662
673
|
}
|
663
674
|
}
|
664
675
|
io_uring_unregister_files(&ring);
|
665
676
|
|
666
677
|
io_uring_queue_exit(&ring);
|
678
|
+
free(fds);
|
667
679
|
return 0;
|
668
680
|
}
|
669
681
|
|
@@ -174,7 +174,7 @@ static int test_update_no_table(void)
|
|
174
174
|
ret = cqe->res;
|
175
175
|
io_uring_cqe_seen(&ring, cqe);
|
176
176
|
if (ret != -EMFILE && ret != -EINVAL && ret != -EOVERFLOW &&
|
177
|
-
ret != -ENXIO) {
|
177
|
+
ret != -ENXIO && ret != -EBADF) {
|
178
178
|
fprintf(stderr, "Bad cqe res: %d\n", ret);
|
179
179
|
goto fail;
|
180
180
|
}
|