uringmachine 0.3 → 0.4
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/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
|
}
|