uringmachine 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +85 -0
  4. data/TODO.md +5 -0
  5. data/examples/echo_server.rb +18 -40
  6. data/examples/inout.rb +19 -0
  7. data/examples/nc.rb +36 -0
  8. data/ext/um/extconf.rb +6 -15
  9. data/ext/um/um.c +245 -53
  10. data/ext/um/um.h +21 -9
  11. data/ext/um/um_class.c +74 -87
  12. data/ext/um/um_const.c +184 -0
  13. data/ext/um/um_op.c +10 -13
  14. data/ext/um/um_utils.c +48 -3
  15. data/lib/uringmachine/version.rb +1 -1
  16. data/lib/uringmachine.rb +12 -0
  17. data/test/helper.rb +8 -0
  18. data/test/test_um.rb +227 -7
  19. data/vendor/liburing/.github/workflows/build.yml +29 -1
  20. data/vendor/liburing/.gitignore +1 -0
  21. data/vendor/liburing/CHANGELOG +15 -0
  22. data/vendor/liburing/CONTRIBUTING.md +165 -0
  23. data/vendor/liburing/configure +32 -0
  24. data/vendor/liburing/examples/Makefile +8 -1
  25. data/vendor/liburing/examples/kdigest.c +405 -0
  26. data/vendor/liburing/examples/proxy.c +75 -8
  27. data/vendor/liburing/liburing.pc.in +1 -1
  28. data/vendor/liburing/src/Makefile +16 -2
  29. data/vendor/liburing/src/include/liburing/io_uring.h +31 -0
  30. data/vendor/liburing/src/include/liburing/sanitize.h +39 -0
  31. data/vendor/liburing/src/include/liburing.h +31 -4
  32. data/vendor/liburing/src/liburing-ffi.map +5 -0
  33. data/vendor/liburing/src/liburing.map +1 -0
  34. data/vendor/liburing/src/queue.c +3 -0
  35. data/vendor/liburing/src/register.c +36 -0
  36. data/vendor/liburing/src/sanitize.c +176 -0
  37. data/vendor/liburing/src/setup.c +1 -1
  38. data/vendor/liburing/test/35fa71a030ca.c +7 -0
  39. data/vendor/liburing/test/500f9fbadef8.c +2 -0
  40. data/vendor/liburing/test/7ad0e4b2f83c.c +0 -25
  41. data/vendor/liburing/test/917257daa0fe.c +7 -0
  42. data/vendor/liburing/test/Makefile +31 -4
  43. data/vendor/liburing/test/a0908ae19763.c +7 -0
  44. data/vendor/liburing/test/a4c0b3decb33.c +7 -0
  45. data/vendor/liburing/test/accept.c +14 -4
  46. data/vendor/liburing/test/b19062a56726.c +7 -0
  47. data/vendor/liburing/test/bind-listen.c +2 -2
  48. data/vendor/liburing/test/buf-ring-nommap.c +10 -3
  49. data/vendor/liburing/test/buf-ring.c +2 -0
  50. data/vendor/liburing/test/coredump.c +7 -0
  51. data/vendor/liburing/test/cq-overflow.c +13 -1
  52. data/vendor/liburing/test/d4ae271dfaae.c +11 -3
  53. data/vendor/liburing/test/defer-taskrun.c +2 -2
  54. data/vendor/liburing/test/defer-tw-timeout.c +4 -1
  55. data/vendor/liburing/test/defer.c +2 -2
  56. data/vendor/liburing/test/double-poll-crash.c +1 -1
  57. data/vendor/liburing/test/eeed8b54e0df.c +2 -0
  58. data/vendor/liburing/test/eventfd.c +0 -1
  59. data/vendor/liburing/test/exit-no-cleanup.c +11 -0
  60. data/vendor/liburing/test/fadvise.c +9 -26
  61. data/vendor/liburing/test/fdinfo.c +9 -1
  62. data/vendor/liburing/test/file-register.c +14 -2
  63. data/vendor/liburing/test/file-update.c +1 -1
  64. data/vendor/liburing/test/file-verify.c +27 -16
  65. data/vendor/liburing/test/files-exit-hang-timeout.c +1 -2
  66. data/vendor/liburing/test/fixed-buf-iter.c +3 -1
  67. data/vendor/liburing/test/fixed-hugepage.c +12 -1
  68. data/vendor/liburing/test/fsnotify.c +1 -0
  69. data/vendor/liburing/test/futex.c +16 -4
  70. data/vendor/liburing/test/helpers.c +47 -0
  71. data/vendor/liburing/test/helpers.h +6 -0
  72. data/vendor/liburing/test/init-mem.c +5 -3
  73. data/vendor/liburing/test/io-cancel.c +0 -24
  74. data/vendor/liburing/test/io_uring_passthrough.c +2 -0
  75. data/vendor/liburing/test/io_uring_register.c +25 -6
  76. data/vendor/liburing/test/iopoll-leak.c +4 -0
  77. data/vendor/liburing/test/iopoll-overflow.c +1 -1
  78. data/vendor/liburing/test/iopoll.c +3 -3
  79. data/vendor/liburing/test/kallsyms.c +203 -0
  80. data/vendor/liburing/test/link-timeout.c +159 -0
  81. data/vendor/liburing/test/linked-defer-close.c +224 -0
  82. data/vendor/liburing/test/madvise.c +12 -25
  83. data/vendor/liburing/test/min-timeout-wait.c +0 -25
  84. data/vendor/liburing/test/min-timeout.c +0 -25
  85. data/vendor/liburing/test/mkdir.c +6 -0
  86. data/vendor/liburing/test/msg-ring.c +8 -2
  87. data/vendor/liburing/test/napi-test.c +15 -2
  88. data/vendor/liburing/test/no-mmap-inval.c +2 -0
  89. data/vendor/liburing/test/nop.c +44 -0
  90. data/vendor/liburing/test/ooo-file-unreg.c +1 -1
  91. data/vendor/liburing/test/open-close.c +40 -0
  92. data/vendor/liburing/test/openat2.c +37 -14
  93. data/vendor/liburing/test/poll-many.c +13 -7
  94. data/vendor/liburing/test/poll-mshot-update.c +17 -10
  95. data/vendor/liburing/test/poll-v-poll.c +6 -3
  96. data/vendor/liburing/test/pollfree.c +148 -0
  97. data/vendor/liburing/test/read-mshot-empty.c +156 -153
  98. data/vendor/liburing/test/read-mshot.c +276 -27
  99. data/vendor/liburing/test/read-write.c +78 -13
  100. data/vendor/liburing/test/recv-msgall-stream.c +3 -0
  101. data/vendor/liburing/test/recv-msgall.c +5 -0
  102. data/vendor/liburing/test/recvsend_bundle-inc.c +680 -0
  103. data/vendor/liburing/test/recvsend_bundle.c +92 -29
  104. data/vendor/liburing/test/reg-fd-only.c +14 -4
  105. data/vendor/liburing/test/regbuf-clone.c +187 -0
  106. data/vendor/liburing/test/regbuf-merge.c +7 -0
  107. data/vendor/liburing/test/register-restrictions.c +86 -85
  108. data/vendor/liburing/test/rename.c +59 -1
  109. data/vendor/liburing/test/ringbuf-read.c +5 -0
  110. data/vendor/liburing/test/ringbuf-status.c +5 -1
  111. data/vendor/liburing/test/runtests.sh +16 -1
  112. data/vendor/liburing/test/send-zerocopy.c +59 -0
  113. data/vendor/liburing/test/short-read.c +1 -0
  114. data/vendor/liburing/test/socket.c +43 -0
  115. data/vendor/liburing/test/splice.c +3 -1
  116. data/vendor/liburing/test/sq-poll-dup.c +1 -1
  117. data/vendor/liburing/test/sq-poll-share.c +2 -0
  118. data/vendor/liburing/test/sqpoll-disable-exit.c +8 -0
  119. data/vendor/liburing/test/sqpoll-exit-hang.c +1 -25
  120. data/vendor/liburing/test/sqpoll-sleep.c +1 -25
  121. data/vendor/liburing/test/statx.c +89 -0
  122. data/vendor/liburing/test/stdout.c +2 -0
  123. data/vendor/liburing/test/submit-and-wait.c +1 -25
  124. data/vendor/liburing/test/submit-reuse.c +4 -26
  125. data/vendor/liburing/test/symlink.c +12 -1
  126. data/vendor/liburing/test/sync-cancel.c +48 -21
  127. data/vendor/liburing/test/thread-exit.c +5 -0
  128. data/vendor/liburing/test/timeout-new.c +1 -26
  129. data/vendor/liburing/test/timeout.c +12 -26
  130. data/vendor/liburing/test/unlink.c +94 -1
  131. data/vendor/liburing/test/uring_cmd_ublk.c +1252 -0
  132. data/vendor/liburing/test/waitid.c +62 -8
  133. data/vendor/liburing/test/wq-aff.c +35 -0
  134. data/vendor/liburing/test/xfail_prep_link_timeout_out_of_scope.c +46 -0
  135. data/vendor/liburing/test/xfail_register_buffers_out_of_scope.c +51 -0
  136. metadata +17 -4
  137. data/examples/event_loop.rb +0 -69
  138. data/examples/fibers.rb +0 -105
