polyphony 0.85 → 0.86

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.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile.lock +1 -1
  4. data/ext/polyphony/io_extensions.c +2 -3
  5. data/lib/polyphony/version.rb +1 -1
  6. data/polyphony.gemspec +1 -1
  7. data/test/test_backend.rb +1 -1
  8. data/test/test_signal.rb +3 -3
  9. data/vendor/liburing/.github/pull_request_template.md +86 -0
  10. data/vendor/liburing/.github/workflows/build.yml +85 -0
  11. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  12. data/vendor/liburing/.gitignore +149 -0
  13. data/vendor/liburing/COPYING +502 -0
  14. data/vendor/liburing/COPYING.GPL +339 -0
  15. data/vendor/liburing/LICENSE +7 -0
  16. data/vendor/liburing/Makefile +82 -0
  17. data/vendor/liburing/Makefile.common +5 -0
  18. data/vendor/liburing/Makefile.quiet +11 -0
  19. data/vendor/liburing/README +46 -0
  20. data/vendor/liburing/configure +486 -0
  21. data/vendor/liburing/debian/README.Debian +7 -0
  22. data/vendor/liburing/debian/changelog +27 -0
  23. data/vendor/liburing/debian/compat +1 -0
  24. data/vendor/liburing/debian/control +48 -0
  25. data/vendor/liburing/debian/copyright +49 -0
  26. data/vendor/liburing/debian/liburing-dev.install +4 -0
  27. data/vendor/liburing/debian/liburing-dev.manpages +6 -0
  28. data/vendor/liburing/debian/liburing1-udeb.install +1 -0
  29. data/vendor/liburing/debian/liburing1.install +1 -0
  30. data/vendor/liburing/debian/liburing1.symbols +32 -0
  31. data/vendor/liburing/debian/patches/series +1 -0
  32. data/vendor/liburing/debian/rules +81 -0
  33. data/vendor/liburing/debian/source/format +1 -0
  34. data/vendor/liburing/debian/source/local-options +2 -0
  35. data/vendor/liburing/debian/source/options +1 -0
  36. data/vendor/liburing/debian/watch +3 -0
  37. data/vendor/liburing/examples/Makefile +38 -0
  38. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  39. data/vendor/liburing/examples/io_uring-test.c +112 -0
  40. data/vendor/liburing/examples/link-cp.c +193 -0
  41. data/vendor/liburing/examples/ucontext-cp.c +273 -0
  42. data/vendor/liburing/liburing.pc.in +12 -0
  43. data/vendor/liburing/liburing.spec +66 -0
  44. data/vendor/liburing/make-debs.sh +53 -0
  45. data/vendor/liburing/man/io_uring.7 +754 -0
  46. data/vendor/liburing/man/io_uring_cq_advance.3 +35 -0
  47. data/vendor/liburing/man/io_uring_cq_ready.3 +25 -0
  48. data/vendor/liburing/man/io_uring_cqe_get_data.3 +34 -0
  49. data/vendor/liburing/man/io_uring_cqe_seen.3 +32 -0
  50. data/vendor/liburing/man/io_uring_enter.2 +1483 -0
  51. data/vendor/liburing/man/io_uring_free_probe.3 +24 -0
  52. data/vendor/liburing/man/io_uring_get_probe.3 +29 -0
  53. data/vendor/liburing/man/io_uring_get_sqe.3 +38 -0
  54. data/vendor/liburing/man/io_uring_opcode_supported.3 +29 -0
  55. data/vendor/liburing/man/io_uring_prep_msg_ring.3 +58 -0
  56. data/vendor/liburing/man/io_uring_prep_read.3 +50 -0
  57. data/vendor/liburing/man/io_uring_prep_read_fixed.3 +54 -0
  58. data/vendor/liburing/man/io_uring_prep_readv.3 +51 -0
  59. data/vendor/liburing/man/io_uring_prep_readv2.3 +79 -0
  60. data/vendor/liburing/man/io_uring_prep_write.3 +50 -0
  61. data/vendor/liburing/man/io_uring_prep_write_fixed.3 +54 -0
  62. data/vendor/liburing/man/io_uring_prep_writev.3 +51 -0
  63. data/vendor/liburing/man/io_uring_prep_writev2.3 +78 -0
  64. data/vendor/liburing/man/io_uring_queue_exit.3 +27 -0
  65. data/vendor/liburing/man/io_uring_queue_init.3 +44 -0
  66. data/vendor/liburing/man/io_uring_register.2 +688 -0
  67. data/vendor/liburing/man/io_uring_register_buffers.3 +41 -0
  68. data/vendor/liburing/man/io_uring_register_files.3 +35 -0
  69. data/vendor/liburing/man/io_uring_setup.2 +534 -0
  70. data/vendor/liburing/man/io_uring_sq_ready.3 +25 -0
  71. data/vendor/liburing/man/io_uring_sq_space_left.3 +25 -0
  72. data/vendor/liburing/man/io_uring_sqe_set_data.3 +30 -0
  73. data/vendor/liburing/man/io_uring_sqe_set_flags.3 +60 -0
  74. data/vendor/liburing/man/io_uring_sqring_wait.3 +30 -0
  75. data/vendor/liburing/man/io_uring_submit.3 +29 -0
  76. data/vendor/liburing/man/io_uring_submit_and_wait.3 +34 -0
  77. data/vendor/liburing/man/io_uring_submit_and_wait_timeout.3 +49 -0
  78. data/vendor/liburing/man/io_uring_unregister_buffers.3 +26 -0
  79. data/vendor/liburing/man/io_uring_unregister_files.3 +26 -0
  80. data/vendor/liburing/man/io_uring_wait_cqe.3 +33 -0
  81. data/vendor/liburing/man/io_uring_wait_cqe_nr.3 +36 -0
  82. data/vendor/liburing/man/io_uring_wait_cqe_timeout.3 +39 -0
  83. data/vendor/liburing/man/io_uring_wait_cqes.3 +46 -0
  84. data/vendor/liburing/src/Makefile +89 -0
  85. data/vendor/liburing/src/arch/aarch64/syscall.h +95 -0
  86. data/vendor/liburing/src/arch/generic/lib.h +21 -0
  87. data/vendor/liburing/src/arch/generic/syscall.h +87 -0
  88. data/vendor/liburing/src/arch/syscall-defs.h +67 -0
  89. data/vendor/liburing/src/arch/x86/lib.h +32 -0
  90. data/vendor/liburing/src/arch/x86/syscall.h +160 -0
  91. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  92. data/vendor/liburing/src/include/liburing/io_uring.h +442 -0
  93. data/vendor/liburing/src/include/liburing.h +921 -0
  94. data/vendor/liburing/src/int_flags.h +8 -0
  95. data/vendor/liburing/src/lib.h +57 -0
  96. data/vendor/liburing/src/liburing.map +53 -0
  97. data/vendor/liburing/src/nolibc.c +48 -0
  98. data/vendor/liburing/src/queue.c +403 -0
  99. data/vendor/liburing/src/register.c +293 -0
  100. data/vendor/liburing/src/setup.c +332 -0
  101. data/vendor/liburing/src/syscall.c +47 -0
  102. data/vendor/liburing/src/syscall.h +103 -0
  103. data/vendor/liburing/test/232c93d07b74-test.c +306 -0
  104. data/vendor/liburing/test/35fa71a030ca-test.c +329 -0
  105. data/vendor/liburing/test/500f9fbadef8-test.c +89 -0
  106. data/vendor/liburing/test/7ad0e4b2f83c-test.c +93 -0
  107. data/vendor/liburing/test/8a9973408177-test.c +106 -0
  108. data/vendor/liburing/test/917257daa0fe-test.c +53 -0
  109. data/vendor/liburing/test/Makefile +244 -0
  110. data/vendor/liburing/test/a0908ae19763-test.c +58 -0
  111. data/vendor/liburing/test/a4c0b3decb33-test.c +180 -0
  112. data/vendor/liburing/test/accept-link.c +254 -0
  113. data/vendor/liburing/test/accept-reuse.c +164 -0
  114. data/vendor/liburing/test/accept-test.c +79 -0
  115. data/vendor/liburing/test/accept.c +477 -0
  116. data/vendor/liburing/test/across-fork.c +283 -0
  117. data/vendor/liburing/test/b19062a56726-test.c +53 -0
  118. data/vendor/liburing/test/b5837bd5311d-test.c +77 -0
  119. data/vendor/liburing/test/ce593a6c480a-test.c +136 -0
  120. data/vendor/liburing/test/close-opath.c +122 -0
  121. data/vendor/liburing/test/config +10 -0
  122. data/vendor/liburing/test/connect.c +398 -0
  123. data/vendor/liburing/test/cq-full.c +96 -0
  124. data/vendor/liburing/test/cq-overflow.c +294 -0
  125. data/vendor/liburing/test/cq-peek-batch.c +102 -0
  126. data/vendor/liburing/test/cq-ready.c +94 -0
  127. data/vendor/liburing/test/cq-size.c +64 -0
  128. data/vendor/liburing/test/d4ae271dfaae-test.c +96 -0
  129. data/vendor/liburing/test/d77a67ed5f27-test.c +65 -0
  130. data/vendor/liburing/test/defer.c +307 -0
  131. data/vendor/liburing/test/double-poll-crash.c +185 -0
  132. data/vendor/liburing/test/drop-submit.c +92 -0
  133. data/vendor/liburing/test/eeed8b54e0df-test.c +114 -0
  134. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  135. data/vendor/liburing/test/eventfd-disable.c +151 -0
  136. data/vendor/liburing/test/eventfd-reg.c +76 -0
  137. data/vendor/liburing/test/eventfd-ring.c +97 -0
  138. data/vendor/liburing/test/eventfd.c +112 -0
  139. data/vendor/liburing/test/exec-target.c +6 -0
  140. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  141. data/vendor/liburing/test/fadvise.c +202 -0
  142. data/vendor/liburing/test/fallocate.c +249 -0
  143. data/vendor/liburing/test/fc2a85cb02ef-test.c +131 -0
  144. data/vendor/liburing/test/file-register.c +858 -0
  145. data/vendor/liburing/test/file-update.c +173 -0
  146. data/vendor/liburing/test/file-verify.c +629 -0
  147. data/vendor/liburing/test/files-exit-hang-poll.c +128 -0
  148. data/vendor/liburing/test/files-exit-hang-timeout.c +134 -0
  149. data/vendor/liburing/test/fixed-link.c +90 -0
  150. data/vendor/liburing/test/fpos.c +252 -0
  151. data/vendor/liburing/test/fsync.c +224 -0
  152. data/vendor/liburing/test/hardlink.c +136 -0
  153. data/vendor/liburing/test/helpers.c +135 -0
  154. data/vendor/liburing/test/helpers.h +67 -0
  155. data/vendor/liburing/test/io-cancel.c +550 -0
  156. data/vendor/liburing/test/io_uring_enter.c +296 -0
  157. data/vendor/liburing/test/io_uring_register.c +676 -0
  158. data/vendor/liburing/test/io_uring_setup.c +192 -0
  159. data/vendor/liburing/test/iopoll.c +372 -0
  160. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  161. data/vendor/liburing/test/lfs-openat.c +275 -0
  162. data/vendor/liburing/test/link-timeout.c +1107 -0
  163. data/vendor/liburing/test/link.c +496 -0
  164. data/vendor/liburing/test/link_drain.c +229 -0
  165. data/vendor/liburing/test/madvise.c +195 -0
  166. data/vendor/liburing/test/mkdir.c +108 -0
  167. data/vendor/liburing/test/msg-ring.c +234 -0
  168. data/vendor/liburing/test/multicqes_drain.c +387 -0
  169. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  170. data/vendor/liburing/test/nop.c +115 -0
  171. data/vendor/liburing/test/open-close.c +261 -0
  172. data/vendor/liburing/test/openat2.c +308 -0
  173. data/vendor/liburing/test/personality.c +204 -0
  174. data/vendor/liburing/test/pipe-eof.c +83 -0
  175. data/vendor/liburing/test/pipe-reuse.c +105 -0
  176. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  177. data/vendor/liburing/test/poll-cancel.c +228 -0
  178. data/vendor/liburing/test/poll-link.c +230 -0
  179. data/vendor/liburing/test/poll-many.c +208 -0
  180. data/vendor/liburing/test/poll-mshot-update.c +273 -0
  181. data/vendor/liburing/test/poll-ring.c +48 -0
  182. data/vendor/liburing/test/poll-v-poll.c +353 -0
  183. data/vendor/liburing/test/poll.c +109 -0
  184. data/vendor/liburing/test/pollfree.c +426 -0
  185. data/vendor/liburing/test/probe.c +135 -0
  186. data/vendor/liburing/test/read-write.c +876 -0
  187. data/vendor/liburing/test/register-restrictions.c +633 -0
  188. data/vendor/liburing/test/rename.c +135 -0
  189. data/vendor/liburing/test/ring-leak.c +173 -0
  190. data/vendor/liburing/test/ring-leak2.c +249 -0
  191. data/vendor/liburing/test/rsrc_tags.c +449 -0
  192. data/vendor/liburing/test/runtests-loop.sh +16 -0
  193. data/vendor/liburing/test/runtests.sh +170 -0
  194. data/vendor/liburing/test/rw_merge_test.c +97 -0
  195. data/vendor/liburing/test/self.c +91 -0
  196. data/vendor/liburing/test/send_recv.c +286 -0
  197. data/vendor/liburing/test/send_recvmsg.c +345 -0
  198. data/vendor/liburing/test/sendmsg_fs_cve.c +200 -0
  199. data/vendor/liburing/test/shared-wq.c +84 -0
  200. data/vendor/liburing/test/short-read.c +75 -0
  201. data/vendor/liburing/test/shutdown.c +165 -0
  202. data/vendor/liburing/test/sigfd-deadlock.c +74 -0
  203. data/vendor/liburing/test/skip-cqe.c +429 -0
  204. data/vendor/liburing/test/socket-rw-eagain.c +158 -0
  205. data/vendor/liburing/test/socket-rw-offset.c +157 -0
  206. data/vendor/liburing/test/socket-rw.c +145 -0
  207. data/vendor/liburing/test/splice.c +512 -0
  208. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  209. data/vendor/liburing/test/sq-full.c +45 -0
  210. data/vendor/liburing/test/sq-poll-dup.c +204 -0
  211. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  212. data/vendor/liburing/test/sq-poll-share.c +137 -0
  213. data/vendor/liburing/test/sq-space_left.c +159 -0
  214. data/vendor/liburing/test/sqpoll-cancel-hang.c +157 -0
  215. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  216. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  217. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  218. data/vendor/liburing/test/statx.c +172 -0
  219. data/vendor/liburing/test/stdout.c +232 -0
  220. data/vendor/liburing/test/submit-link-fail.c +154 -0
  221. data/vendor/liburing/test/submit-reuse.c +239 -0
  222. data/vendor/liburing/test/symlink.c +116 -0
  223. data/vendor/liburing/test/teardowns.c +58 -0
  224. data/vendor/liburing/test/thread-exit.c +143 -0
  225. data/vendor/liburing/test/timeout-new.c +252 -0
  226. data/vendor/liburing/test/timeout-overflow.c +204 -0
  227. data/vendor/liburing/test/timeout.c +1523 -0
  228. data/vendor/liburing/test/unlink.c +112 -0
  229. data/vendor/liburing/test/wakeup-hang.c +162 -0
  230. metadata +223 -2
