uringmachine 0.2 → 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 +15 -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 +340 -53
  10. data/ext/um/um.h +33 -11
  11. data/ext/um/um_class.c +101 -119
  12. data/ext/um/um_const.c +184 -0
  13. data/ext/um/um_op.c +39 -18
  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 +13 -12
  18. data/test/test_um.rb +301 -3
  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
@@ -8,6 +8,7 @@
8
8
  #include <unistd.h>
9
9
  #include <pthread.h>
10
10
  #include "liburing.h"
11
+ #include "helpers.h"
11
12
 
12
13
  #define TIMEOUT_MSEC 200
13
14
  #define TIMEOUT_SEC 10
@@ -22,32 +23,6 @@ static void msec_to_ts(struct __kernel_timespec *ts, unsigned int msec)
22
23
  ts->tv_nsec = (msec % 1000) * 1000000;
23
24
  }
24
25
 
25
- static unsigned long long mtime_since(const struct timeval *s,
26
- const struct timeval *e)
27
- {
28
- long long sec, usec;
29
-
30
- sec = e->tv_sec - s->tv_sec;
31
- usec = (e->tv_usec - s->tv_usec);
32
- if (sec > 0 && usec < 0) {
33
- sec--;
34
- usec += 1000000;
35
- }
36
-
37
- sec *= 1000;
38
- usec /= 1000;
39
- return sec + usec;
40
- }
41
-
42
- static unsigned long long mtime_since_now(struct timeval *tv)
43
- {
44
- struct timeval end;
45
-
46
- gettimeofday(&end, NULL);
47
- return mtime_since(tv, &end);
48
- }
49
-
50
-
51
26
  static int test_return_before_timeout(struct io_uring *ring)
52
27
  {
53
28
  struct io_uring_cqe *cqe;
@@ -29,31 +29,6 @@ static void msec_to_ts(struct __kernel_timespec *ts, unsigned int msec)
29
29
  ts->tv_nsec = (msec % 1000) * 1000000;
30
30
  }
31
31
 