@@ -114,9 +114,12 @@ run_test()
114
114
  elif [ "$status" -eq 77 ]; then
115
115
  echo "Skipped"
116
116
  SKIPPED+=("<$test_string>")
117
- elif [ "$status" -ne 0 ]; then
117
+ elif [[ $test_string != xfail* ]] && [ "$status" -ne 0 ]; then
118
118
  echo "Test $test_name failed with ret $status"
119
119
  FAILED+=("<$test_string>")
120
+ elif [[ $test_string == xfail* ]] && [ "$status" -ne 1 ]; then
121
+ echo "Test $test_name expected fail status 1 but returned $status"
122
+ FAILED+=("<$test_string>")
120
123
  elif ! _check_dmesg "$dmesg_marker" "$test_name"; then
121
124
  echo "Test $test_name failed dmesg check"
122
125
  FAILED+=("<$test_string>")
@@ -153,10 +156,22 @@ for tst in "${TESTS[@]}"; do
153
156
  fi
154
157
  done
155
158
 
159
+ if [ "$DO_KMSG" -eq "1" ]; then
160
+ for dmesg_file in *.dmesg; do
161
+ if [ -f "$dmesg_file" ]; then
162
+ echo "Found dmesg file $dmesg_file, outputting:"
163
+ cat "$dmesg_file"
164
+ fi
165
+ done
166
+ fi
167
+
156
168
  if [ "${#TIMED_OUT[*]}" -ne 0 ]; then