@@ -0,0 +1,103 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #ifndef LIBURING_SYSCALL_H
3
+ #define LIBURING_SYSCALL_H
4
+
5
+ #include <errno.h>
6
+ #include <signal.h>
7
+ #include <stdint.h>
8
+ #include <unistd.h>
9
+ #include <stdbool.h>
10
+ #include <sys/mman.h>
11
+ #include <sys/syscall.h>
12
+ #include <sys/resource.h>
13
+
14
+ #include <liburing.h>
15
+
16
+ #ifdef __alpha__
17
+ /*
18
+ * alpha and mips are exception, other architectures have
19
+ * common numbers for new system calls.
20
+ */
21
+ # ifndef __NR_io_uring_setup
22
+ # define __NR_io_uring_setup 535
23
+ # endif
24
+ # ifndef __NR_io_uring_enter
25
+ # define __NR_io_uring_enter 536
26
+ # endif
27
+ # ifndef __NR_io_uring_register
28
+ # define __NR_io_uring_register 537
29
+ # endif
30
+ #elif defined __mips__
31
+ # ifndef __NR_io_uring_setup
32
+ # define __NR_io_uring_setup (__NR_Linux + 425)
33
+ # endif
34
+ # ifndef __NR_io_uring_enter
35
+ # define __NR_io_uring_enter (__NR_Linux + 426)
36
+ # endif
37
+ # ifndef __NR_io_uring_register
38
+ # define __NR_io_uring_register (__NR_Linux + 427)
39
+ # endif
40
+ #else /* !__alpha__ and !__mips__ */
41
+ # ifndef __NR_io_uring_setup
42
+ # define __NR_io_uring_setup 425
43
+ # endif
44
+ # ifndef __NR_io_uring_enter
45
+ # define __NR_io_uring_enter 426
46
+ # endif
47
+ # ifndef __NR_io_uring_register
48
+ # define __NR_io_uring_register 427
49
+ # endif
50
+ #endif
51
+
52
+ /*
53
+ * Don't put this below the #include "arch/$arch/syscall.h", that
54
+ * file may need it.
55
+ */
56
+ struct io_uring_params;
57
+
58
+ static inline void *ERR_PTR(intptr_t n)
59
+ {
60
+ return (void *) n;
61
+ }
62
+
63
+ static inline intptr_t PTR_ERR(const void *ptr)
64
+ {
65
+ return (intptr_t) ptr;
66
+ }
67
+
68
+ static inline bool IS_ERR(const void *ptr)
69
+ {
70
+ return uring_unlikely((uintptr_t) ptr >= (uintptr_t) -4095UL);
71
+ }
72
+
73
+ #define __INTERNAL__LIBURING_SYSCALL_H
74
+ #if defined(__x86_64__) || defined(__i386__)
75
+ #include "arch/x86/syscall.h"
76
+ #elif defined(__aarch64__)
77
+ #include "arch/aarch64/syscall.h"
78
+ #else
79
+ /*
80
+ * We don't have native syscall wrappers
81
+ * for this arch. Must use libc!
82
+ */
83
+ #ifdef CONFIG_NOLIBC
84
+ #error "This arch doesn't support building liburing without libc"
85
+ #endif
86
+ /* libc syscall wrappers. */
87
+ #include "arch/generic/syscall.h"
88
+ #endif
89
+ #undef __INTERNAL__LIBURING_SYSCALL_H
90
+
91
+ /*
92
+ * For backward compatibility.
93
+ * (these __sys* functions always use libc, see syscall.c)
94
+ */
95
+ int __sys_io_uring_setup(unsigned entries, struct io_uring_params *p);
96
+ int __sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete,
97
+ unsigned flags, sigset_t *sig);
98
+ int __sys_io_uring_enter2(int fd, unsigned to_submit, unsigned min_complete,
99
+ unsigned flags, sigset_t *sig, int sz);
100
+ int __sys_io_uring_register(int fd, unsigned int opcode, const void *arg,
101
+ unsigned int nr_args);
102
+
103
+ #endif
@@ -0,0 +1,306 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test case for socket read/write through IORING_OP_READV and
4
+ * IORING_OP_WRITEV, using both TCP and sockets and blocking and
5
+ * non-blocking IO.
6
+ *
7
+ * Heavily based on a test case from Hrvoje Zeba <zeba.hrvoje@gmail.com>
8
+ */
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <stdint.h>
12
+ #include <assert.h>
13
+
14
+ #include <pthread.h>
15
+ #include <errno.h>
16
+ #include <fcntl.h>
17
+ #include <unistd.h>
18
+ #include <sys/socket.h>
19
+ #include <sys/un.h>
20
+ #include <netinet/tcp.h>
21
+ #include <netinet/in.h>
22
+ #include <arpa/inet.h>
23
+
24
+ #include "liburing.h"
25
+
26
+ #define RECV_BUFF_SIZE 2
27
+ #define SEND_BUFF_SIZE 3
28
+
29
+ #define PORT 0x1235
30
+
31
+ struct params {
32
+ int tcp;
33
+ int non_blocking;
34
+ };
35
+
36
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
37
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
38
+ int rcv_ready = 0;
39
+
40
+ static void set_rcv_ready(void)
41
+ {
42
+ pthread_mutex_lock(&mutex);
43
+
44
+ rcv_ready = 1;
45
+ pthread_cond_signal(&cond);
46
+
47
+ pthread_mutex_unlock(&mutex);
48
+ }
49
+
50
+ static void wait_for_rcv_ready(void)
51
+ {
52
+ pthread_mutex_lock(&mutex);
53
+
54
+ while (!rcv_ready)
55
+ pthread_cond_wait(&cond, &mutex);
56
+
57
+ pthread_mutex_unlock(&mutex);
58
+ }
59
+
60
+ static void *rcv(void *arg)
61
+ {
62
+ struct params *p = arg;
63
+ int s0;
64
+ int res;
65
+
66
+ if (p->tcp) {
67
+ int val = 1;
68
+
69
+
70
+ s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
71
+ res = setsockopt(s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
72
+ assert(res != -1);
73
+ res = setsockopt(s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
74
+ assert(res != -1);
75
+
76
+ struct sockaddr_in addr;
77
+
78
+ addr.sin_family = AF_INET;
79
+ addr.sin_port = htons(PORT);
80
+ addr.sin_addr.s_addr = inet_addr("127.0.0.1");
81
+ res = bind(s0, (struct sockaddr *) &addr, sizeof(addr));
82
+ assert(res != -1);
83
+ } else {
84
+ s0 = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
85
+ assert(s0 != -1);
86
+
87
+ struct sockaddr_un addr;
88
+ memset(&addr, 0, sizeof(addr));
89
+
90
+ addr.sun_family = AF_UNIX;
91
+ memcpy(addr.sun_path, "\0sock", 6);
92
+ res = bind(s0, (struct sockaddr *) &addr, sizeof(addr));
93
+ assert(res != -1);
94
+ }
95
+ res = listen(s0, 128);
96
+ assert(res != -1);
97
+
98
+ set_rcv_ready();
99
+
100
+ int s1 = accept(s0, NULL, NULL);
101
+ assert(s1 != -1);
102
+
103
+ if (p->non_blocking) {
104
+ int flags = fcntl(s1, F_GETFL, 0);
105
+ assert(flags != -1);
106
+
107
+ flags |= O_NONBLOCK;
108
+ res = fcntl(s1, F_SETFL, flags);
109
+ assert(res != -1);
110
+ }
111
+
112
+ struct io_uring m_io_uring;
113
+ void *ret = NULL;
114
+
115
+ res = io_uring_queue_init(32, &m_io_uring, 0);
116
+ assert(res >= 0);
117
+
118
+ int bytes_read = 0;
119
+ int expected_byte = 0;
120
+ int done = 0;
121
+
122
+ while (!done && bytes_read != 33) {
123
+ char buff[RECV_BUFF_SIZE];
124
+ struct iovec iov;
125
+
126
+ iov.iov_base = buff;
127
+ iov.iov_len = sizeof(buff);
128
+
129
+ struct io_uring_sqe *sqe = io_uring_get_sqe(&m_io_uring);
130
+ assert(sqe != NULL);
131
+
132
+ io_uring_prep_readv(sqe, s1, &iov, 1, 0);
133
+
134
+ res = io_uring_submit(&m_io_uring);
135
+ assert(res != -1);
136
+
137
+ struct io_uring_cqe *cqe;
138
+ unsigned head;
139
+ unsigned count = 0;
140
+
141
+ while (!done && count != 1) {
142
+ io_uring_for_each_cqe(&m_io_uring, head, cqe) {
143
+ if (cqe->res < 0)
144
+ assert(cqe->res == -EAGAIN);
145
+ else {
146
+ int i;
147
+
148
+ for (i = 0; i < cqe->res; i++) {
149
+ if (buff[i] != expected_byte) {
150
+ fprintf(stderr,
151
+ "Received %d, wanted %d\n",
152
+ buff[i], expected_byte);
153
+ ret++;
154
+ done = 1;
155
+ }
156
+ expected_byte++;
157
+ }
158
+ bytes_read += cqe->res;
159
+ }
160
+
161
+ count++;
162
+ }
163
+
164
+ assert(count <= 1);
165
+ io_uring_cq_advance(&m_io_uring, count);
166
+ }
167
+ }
168
+
169
+ shutdown(s1, SHUT_RDWR);
170
+ close(s1);
171
+ close(s0);
172
+ io_uring_queue_exit(&m_io_uring);
173
+ return ret;
174
+ }
175
+
176
+ static void *snd(void *arg)
177
+ {
178
+ struct params *p = arg;
179
+ int s0;
180
+ int ret;
181
+
182
+ wait_for_rcv_ready();
183
+
184
+ if (p->tcp) {
185
+ int val = 1;
186
+
187
+ s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
188
+ ret = setsockopt(s0, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
189
+ assert(ret != -1);
190
+
191
+ struct sockaddr_in addr;
192
+
193
+ addr.sin_family = AF_INET;
194
+ addr.sin_port = htons(PORT);
195
+ addr.sin_addr.s_addr = inet_addr("127.0.0.1");
196
+ ret = connect(s0, (struct sockaddr*) &addr, sizeof(addr));
197
+ assert(ret != -1);
198
+ } else {
199
+ s0 = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
200
+ assert(s0 != -1);
201
+
202
+ struct sockaddr_un addr;
203
+ memset(&addr, 0, sizeof(addr));
204
+
205
+ addr.sun_family = AF_UNIX;
206
+ memcpy(addr.sun_path, "\0sock", 6);
207
+ ret = connect(s0, (struct sockaddr*) &addr, sizeof(addr));
208
+ assert(ret != -1);
209
+ }
210
+
211
+ if (p->non_blocking) {
212
+ int flags = fcntl(s0, F_GETFL, 0);
213
+ assert(flags != -1);
214
+
215
+ flags |= O_NONBLOCK;
216
+ ret = fcntl(s0, F_SETFL, flags);
217
+ assert(ret != -1);
218
+ }
219
+
220
+ struct io_uring m_io_uring;
221
+
222
+ ret = io_uring_queue_init(32, &m_io_uring, 0);
223
+ assert(ret >= 0);
224
+
225
+ int bytes_written = 0;
226
+ int done = 0;
227
+
228
+ while (!done && bytes_written != 33) {
229
+ char buff[SEND_BUFF_SIZE];
230
+ int i;
231
+
232
+ for (i = 0; i < SEND_BUFF_SIZE; i++)
233
+ buff[i] = i + bytes_written;
234
+
235
+ struct iovec iov;
236
+
237
+ iov.iov_base = buff;
238
+ iov.iov_len = sizeof(buff);
239
+
240
+ struct io_uring_sqe *sqe = io_uring_get_sqe(&m_io_uring);
241
+ assert(sqe != NULL);
242
+
243
+ io_uring_prep_writev(sqe, s0, &iov, 1, 0);
244
+
245
+ ret = io_uring_submit(&m_io_uring);
246
+ assert(ret != -1);
247
+
248
+ struct io_uring_cqe *cqe;
249
+ unsigned head;
250
+ unsigned count = 0;
251
+
252
+ while (!done && count != 1) {
253
+ io_uring_for_each_cqe(&m_io_uring, head, cqe) {
254
+ if (cqe->res < 0) {
255
+ if (cqe->res == -EPIPE) {
256
+ done = 1;
257
+ break;
258
+ }
259
+ assert(cqe->res == -EAGAIN);
260
+ } else {
261
+ bytes_written += cqe->res;
262
+ }
263
+
264
+ count++;
265
+ }
266
+
267
+ assert(count <= 1);
268
+ io_uring_cq_advance(&m_io_uring, count);
269
+ }
270
+ usleep(100000);
271
+ }
272
+
273
+ shutdown(s0, SHUT_RDWR);
274
+ close(s0);
275
+ io_uring_queue_exit(&m_io_uring);
276
+ return NULL;
277
+ }
278
+
279
+ int main(int argc, char *argv[])
280
+ {
281
+ struct params p;
282
+ pthread_t t1, t2;
283
+ void *res1, *res2;
284
+ int i, exit_val = 0;
285
+
286
+ if (argc > 1)
287
+ return 0;
288
+
289
+ for (i = 0; i < 4; i++) {
290
+ p.tcp = i & 1;
291
+ p.non_blocking = (i & 2) >> 1;
292
+
293
+ rcv_ready = 0;
294
+
295
+ pthread_create(&t1, NULL, rcv, &p);
296
+ pthread_create(&t2, NULL, snd, &p);
297
+ pthread_join(t1, &res1);
298
+ pthread_join(t2, &res2);
299
+ if (res1 || res2) {
300
+ fprintf(stderr, "Failed tcp=%d, non_blocking=%d\n", p.tcp, p.non_blocking);
301
+ exit_val = 1;
302
+ }
303
+ }
304
+
305
+ return exit_val;
306
+ }
@@ -0,0 +1,329 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ // autogenerated by syzkaller (https://github.com/google/syzkaller)
3
+
4
+ #include <dirent.h>
5
+ #include <endian.h>
6
+ #include <errno.h>
7
+ #include <fcntl.h>
8
+ #include <pthread.h>
9
+ #include <signal.h>
10
+ #include <stdarg.h>
11
+ #include <stdbool.h>
12
+ #include <stdint.h>
13
+ #include <stdio.h>
14
+ #include <stdlib.h>
15
+ #include <string.h>
16
+ #include <sys/prctl.h>
17
+ #include <sys/stat.h>
18
+ #include <sys/syscall.h>
19
+ #include <sys/types.h>
20
+ #include <sys/wait.h>
21
+ #include <time.h>
22
+ #include <unistd.h>
23
+ #include <sys/mman.h>
24
+
25
+ #include <linux/futex.h>
26
+
27
+ #include "liburing.h"
28
+ #include "../src/syscall.h"
29
+
30
+ #if !defined(SYS_futex) && defined(SYS_futex_time64)
31
+ # define SYS_futex SYS_futex_time64
32
+ #endif
33
+
34
+ static void sleep_ms(uint64_t ms)
35
+ {
36
+ usleep(ms * 1000);
37
+ }
38
+
39
+ static uint64_t current_time_ms(void)
40
+ {
41
+ struct timespec ts;
42
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
43
+ exit(1);
44
+ return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
45
+ }
46
+
47
+ static void thread_start(void* (*fn)(void*), void* arg)
48
+ {
49
+ pthread_t th;
50
+ pthread_attr_t attr;
51
+ pthread_attr_init(&attr);
52
+ pthread_attr_setstacksize(&attr, 128 << 10);
53
+ int i;
54
+ for (i = 0; i < 100; i++) {
55
+ if (pthread_create(&th, &attr, fn, arg) == 0) {
56
+ pthread_attr_destroy(&attr);
57
+ return;
58
+ }
59
+ if (errno == EAGAIN) {
60
+ usleep(50);
61
+ continue;
62
+ }
63
+ break;
64
+ }
65
+ exit(1);
66
+ }
67
+
68
+ typedef struct {
69
+ int state;
70
+ } event_t;
71
+
72
+ static void event_init(event_t* ev)
73
+ {
74
+ ev->state = 0;
75
+ }
76
+
77
+ static void event_reset(event_t* ev)
78
+ {
79
+ ev->state = 0;
80
+ }
81
+
82
+ static void event_set(event_t* ev)
83
+ {
84
+ if (ev->state)
85
+ exit(1);
86
+ __atomic_store_n(&ev->state, 1, __ATOMIC_RELEASE);
87
+ syscall(SYS_futex, &ev->state, FUTEX_WAKE | FUTEX_PRIVATE_FLAG);
88
+ }
89
+
90
+ static void event_wait(event_t* ev)
91
+ {
92
+ while (!__atomic_load_n(&ev->state, __ATOMIC_ACQUIRE))
93
+ syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, 0);
94
+ }
95
+
96
+ static int event_isset(event_t* ev)
97
+ {
98
+ return __atomic_load_n(&ev->state, __ATOMIC_ACQUIRE);
99
+ }
100
+
101
+ static int event_timedwait(event_t* ev, uint64_t timeout)
102
+ {
103
+ uint64_t start = current_time_ms();
104
+ uint64_t now = start;
105
+ for (;;) {
106
+ uint64_t remain = timeout - (now - start);
107
+ struct timespec ts;
108
+ ts.tv_sec = remain / 1000;
109
+ ts.tv_nsec = (remain % 1000) * 1000 * 1000;
110
+ syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, &ts);
111
+ if (__atomic_load_n(&ev->state, __ATOMIC_RELAXED))
112
+ return 1;
113
+ now = current_time_ms();
114
+ if (now - start > timeout)
115
+ return 0;
116
+ }
117
+ }
118
+
119
+ static bool write_file(const char* file, const char* what, ...)
120
+ {
121
+ char buf[1024];
122
+ va_list args;
123
+ va_start(args, what);
124
+ vsnprintf(buf, sizeof(buf), what, args);
125
+ va_end(args);
126
+ buf[sizeof(buf) - 1] = 0;
127
+ int len = strlen(buf);
128
+ int fd = open(file, O_WRONLY | O_CLOEXEC);
129
+ if (fd == -1)
130
+ return false;
131
+ if (write(fd, buf, len) != len) {
132
+ int err = errno;
133
+ close(fd);
134
+ errno = err;
135
+ return false;
136
+ }
137
+ close(fd);
138
+ return true;
139
+ }
140
+
141
+ static void kill_and_wait(int pid, int* status)
142
+ {
143
+ kill(-pid, SIGKILL);
144
+ kill(pid, SIGKILL);
145
+ int i;
146
+ for (i = 0; i < 100; i++) {
147
+ if (waitpid(-1, status, WNOHANG | __WALL) == pid)
148
+ return;
149
+ usleep(1000);
150
+ }
151
+ DIR* dir = opendir("/sys/fs/fuse/connections");
152
+ if (dir) {
153
+ for (;;) {
154
+ struct dirent* ent = readdir(dir);
155
+ if (!ent)
156
+ break;
157
+ if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
158
+ continue;
159
+ char abort[300];
160
+ snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
161
+ ent->d_name);
162
+ int fd = open(abort, O_WRONLY);
163
+ if (fd == -1) {
164
+ continue;
165
+ }
166
+ if (write(fd, abort, 1) < 0) {
167
+ }
168
+ close(fd);
169
+ }
170
+ closedir(dir);
171
+ } else {
172
+ }
173
+ while (waitpid(-1, status, __WALL) != pid) {
174
+ }
175
+ }
176
+
177
+ #define SYZ_HAVE_SETUP_TEST 1
178
+ static void setup_test()
179
+ {
180
+ prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
181
+ setpgrp();
182
+ write_file("/proc/self/oom_score_adj", "1000");
183
+ }
184
+
185
+ struct thread_t {
186
+ int created, call;
187
+ event_t ready, done;
188
+ };
189
+
190
+ static struct thread_t threads[16];
191
+ static void execute_call(int call);
192
+ static int running;
193
+
194
+ static void* thr(void* arg)
195
+ {
196
+ struct thread_t* th = (struct thread_t*)arg;
197
+ for (;;) {
198
+ event_wait(&th->ready);
199
+ event_reset(&th->ready);
200
+ execute_call(th->call);
201
+ __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
202
+ event_set(&th->done);
203
+ }
204
+ return 0;
205
+ }
206
+
207
+ static void execute_one(void)
208
+ {
209
+ int i, call, thread;
210
+ for (call = 0; call < 3; call++) {
211
+ for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
212
+ thread++) {
213
+ struct thread_t* th = &threads[thread];
214
+ if (!th->created) {
215
+ th->created = 1;
216
+ event_init(&th->ready);
217
+ event_init(&th->done);
218
+ event_set(&th->done);
219
+ thread_start(thr, th);
220
+ }
221
+ if (!event_isset(&th->done))
222
+ continue;
223
+ event_reset(&th->done);
224
+ th->call = call;
225
+ __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
226
+ event_set(&th->ready);
227
+ event_timedwait(&th->done, 45);
228
+ break;
229
+ }
230
+ }
231
+ for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
232
+ sleep_ms(1);
233
+ }
234
+
235
+ static void execute_one(void);
236
+
237
+ #define WAIT_FLAGS __WALL
238
+
239
+ static void loop(void)
240
+ {
241
+ int iter;
242
+ for (iter = 0;; iter++) {
243
+ int pid = fork();
244
+ if (pid < 0)
245
+ exit(1);
246
+ if (pid == 0) {
247
+ setup_test();
248
+ execute_one();
249
+ exit(0);
250
+ }
251
+ int status = 0;
252
+ uint64_t start = current_time_ms();
253
+ for (;;) {
254
+ if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
255
+ break;
256
+ sleep_ms(1);
257
+ if (current_time_ms() - start < 5 * 1000)
258
+ continue;
259
+ kill_and_wait(pid, &status);
260
+ break;
261
+ }
262
+ }
263
+ }
264
+
265
+ uint64_t r[1] = {0xffffffffffffffff};
266
+
267
+ void execute_call(int call)
268
+ {
269
+ long res;
270
+ switch (call) {
271
+ case 0:
272
+ *(uint32_t*)0x20000040 = 0;
273
+ *(uint32_t*)0x20000044 = 0;
274
+ *(uint32_t*)0x20000048 = 0;
275
+ *(uint32_t*)0x2000004c = 0;
276
+ *(uint32_t*)0x20000050 = 0;
277
+ *(uint32_t*)0x20000054 = 0;
278
+ *(uint32_t*)0x20000058 = 0;
279
+ *(uint32_t*)0x2000005c = 0;
280
+ *(uint32_t*)0x20000060 = 0;
281
+ *(uint32_t*)0x20000064 = 0;
282
+ *(uint32_t*)0x20000068 = 0;
283
+ *(uint32_t*)0x2000006c = 0;
284
+ *(uint32_t*)0x20000070 = 0;
285
+ *(uint32_t*)0x20000074 = 0;
286
+ *(uint32_t*)0x20000078 = 0;
287
+ *(uint32_t*)0x2000007c = 0;
288
+ *(uint32_t*)0x20000080 = 0;
289
+ *(uint32_t*)0x20000084 = 0;
290
+ *(uint64_t*)0x20000088 = 0;
291
+ *(uint32_t*)0x20000090 = 0;
292
+ *(uint32_t*)0x20000094 = 0;
293
+ *(uint32_t*)0x20000098 = 0;
294
+ *(uint32_t*)0x2000009c = 0;
295
+ *(uint32_t*)0x200000a0 = 0;
296
+ *(uint32_t*)0x200000a4 = 0;
297
+ *(uint32_t*)0x200000a8 = 0;
298
+ *(uint32_t*)0x200000ac = 0;
299
+ *(uint64_t*)0x200000b0 = 0;
300
+ res = __sys_io_uring_setup(0x64, (struct io_uring_params *) 0x20000040UL);
301
+ if (res != -1)
302
+ r[0] = res;
303
+ break;
304
+ case 1:
305
+ __sys_io_uring_register((long)r[0], 0, 0, 0);
306
+ break;
307
+ case 2:
308
+ __sys_io_uring_register((long)r[0], 0, 0, 0);
309
+ break;
310
+ }
311
+ }
312
+
313
+ static void sig_int(int sig)
314
+ {
315
+ exit(0);
316
+ }
317
+
318
+ int main(int argc, char *argv[])
319
+ {
320
+ if (argc > 1)
321
+ return 0;
322
+ signal(SIGINT, sig_int);
323
+ mmap((void *) 0x20000000, 0x1000000, 3, 0x32, -1, 0);
324
+ signal(SIGALRM, sig_int);
325
+ alarm(5);
326
+
327
+ loop();
328
+ return 0;
329
+ }