32
- static unsigned long long mtime_since(const struct timeval *s,
33
- const struct timeval *e)
34
- {
35
- long long sec, usec;
36
-
37
- sec = e->tv_sec - s->tv_sec;
38
- usec = (e->tv_usec - s->tv_usec);
39
- if (sec > 0 && usec < 0) {
40
- sec--;
41
- usec += 1000000;
42
- }
43
-
44
- sec *= 1000;
45
- usec /= 1000;
46
- return sec + usec;
47
- }
48
-
49
- static unsigned long long mtime_since_now(struct timeval *tv)
50
- {
51
- struct timeval end;
52
-
53
- gettimeofday(&end, NULL);
54
- return mtime_since(tv, &end);
55
- }
56
-
57
32
  /*
58
33
  * Test that we return to userspace if a timeout triggers, even if we
59
34
  * don't satisfy the number of events asked for.
@@ -980,6 +955,7 @@ static int test_update_timeout(struct io_uring *ring, unsigned long ms,
980
955
  struct io_uring_cqe *cqe;
981
956
  struct __kernel_timespec ts, ts_upd;
982
957
  unsigned long long exp_ms, base_ms = 10000;
958
+ bool update_ealready = false;
983
959
  struct timeval tv;
984
960
  int ret, i, nr = 2;
985
961
  __u32 mode = abs ? IORING_TIMEOUT_ABS : 0;
@@ -1042,6 +1018,16 @@ static int test_update_timeout(struct io_uring *ring, unsigned long ms,
1042
1018
  }
1043
1019
  break;
1044
1020
  case 2:
1021
+ /*
1022
+ * We should not be hitting this case, but for
1023
+ * a kernel with PREEMPT_RT, even an instant attempt
1024
+ * to remove a timer will return that the timer is
1025
+ * already running... Deal with it.
1026
+ */
1027
+ if (cqe->res == -EALREADY) {
1028
+ update_ealready = true;
1029
+ break;
1030
+ }
1045
1031
  if (cqe->res != 0) {
1046
1032
  fprintf(stderr, "%s: got %d, wanted %d\n",
1047
1033
  __FUNCTION__, cqe->res,
@@ -1062,7 +1048,7 @@ static int test_update_timeout(struct io_uring *ring, unsigned long ms,
1062
1048
  }
1063
1049
 
1064
1050
  exp_ms = mtime_since_now(&tv);
1065
- if (exp_ms >= base_ms / 2) {
1051
+ if (!update_ealready && exp_ms >= base_ms / 2) {
1066
1052
  fprintf(stderr, "too long, timeout wasn't updated\n");
1067
1053
  goto err;
1068
1054
  }
@@ -13,6 +13,87 @@
13
13
 
14
14
  #include "liburing.h"
15
15
 
16
+ static int test_rmdir(struct io_uring *ring)
17
+ {
18
+ struct io_uring_cqe *cqe;
19
+ struct io_uring_sqe *sqe;
20
+ char buf[32];
21
+ int ret;
22
+
23
+ sprintf(buf, ".tmp.dir.%d", getpid());
24
+ if (mkdir(buf, 0755) < 0) {
25
+ perror("mkdir");
26
+ return 1;
27
+ }
28
+
29
+ sqe = io_uring_get_sqe(ring);
30
+ if (!sqe) {
31
+ fprintf(stderr, "get sqe failed\n");
32
+ goto err;
33
+ }
34
+ io_uring_prep_unlink(sqe, buf, AT_REMOVEDIR);
35
+
36
+ ret = io_uring_submit(ring);
37
+ if (ret <= 0) {
38
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
39
+ goto err;
40
+ }
41
+
42
+ ret = io_uring_wait_cqe(ring, &cqe);
43
+ if (ret < 0) {
44
+ fprintf(stderr, "wait completion %d\n", ret);
45
+ goto err;
46
+ }
47
+ ret = cqe->res;
48
+ io_uring_cqe_seen(ring, cqe);
49
+
50
+ if (!ret) {
51
+ struct stat sb;
52
+
53
+ if (!stat(buf, &sb)) {
54
+ fprintf(stderr, "dir unlinked but still there\n");
55
+ goto err;
56
+ }
57
+ }
58
+ unlink(buf);
59
+ return ret;
60
+ err:
61
+ unlink(buf);
62
+ return 1;
63
+ }
64
+
65
+ static int test_unlink_badaddr(struct io_uring *ring)
66
+ {
67
+ const char *old = (const char *) (uintptr_t) 0x1234;
68
+ struct io_uring_cqe *cqe;
69
+ struct io_uring_sqe *sqe;
70
+ int ret;
71
+
72
+ sqe = io_uring_get_sqe(ring);
73
+ if (!sqe) {
74
+ fprintf(stderr, "get sqe failed\n");
75
+ goto err;
76
+ }
77
+ io_uring_prep_unlink(sqe, old, 0);
78
+
79
+ ret = io_uring_submit(ring);
80
+ if (ret <= 0) {
81
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
82
+ goto err;
83
+ }
84
+
85
+ ret = io_uring_wait_cqe(ring, &cqe);
86
+ if (ret < 0) {
87
+ fprintf(stderr, "wait completion %d\n", ret);
88
+ goto err;
89
+ }
90
+ ret = cqe->res;
91
+ io_uring_cqe_seen(ring, cqe);
92
+ return ret;
93
+ err:
94
+ return 1;
95
+ }
96
+
16
97
  static int test_unlink(struct io_uring *ring, const char *old)
17
98
  {
18
99
  struct io_uring_cqe *cqe;
@@ -25,7 +106,7 @@ static int test_unlink(struct io_uring *ring, const char *old)
25
106
  goto err;
26
107
  }
27
108
  io_uring_prep_unlink(sqe, old, 0);
28
-
109
+
29
110
  ret = io_uring_submit(ring);
30
111
  if (ret <= 0) {
31
112
  fprintf(stderr, "sqe submit failed: %d\n", ret);
@@ -105,6 +186,18 @@ int main(int argc, char *argv[])
105
186
  return 1;
106
187
  }
107
188
 
189
+ ret = test_unlink_badaddr(&ring);
190
+ if (ret != -EFAULT) {
191
+ fprintf(stderr, "badaddr unlink got %s\n", strerror(-ret));
192
+ return 1;
193
+ }
194
+
195
+ ret = test_rmdir(&ring);
196
+ if (ret) {
197
+ fprintf(stderr, "rmdir failed: %s\n", strerror(-ret));
198
+ return 1;
199
+ }
200
+
108
201
  return 0;
109
202
  err:
110
203
  unlink(buf);