157
169
  echo "Tests timed out (${#TIMED_OUT[*]}): ${TIMED_OUT[*]}"
158
170
  fi
159
171
 
172
+ KVER=$(uname -rv)
173
+ echo "Test run complete, kernel: $KVER"
174
+
160
175
  if [ "${#FAILED[*]}" -ne 0 ]; then
161
176
  echo "Tests failed (${#FAILED[*]}): ${FAILED[*]}"
162
177
  exit 1
@@ -739,6 +739,59 @@ static int test_async_addr(struct io_uring *ring)
739
739
  return 0;
740
740
  }
741
741
 
742
+ static int test_sendzc_report(struct io_uring *ring)
743
+ {
744
+ struct io_uring_sqe *sqe;
745
+ struct io_uring_cqe *cqe;
746
+ struct sockaddr_storage addr;
747
+ int sock_tx, sock_rx;
748
+ int ret;
749
+
750
+ ret = create_socketpair_ip(&addr, &sock_tx, &sock_rx, true, true, false, true);
751
+ if (ret) {
752
+ fprintf(stderr, "sock prep failed %d\n", ret);
753
+ return 1;
754
+ }
755
+
756
+ sqe = io_uring_get_sqe(ring);
757
+ io_uring_prep_send_zc(sqe, sock_tx, tx_buffer, 1, 0,
758
+ IORING_SEND_ZC_REPORT_USAGE);
759
+ ret = io_uring_submit(ring);
760
+ if (ret != 1) {
761
+ fprintf(stderr, "io_uring_submit failed %i\n", ret);
762
+ return 1;
763
+ }
764
+ ret = io_uring_wait_cqe(ring, &cqe);
765
+ if (ret) {
766
+ fprintf(stderr, "io_uring_wait_cqe failed %i\n", ret);
767
+ return 1;
768
+ }
769
+ if (cqe->res != 1 && cqe->res != -EINVAL) {
770
+ fprintf(stderr, "sendzc report failed %u\n", cqe->res);
771
+ return 1;
772
+ }
773
+ if (!(cqe->flags & IORING_CQE_F_MORE)) {
774
+ fprintf(stderr, "expected notification %i\n", cqe->res);
775
+ return 1;
776
+ }
777
+ io_uring_cqe_seen(ring, cqe);
778
+
779
+ ret = io_uring_wait_cqe(ring, &cqe);
780
+ if (ret) {
781
+ fprintf(stderr, "io_uring_wait_cqe failed %i\n", ret);
782
+ return 1;
783
+ }
784
+ if (cqe->flags & IORING_CQE_F_MORE) {
785
+ fprintf(stderr, "F_MORE after notification\n");
786
+ return 1;
787
+ }
788
+ io_uring_cqe_seen(ring, cqe);
789
+
790
+ close(sock_tx);
791
+ close(sock_rx);
792
+ return 0;
793
+ }
794
+
742
795
  /* see also send_recv.c:test_invalid */
743
796
  static int test_invalid_zc(int fds[2])
744
797
  {
@@ -833,6 +886,12 @@ static int run_basic_tests(void)
833
886
  return T_EXIT_FAIL;
834
887
  }
835
888
 
889
+ ret = test_sendzc_report(&ring);
890
+ if (ret) {
891
+ fprintf(stderr, "test_sendzc_report() failed\n");
892
+ return T_EXIT_FAIL;
893
+ }
894
+
836
895
  io_uring_queue_exit(&ring);
837
896
  }
838
897
 
@@ -71,5 +71,6 @@ int main(int argc, char *argv[])
71
71
  }
72
72
 
73
73
  io_uring_cqe_seen(&ring, cqe);
74
+ free(vec.iov_base);
74
75
  return 0;
75
76
  }
@@ -365,6 +365,43 @@ static int test(int use_sqthread, int regfiles, int socket_direct, int alloc)
365
365
  return (intptr_t)retval;
366
366
  }
367
367
 
368
+ static int test_bad_socket(void)
369
+ {
370
+ struct io_uring ring;
371
+ struct io_uring_cqe *cqe;
372
+ struct io_uring_sqe *sqe;
373
+ int ret;
374
+
375
+ ret = io_uring_queue_init(1, &ring, 0);
376
+ if (ret) {
377
+ fprintf(stderr, "queue init failed: %d\n", ret);
378
+ return 1;
379
+ }
380
+
381
+ sqe = io_uring_get_sqe(&ring);
382
+ io_uring_prep_socket(sqe, -1, SOCK_DGRAM, 0, 0);
383
+ ret = io_uring_submit(&ring);
384
+ if (ret != 1) {
385
+ fprintf(stderr, "socket submit: %d\n", ret);
386
+ goto err;
387
+ }
388
+ ret = io_uring_wait_cqe(&ring, &cqe);
389
+ if (ret) {
390
+ fprintf(stderr, "wait_cqe: %d\n", ret);
391
+ goto err;
392
+ }
393
+ if (cqe->res != -EAFNOSUPPORT) {
394
+ fprintf(stderr, "socket res: %d\n", cqe->res);
395
+ goto err;
396
+ }
397
+ io_uring_cqe_seen(&ring, cqe);
398
+ io_uring_queue_exit(&ring);
399
+ return 0;
400
+ err:
401
+ io_uring_queue_exit(&ring);
402
+ return 1;
403
+ }
404
+
368
405
  int main(int argc, char *argv[])
369
406
  {
370
407
  int ret;
@@ -404,5 +441,11 @@ int main(int argc, char *argv[])
404
441
  return ret;
405
442
  }
406
443
 
444
+ ret = test_bad_socket();
445
+ if (ret) {
446
+ fprintf(stderr, "test bad socket failed\n");
447
+ return 1;
448
+ }
449
+
407
450
  return 0;
408
451
  }
@@ -191,7 +191,7 @@ static int do_splice(struct io_uring *ring,
191
191
  IORING_OP_SPLICE);
192
192
  }
193
193
 
194
- static int do_tee(struct io_uring *ring, int fd_in, int fd_out,
194
+ static int do_tee(struct io_uring *ring, int fd_in, int fd_out,
195
195
  unsigned int len)
196
196
  {
197
197
  return do_splice_op(ring, fd_in, 0, fd_out, 0, len, IORING_OP_TEE);
@@ -504,6 +504,8 @@ int main(int argc, char *argv[])
504
504
  splice_flags = SPLICE_F_FD_IN_FIXED;
505
505
  sqe_flags = IOSQE_FIXED_FILE;
506
506
  ret = test_splice(&ring, &ctx);
507
+ free(ctx.buf_in);
508
+ free(ctx.buf_out);
507
509
  if (ret) {
508
510
  fprintf(stderr, "registered fds splice tests failed\n");
509
511
  return ret;
@@ -177,7 +177,7 @@ int main(int argc, char *argv[])
177
177
  if (fname != argv[1])
178
178
  unlink(fname);
179
179
 
180
- if (__e == EINVAL)
180
+ if (__e == EINVAL || __e == EPERM || __e == EACCES)
181
181
  return T_EXIT_SKIP;
182
182
  perror("open");
183
183
  return -1;
@@ -90,6 +90,8 @@ int main(int argc, char *argv[])
90
90
 
91
91
  fd = open(fname, O_RDONLY | O_DIRECT);
92
92
  if (fd < 0) {
93
+ if (errno == EPERM || errno == EACCES || errno == EINVAL)
94
+ return T_EXIT_SKIP;
93
95
  perror("open");
94
96
  return -1;
95
97
  }
@@ -22,8 +22,10 @@
22
22
  #include <unistd.h>
23
23
 
24
24
  #include "liburing.h"
25
+ #include "helpers.h"
25
26
  #include "../src/syscall.h"
26
27
 
28
+ #ifndef CONFIG_USE_SANITIZER
27
29
  static void sleep_ms(uint64_t ms)
28
30
  {
29
31
  usleep(ms * 1000);
@@ -194,3 +196,9 @@ int main(void)
194
196
  loop();
195
197
  return 0;
196
198
  }
199
+ #else
200
+ int main(int argc, char *argv[])
201
+ {
202
+ return T_EXIT_SKIP;
203
+ }
204
+ #endif
@@ -10,31 +10,7 @@
10
10
  #include <sys/time.h>
11
11
  #include <poll.h>
12
12
  #include "liburing.h"
13
-
14
- static unsigned long long mtime_since(const struct timeval *s,
15
- const struct timeval *e)
16
- {
17
- long long sec, usec;
18
-
19
- sec = e->tv_sec - s->tv_sec;
20
- usec = (e->tv_usec - s->tv_usec);
21
- if (sec > 0 && usec < 0) {
22
- sec--;
23
- usec += 1000000;
24
- }
25
-
26
- sec *= 1000;
27
- usec /= 1000;
28
- return sec + usec;
29
- }
30
-
31
- static unsigned long long mtime_since_now(struct timeval *tv)
32
- {
33
- struct timeval end;
34
-
35
- gettimeofday(&end, NULL);
36
- return mtime_since(tv, &end);
37
- }
13
+ #include "helpers.h"
38
14
 
39
15
  int main(int argc, char *argv[])
40
16
  {
@@ -9,31 +9,7 @@
9
9
  #include <unistd.h>
10
10
  #include <sys/time.h>
11
11
  #include "liburing.h"
12
-
13
- static unsigned long long mtime_since(const struct timeval *s,
14
- const struct timeval *e)
15
- {
16
- long long sec, usec;
17
-
18
- sec = e->tv_sec - s->tv_sec;
19
- usec = (e->tv_usec - s->tv_usec);
20
- if (sec > 0 && usec < 0) {
21
- sec--;
22
- usec += 1000000;
23
- }
24
-
25
- sec *= 1000;
26
- usec /= 1000;
27
- return sec + usec;
28
- }
29
-
30
- static unsigned long long mtime_since_now(struct timeval *tv)
31
- {
32
- struct timeval end;
33
-
34
- gettimeofday(&end, NULL);
35
- return mtime_since(tv, &end);
36
- }
12
+ #include "helpers.h"
37
13
 
38
14
  int main(int argc, char *argv[])
39
15
  {
@@ -36,6 +36,81 @@ static int statx_syscall_supported(void)
36
36
  return errno == ENOSYS ? 0 : -1;
37
37
  }
38
38
 
39
+ static int test_statx_invalid_buf(struct io_uring *ring, const char *path)
40
+ {
41
+ struct io_uring_cqe *cqe;
42
+ struct io_uring_sqe *sqe;
43
+ struct statx *x = (struct statx *) (uintptr_t) 0x1234;
44
+ int ret;
45
+
46
+ sqe = io_uring_get_sqe(ring);
47
+ if (!sqe) {
48
+ fprintf(stderr, "get sqe failed\n");
49
+ goto err;
50
+ }
51
+ io_uring_prep_statx(sqe, -1, path, 0, STATX_ALL, x);
52
+
53
+ ret = io_uring_submit(ring);
54
+ if (ret <= 0) {
55
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
56
+ goto err;
57
+ }
58
+
59
+ ret = io_uring_wait_cqe(ring, &cqe);
60
+ if (ret < 0) {
61
+ fprintf(stderr, "wait completion %d\n", ret);
62
+ goto err;
63
+ }
64
+ ret = cqe->res;
65
+ io_uring_cqe_seen(ring, cqe);
66
+ if (ret != -EFAULT) {
67
+ fprintf(stderr, "Invalid address didn't fail\n");
68
+ goto err;
69
+ }
70
+
71
+ return 0;
72
+ err:
73
+ return -1;
74
+ }
75
+
76
+ static int test_statx_invalid_path(struct io_uring *ring)
77
+ {
78
+ const char *path = (const char *) (uintptr_t) 0x1234;
79
+ struct io_uring_cqe *cqe;
80
+ struct io_uring_sqe *sqe;
81
+ struct statx x1 = { };
82
+ int ret;
83
+
84
+ sqe = io_uring_get_sqe(ring);
85
+ if (!sqe) {
86
+ fprintf(stderr, "get sqe failed\n");
87
+ goto err;
88
+ }
89
+ io_uring_prep_statx(sqe, -1, path, 0, STATX_ALL, &x1);
90
+
91
+ ret = io_uring_submit(ring);
92
+ if (ret <= 0) {
93
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
94
+ goto err;
95
+ }
96
+
97
+ ret = io_uring_wait_cqe(ring, &cqe);
98
+ if (ret < 0) {
99
+ fprintf(stderr, "wait completion %d\n", ret);
100
+ goto err;
101
+ }
102
+ ret = cqe->res;
103
+ io_uring_cqe_seen(ring, cqe);
104
+ if (ret != -EFAULT) {
105
+ fprintf(stderr, "Invalid address didn't fail\n");
106
+ goto err;
107
+ }
108
+
109
+ return 0;
110
+ err:
111
+ return -1;
112
+ }
113
+
39
114
  static int test_statx(struct io_uring *ring, const char *path)
40
115
  {
41
116
  struct io_uring_cqe *cqe;
@@ -86,6 +161,8 @@ static int test_statx_fd(struct io_uring *ring, const char *path)
86
161
 
87
162
  fd = open(path, O_RDONLY);
88
163
  if (fd < 0) {
164
+ if (errno == EPERM || errno == EACCES)
165
+ return 0;
89
166
  perror("open");
90
167
  return 1;
91
168
  }
@@ -156,6 +233,18 @@ int main(int argc, char *argv[])
156
233
  goto err;
157
234
  }
158
235
 
236
+ ret = test_statx_invalid_path(&ring);
237
+ if (ret) {
238
+ fprintf(stderr, "test_statx_invalid_path failed: %d\n", ret);
239
+ goto err;
240
+ }
241
+
242
+ ret = test_statx_invalid_buf(&ring, fname);
243
+ if (ret) {
244
+ fprintf(stderr, "test_statx_invalid_buf failed: %d\n", ret);
245
+ goto err;
246
+ }
247
+
159
248
  ret = test_statx_fd(&ring, fname);
160
249
  if (ret) {
161
250
  fprintf(stderr, "test_statx_fd failed: %d\n", ret);
@@ -89,6 +89,7 @@ static int test_pipe_io_fixed(struct io_uring *ring)
89
89
  io_uring_cqe_seen(ring, cqe);
90
90
  }
91
91
  io_uring_unregister_buffers(ring);
92
+ free(vecs[0].iov_base);
92
93
  return 0;
93
94
  err:
94
95
  return 1;
@@ -143,6 +144,7 @@ static int test_stdout_io_fixed(struct io_uring *ring)
143
144
  }
144
145
  io_uring_cqe_seen(ring, cqe);
145
146
  io_uring_unregister_buffers(ring);
147
+ free(vecs.iov_base);
146
148
  return 0;
147
149
  err:
148
150
  return 1;
@@ -13,33 +13,9 @@
13
13
  #include <sys/time.h>
14
14
 
15
15
  #include "liburing.h"
16
+ #include "helpers.h"
16
17
  #include "test.h"
17
18
 
18
- static unsigned long long mtime_since(const struct timeval *s,
19
- const struct timeval *e)
20
- {
21
- long long sec, usec;
22
-
23
- sec = e->tv_sec - s->tv_sec;
24
- usec = (e->tv_usec - s->tv_usec);
25
- if (sec > 0 && usec < 0) {
26
- sec--;
27
- usec += 1000000;
28
- }
29
-
30
- sec *= 1000;
31
- usec /= 1000;
32
- return sec + usec;
33
- }
34
-
35
- static unsigned long long mtime_since_now(struct timeval *tv)
36
- {
37
- struct timeval end;
38
-
39
- gettimeofday(&end, NULL);
40
- return mtime_since(tv, &end);
41
- }
42
-
43
19
  static int test(struct io_uring *ring)
44
20
  {
45
21
  struct io_uring_cqe *cqe;
@@ -102,31 +102,6 @@ static int wait_nr(int nr)
102
102
  return 0;
103
103
  }
104
104
 
105
- static unsigned long long mtime_since(const struct timeval *s,
106
- const struct timeval *e)
107
- {
108
- long long sec, usec;
109
-
110
- sec = e->tv_sec - s->tv_sec;
111
- usec = (e->tv_usec - s->tv_usec);
112
- if (sec > 0 && usec < 0) {
113
- sec--;
114
- usec += 1000000;
115
- }
116
-
117
- sec *= 1000;
118
- usec /= 1000;
119
- return sec + usec;
120
- }
121
-
122
- static unsigned long long mtime_since_now(struct timeval *tv)
123
- {
124
- struct timeval end;
125
-
126
- gettimeofday(&end, NULL);
127
- return mtime_since(tv, &end);
128
- }
129
-
130
105
  static int test_reuse(int argc, char *argv[], int split, int async)
131
106
  {
132
107
  struct thread_data data;
@@ -162,6 +137,8 @@ static int test_reuse(int argc, char *argv[], int split, int async)
162
137
  if (do_unlink)
163
138
  unlink(fname1);
164
139
  if (fd1 < 0) {
140
+ if (errno == EPERM || errno == EACCES)
141
+ return T_EXIT_SKIP;
165
142
  perror("open fname1");
166
143
  goto err;
167
144
  }
@@ -211,7 +188,6 @@ static int test_reuse(int argc, char *argv[], int split, int async)
211
188
  err:
212
189
  io_uring_queue_exit(&ring);
213
190
  return 1;
214
-
215
191
  }
216
192
 
217
193
  int main(int argc, char *argv[])
@@ -225,6 +201,8 @@ int main(int argc, char *argv[])
225
201
  async = (i & 2) != 0;
226
202
 
227
203
  ret = test_reuse(argc, argv, split, async);
204
+ if (ret == T_EXIT_SKIP)
205
+ continue;
228
206
  if (ret) {
229
207
  fprintf(stderr, "test_reuse %d %d failed\n", split, async);
230
208
  return ret;
@@ -11,7 +11,6 @@
11
11
 
12
12
  #include "liburing.h"
13
13
 
14
-
15
14
  static int do_symlinkat(struct io_uring *ring, const char *oldname, const char *newname)
16
15
  {
17
16
  int ret;
@@ -105,6 +104,18 @@ int main(int argc, char *argv[])
105
104
  goto err1;
106
105
  }
107
106
 
107
+ ret = do_symlinkat(&ring, target, (const char *) (uintptr_t) 0x1234);
108
+ if (ret != -EFAULT) {
109
+ fprintf(stderr, "test_symlinkat bad target failed: %d\n", ret);
110
+ goto err1;
111
+ }
112
+
113
+ ret = do_symlinkat(&ring, (const char *) (uintptr_t) 0x1234, target);
114
+ if (ret != -EFAULT) {
115
+ fprintf(stderr, "test_symlinkat bad source failed: %d\n", ret);
116
+ goto err1;
117
+ }
118
+
108
119
  out:
109
120
  unlinkat(AT_FDCWD, linkname, 0);
110
121
  io_uring_queue_exit(&ring);
@@ -15,7 +15,7 @@
15
15
 
16
16
  static int no_sync_cancel;
17
17
 
18
- static int test_sync_cancel_timeout(struct io_uring *ring, int async)
18
+ static int test_sync_cancel_timeout(struct io_uring *ring, int async, int by_op)
19
19
  {
20
20
  struct io_uring_sync_cancel_reg reg = { };
21
21
  struct io_uring_sqe *sqe;
@@ -43,7 +43,8 @@ static int test_sync_cancel_timeout(struct io_uring *ring, int async)
43
43
 
44
44
  usleep(10000);
45
45
 
46
- reg.addr = 0x89;
46
+ reg.flags = IORING_ASYNC_CANCEL_OP;
47
+ reg.opcode = IORING_OP_READ;
47
48
  reg.timeout.tv_nsec = 1;
48
49
  ret = io_uring_register_sync_cancel(ring, &reg);
49
50
  if (async) {
@@ -80,7 +81,7 @@ static int test_sync_cancel_timeout(struct io_uring *ring, int async)
80
81
  }
81
82
 
82
83
  static int test_sync_cancel(struct io_uring *ring, int async, int nr_all,
83
- int use_fd)
84
+ int use_fd, int by_op)
84
85
  {
85
86
  struct io_uring_sync_cancel_reg reg = { };
86
87
  struct io_uring_sqe *sqe;
@@ -168,7 +169,7 @@ int main(int argc, char *argv[])
168
169
  else if (ret != T_SETUP_OK)
169
170
  return ret;
170
171
 
171
- ret = test_sync_cancel(&ring, 0, 0, 0);
172
+ ret = test_sync_cancel(&ring, 0, 0, 0, 0);
172
173
  if (ret) {
173
174
  fprintf(stderr, "test_sync_cancel 0 0 0 failed\n");
174
175
  return T_EXIT_FAIL;
@@ -176,56 +177,82 @@ int main(int argc, char *argv[])
176
177
  if (no_sync_cancel)
177
178
  return T_EXIT_SKIP;
178
179
 
179
- ret = test_sync_cancel(&ring, 1, 0, 0);
180
+ ret = test_sync_cancel(&ring, 0, 0, 0, 1);
180
181
  if (ret) {
181
- fprintf(stderr, "test_sync_cancel 1 0 0 failed\n");
182
+ fprintf(stderr, "test_sync_cancel 0 0 1 failed\n");
182
183
  return T_EXIT_FAIL;
183
184
  }
184
185
 
185
- ret = test_sync_cancel(&ring, 0, 1, 0);
186
+ ret = test_sync_cancel(&ring, 1, 0, 0, 0);
186
187
  if (ret) {
187
- fprintf(stderr, "test_sync_cancel 0 1 0 failed\n");
188
+ fprintf(stderr, "test_sync_cancel 1 0 0 0 failed\n");
188
189
  return T_EXIT_FAIL;
189
190
  }
190
191
 
191
- ret = test_sync_cancel(&ring, 1, 1, 0);
192
+ ret = test_sync_cancel(&ring, 1, 0, 0, 1);
192
193
  if (ret) {
193
- fprintf(stderr, "test_sync_cancel 1 1 0 failed\n");
194
+ fprintf(stderr, "test_sync_cancel 1 0 0 1 failed\n");
194
195
  return T_EXIT_FAIL;
195
196
  }
196
197
 
197
- ret = test_sync_cancel(&ring, 0, 0, 1);
198
+
199
+ ret = test_sync_cancel(&ring, 0, 1, 0, 0);
198
200
  if (ret) {
199
- fprintf(stderr, "test_sync_cancel 0 0 1 failed\n");
201
+ fprintf(stderr, "test_sync_cancel 0 1 0 0 failed\n");
202
+ return T_EXIT_FAIL;
203
+ }
204
+
205
+ ret = test_sync_cancel(&ring, 0, 1, 0, 1);
206
+ if (ret) {
207
+ fprintf(stderr, "test_sync_cancel 0 1 0 1 failed\n");
208
+ return T_EXIT_FAIL;
209
+ }
210
+
211
+
212
+ ret = test_sync_cancel(&ring, 1, 1, 0, 0);
213
+ if (ret) {
214
+ fprintf(stderr, "test_sync_cancel 1 1 0 0 failed\n");
215
+ return T_EXIT_FAIL;
216
+ }
217
+
218
+ ret = test_sync_cancel(&ring, 0, 0, 1, 0);
219
+ if (ret) {
220
+ fprintf(stderr, "test_sync_cancel 0 0 1 0 failed\n");
221
+ return T_EXIT_FAIL;
222
+ }
223
+
224
+ ret = test_sync_cancel(&ring, 1, 0, 1, 0);
225
+ if (ret) {
226
+ fprintf(stderr, "test_sync_cancel 1 0 1 0 failed\n");
200
227
  return T_EXIT_FAIL;
201
228
  }
202
229
 
203
- ret = test_sync_cancel(&ring, 1, 0, 1);
230
+ ret = test_sync_cancel(&ring, 0, 1, 1, 0);
204
231
  if (ret) {
205
- fprintf(stderr, "test_sync_cancel 1 0 1 failed\n");
232
+ fprintf(stderr, "test_sync_cancel 0 1 1 0 failed\n");
206
233
  return T_EXIT_FAIL;
207
234
  }
208
235
 
209
- ret = test_sync_cancel(&ring, 0, 1, 1);
236
+ ret = test_sync_cancel(&ring, 1, 1, 1, 0);
210
237
  if (ret) {
211
- fprintf(stderr, "test_sync_cancel 0 1 1 failed\n");
238
+ fprintf(stderr, "test_sync_cancel 1 1 1 0 failed\n");
212
239
  return T_EXIT_FAIL;
213
240
  }
214
241
 
215
- ret = test_sync_cancel(&ring, 1, 1, 1);
242
+ ret = test_sync_cancel_timeout(&ring, 0, 0);
216
243
  if (ret) {
217
- fprintf(stderr, "test_sync_cancel 1 1 1 failed\n");
244
+ fprintf(stderr, "test_sync_cancel_timeout 0 0\n");
218
245
  return T_EXIT_FAIL;
219
246
  }
220
247
 
221
- ret = test_sync_cancel_timeout(&ring, 0);
248
+ ret = test_sync_cancel_timeout(&ring, 0, 1);
222
249
  if (ret) {
223
- fprintf(stderr, "test_sync_cancel_timeout 0\n");
250
+ fprintf(stderr, "test_sync_cancel_timeout 0 1\n");
224
251
  return T_EXIT_FAIL;
225
252
  }
226
253
 
227
254
  /* must be last, leaves request */
228
- ret = test_sync_cancel_timeout(&ring, 1);
255
+ ret = test_sync_cancel_timeout(&ring, 1, 0);
229
256
  if (ret) {
230
257
  fprintf(stderr, "test_sync_cancel_timeout 1\n");
231
258
  return T_EXIT_FAIL;
@@ -102,6 +102,8 @@ int main(int argc, char *argv[])
102
102
  if (do_unlink)
103
103
  unlink(fname);
104
104
  if (fd < 0) {
105
+ if (errno == EPERM || errno == EACCES)
106
+ goto skip;
105
107
  perror("open");
106
108
  return 1;
107
109
  }
@@ -140,4 +142,7 @@ int main(int argc, char *argv[])
140
142
  err:
141
143
  free_g_buf();
142
144
  return 1;
145
+ skip:
146
+ free_g_buf();
147
+ return T_EXIT_SKIP;
143
148
  }