uringmachine 0.1
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 +7 -0
- data/.github/dependabot.yml +12 -0
- data/.github/workflows/test.yml +35 -0
- data/.gitignore +59 -0
- data/.gitmodules +3 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +11 -0
- data/Rakefile +39 -0
- data/TODO.md +0 -0
- data/examples/echo_server.rb +52 -0
- data/examples/event_loop.rb +69 -0
- data/examples/fibers.rb +105 -0
- data/examples/http_server.rb +56 -0
- data/examples/http_server_multishot.rb +57 -0
- data/examples/http_server_simpler.rb +34 -0
- data/ext/um/extconf.rb +71 -0
- data/ext/um/iou.h +101 -0
- data/ext/um/op_ctx.c +138 -0
- data/ext/um/ring.c +755 -0
- data/ext/um/um.c +267 -0
- data/ext/um/um.h +97 -0
- data/ext/um/um_class.c +175 -0
- data/ext/um/um_ext.c +11 -0
- data/ext/um/um_op.c +87 -0
- data/ext/um/um_utils.c +23 -0
- data/lib/uringmachine/version.rb +3 -0
- data/lib/uringmachine.rb +8 -0
- data/test/helper.rb +70 -0
- data/test/test_iou.rb +876 -0
- data/test/test_um.rb +168 -0
- data/uringmachine.gemspec +27 -0
- data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
- data/vendor/liburing/.github/pull_request_template.md +86 -0
- data/vendor/liburing/.github/workflows/build.yml +137 -0
- data/vendor/liburing/.github/workflows/codespell.yml +25 -0
- data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
- data/vendor/liburing/.gitignore +41 -0
- data/vendor/liburing/CHANGELOG +111 -0
- data/vendor/liburing/CITATION.cff +11 -0
- data/vendor/liburing/COPYING +502 -0
- data/vendor/liburing/COPYING.GPL +339 -0
- data/vendor/liburing/LICENSE +20 -0
- data/vendor/liburing/Makefile +96 -0
- data/vendor/liburing/Makefile.common +7 -0
- data/vendor/liburing/Makefile.quiet +11 -0
- data/vendor/liburing/README +106 -0
- data/vendor/liburing/SECURITY.md +6 -0
- data/vendor/liburing/configure +624 -0
- data/vendor/liburing/debian/README.Debian +7 -0
- data/vendor/liburing/debian/changelog +38 -0
- data/vendor/liburing/debian/control +39 -0
- data/vendor/liburing/debian/copyright +49 -0
- data/vendor/liburing/debian/liburing-dev.install +4 -0
- data/vendor/liburing/debian/liburing-dev.manpages +5 -0
- data/vendor/liburing/debian/liburing2.install +1 -0
- data/vendor/liburing/debian/liburing2.symbols +56 -0
- data/vendor/liburing/debian/patches/series +1 -0
- data/vendor/liburing/debian/rules +29 -0
- data/vendor/liburing/debian/source/format +1 -0
- data/vendor/liburing/debian/source/local-options +2 -0
- data/vendor/liburing/debian/source/options +1 -0
- data/vendor/liburing/debian/watch +3 -0
- data/vendor/liburing/examples/Makefile +53 -0
- data/vendor/liburing/examples/helpers.c +62 -0
- data/vendor/liburing/examples/helpers.h +7 -0
- data/vendor/liburing/examples/io_uring-close-test.c +123 -0
- data/vendor/liburing/examples/io_uring-cp.c +282 -0
- data/vendor/liburing/examples/io_uring-test.c +112 -0
- data/vendor/liburing/examples/io_uring-udp.c +403 -0
- data/vendor/liburing/examples/link-cp.c +193 -0
- data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
- data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
- data/vendor/liburing/examples/poll-bench.c +101 -0
- data/vendor/liburing/examples/proxy.c +2461 -0
- data/vendor/liburing/examples/proxy.h +102 -0
- data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
- data/vendor/liburing/examples/send-zerocopy.c +658 -0
- data/vendor/liburing/examples/ucontext-cp.c +258 -0
- data/vendor/liburing/liburing-ffi.pc.in +12 -0
- data/vendor/liburing/liburing.pc.in +12 -0
- data/vendor/liburing/liburing.spec +66 -0
- data/vendor/liburing/make-debs.sh +55 -0
- data/vendor/liburing/src/Makefile +129 -0
- data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
- data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
- data/vendor/liburing/src/arch/generic/lib.h +17 -0
- data/vendor/liburing/src/arch/generic/syscall.h +100 -0
- data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
- data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
- data/vendor/liburing/src/arch/syscall-defs.h +94 -0
- data/vendor/liburing/src/arch/x86/lib.h +11 -0
- data/vendor/liburing/src/arch/x86/syscall.h +296 -0
- data/vendor/liburing/src/ffi.c +15 -0
- data/vendor/liburing/src/include/liburing/barrier.h +81 -0
- data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
- data/vendor/liburing/src/include/liburing.h +1602 -0
- data/vendor/liburing/src/int_flags.h +11 -0
- data/vendor/liburing/src/lib.h +52 -0
- data/vendor/liburing/src/liburing-ffi.map +211 -0
- data/vendor/liburing/src/liburing.map +104 -0
- data/vendor/liburing/src/nolibc.c +55 -0
- data/vendor/liburing/src/queue.c +468 -0
- data/vendor/liburing/src/register.c +374 -0
- data/vendor/liburing/src/setup.c +689 -0
- data/vendor/liburing/src/setup.h +9 -0
- data/vendor/liburing/src/syscall.c +29 -0
- data/vendor/liburing/src/syscall.h +53 -0
- data/vendor/liburing/src/version.c +21 -0
- data/vendor/liburing/test/232c93d07b74.c +305 -0
- data/vendor/liburing/test/35fa71a030ca.c +329 -0
- data/vendor/liburing/test/500f9fbadef8.c +91 -0
- data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
- data/vendor/liburing/test/8a9973408177.c +107 -0
- data/vendor/liburing/test/917257daa0fe.c +54 -0
- data/vendor/liburing/test/Makefile +297 -0
- data/vendor/liburing/test/a0908ae19763.c +59 -0
- data/vendor/liburing/test/a4c0b3decb33.c +181 -0
- data/vendor/liburing/test/accept-link.c +255 -0
- data/vendor/liburing/test/accept-non-empty.c +256 -0
- data/vendor/liburing/test/accept-reuse.c +163 -0
- data/vendor/liburing/test/accept-test.c +83 -0
- data/vendor/liburing/test/accept.c +919 -0
- data/vendor/liburing/test/across-fork.c +284 -0
- data/vendor/liburing/test/b19062a56726.c +54 -0
- data/vendor/liburing/test/b5837bd5311d.c +78 -0
- data/vendor/liburing/test/bind-listen.c +408 -0
- data/vendor/liburing/test/buf-ring-nommap.c +123 -0
- data/vendor/liburing/test/buf-ring-put.c +83 -0
- data/vendor/liburing/test/buf-ring.c +473 -0
- data/vendor/liburing/test/ce593a6c480a.c +139 -0
- data/vendor/liburing/test/close-opath.c +123 -0
- data/vendor/liburing/test/config +14 -0
- data/vendor/liburing/test/connect-rep.c +204 -0
- data/vendor/liburing/test/connect.c +442 -0
- data/vendor/liburing/test/coredump.c +60 -0
- data/vendor/liburing/test/cq-full.c +97 -0
- data/vendor/liburing/test/cq-overflow.c +530 -0
- data/vendor/liburing/test/cq-peek-batch.c +103 -0
- data/vendor/liburing/test/cq-ready.c +95 -0
- data/vendor/liburing/test/cq-size.c +65 -0
- data/vendor/liburing/test/d4ae271dfaae.c +96 -0
- data/vendor/liburing/test/d77a67ed5f27.c +65 -0
- data/vendor/liburing/test/defer-taskrun.c +391 -0
- data/vendor/liburing/test/defer-tw-timeout.c +173 -0
- data/vendor/liburing/test/defer.c +319 -0
- data/vendor/liburing/test/double-poll-crash.c +195 -0
- data/vendor/liburing/test/drop-submit.c +94 -0
- data/vendor/liburing/test/eeed8b54e0df.c +120 -0
- data/vendor/liburing/test/empty-eownerdead.c +45 -0
- data/vendor/liburing/test/eploop.c +74 -0
- data/vendor/liburing/test/eventfd-disable.c +179 -0
- data/vendor/liburing/test/eventfd-reg.c +77 -0
- data/vendor/liburing/test/eventfd-ring.c +98 -0
- data/vendor/liburing/test/eventfd.c +113 -0
- data/vendor/liburing/test/evloop.c +73 -0
- data/vendor/liburing/test/exec-target.c +6 -0
- data/vendor/liburing/test/exit-no-cleanup.c +117 -0
- data/vendor/liburing/test/fadvise.c +202 -0
- data/vendor/liburing/test/fallocate.c +265 -0
- data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
- data/vendor/liburing/test/fd-install.c +500 -0
- data/vendor/liburing/test/fd-pass.c +237 -0
- data/vendor/liburing/test/fdinfo.c +419 -0
- data/vendor/liburing/test/file-register.c +1189 -0
- data/vendor/liburing/test/file-update.c +231 -0
- data/vendor/liburing/test/file-verify.c +654 -0
- data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
- data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
- data/vendor/liburing/test/fixed-buf-iter.c +115 -0
- data/vendor/liburing/test/fixed-buf-merge.c +101 -0
- data/vendor/liburing/test/fixed-hugepage.c +411 -0
- data/vendor/liburing/test/fixed-link.c +90 -0
- data/vendor/liburing/test/fixed-reuse.c +160 -0
- data/vendor/liburing/test/fpos.c +255 -0
- data/vendor/liburing/test/fsnotify.c +118 -0
- data/vendor/liburing/test/fsync.c +224 -0
- data/vendor/liburing/test/futex.c +571 -0
- data/vendor/liburing/test/hardlink.c +170 -0
- data/vendor/liburing/test/helpers.c +318 -0
- data/vendor/liburing/test/helpers.h +108 -0
- data/vendor/liburing/test/ignore-single-mmap.c +48 -0
- data/vendor/liburing/test/init-mem.c +164 -0
- data/vendor/liburing/test/io-cancel.c +561 -0
- data/vendor/liburing/test/io_uring_enter.c +264 -0
- data/vendor/liburing/test/io_uring_passthrough.c +482 -0
- data/vendor/liburing/test/io_uring_register.c +503 -0
- data/vendor/liburing/test/io_uring_setup.c +110 -0
- data/vendor/liburing/test/iopoll-leak.c +85 -0
- data/vendor/liburing/test/iopoll-overflow.c +118 -0
- data/vendor/liburing/test/iopoll.c +465 -0
- data/vendor/liburing/test/lfs-openat-write.c +119 -0
- data/vendor/liburing/test/lfs-openat.c +273 -0
- data/vendor/liburing/test/link-timeout.c +1108 -0
- data/vendor/liburing/test/link.c +497 -0
- data/vendor/liburing/test/link_drain.c +255 -0
- data/vendor/liburing/test/madvise.c +195 -0
- data/vendor/liburing/test/min-timeout-wait.c +354 -0
- data/vendor/liburing/test/min-timeout.c +233 -0
- data/vendor/liburing/test/mkdir.c +112 -0
- data/vendor/liburing/test/msg-ring-fd.c +331 -0
- data/vendor/liburing/test/msg-ring-flags.c +212 -0
- data/vendor/liburing/test/msg-ring-overflow.c +159 -0
- data/vendor/liburing/test/msg-ring.c +467 -0
- data/vendor/liburing/test/multicqes_drain.c +429 -0
- data/vendor/liburing/test/napi-test.c +215 -0
- data/vendor/liburing/test/napi-test.sh +48 -0
- data/vendor/liburing/test/no-mmap-inval.c +42 -0
- data/vendor/liburing/test/nolibc.c +62 -0
- data/vendor/liburing/test/nop-all-sizes.c +99 -0
- data/vendor/liburing/test/nop.c +177 -0
- data/vendor/liburing/test/nvme.h +169 -0
- data/vendor/liburing/test/ooo-file-unreg.c +82 -0
- data/vendor/liburing/test/open-close.c +261 -0
- data/vendor/liburing/test/open-direct-link.c +188 -0
- data/vendor/liburing/test/open-direct-pick.c +180 -0
- data/vendor/liburing/test/openat2.c +312 -0
- data/vendor/liburing/test/personality.c +204 -0
- data/vendor/liburing/test/pipe-bug.c +95 -0
- data/vendor/liburing/test/pipe-eof.c +83 -0
- data/vendor/liburing/test/pipe-reuse.c +105 -0
- data/vendor/liburing/test/poll-cancel-all.c +496 -0
- data/vendor/liburing/test/poll-cancel-ton.c +135 -0
- data/vendor/liburing/test/poll-cancel.c +228 -0
- data/vendor/liburing/test/poll-link.c +221 -0
- data/vendor/liburing/test/poll-many.c +230 -0
- data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
- data/vendor/liburing/test/poll-mshot-update.c +323 -0
- data/vendor/liburing/test/poll-race-mshot.c +276 -0
- data/vendor/liburing/test/poll-race.c +105 -0
- data/vendor/liburing/test/poll-ring.c +48 -0
- data/vendor/liburing/test/poll-v-poll.c +353 -0
- data/vendor/liburing/test/poll.c +327 -0
- data/vendor/liburing/test/probe.c +135 -0
- data/vendor/liburing/test/read-before-exit.c +129 -0
- data/vendor/liburing/test/read-mshot-empty.c +153 -0
- data/vendor/liburing/test/read-mshot.c +404 -0
- data/vendor/liburing/test/read-write.c +1013 -0
- data/vendor/liburing/test/recv-msgall-stream.c +398 -0
- data/vendor/liburing/test/recv-msgall.c +263 -0
- data/vendor/liburing/test/recv-multishot.c +602 -0
- data/vendor/liburing/test/recvsend_bundle.c +691 -0
- data/vendor/liburing/test/reg-fd-only.c +131 -0
- data/vendor/liburing/test/reg-hint.c +56 -0
- data/vendor/liburing/test/reg-reg-ring.c +90 -0
- data/vendor/liburing/test/regbuf-merge.c +91 -0
- data/vendor/liburing/test/register-restrictions.c +633 -0
- data/vendor/liburing/test/rename.c +132 -0
- data/vendor/liburing/test/ring-leak.c +283 -0
- data/vendor/liburing/test/ring-leak2.c +249 -0
- data/vendor/liburing/test/ringbuf-read.c +196 -0
- data/vendor/liburing/test/ringbuf-status.c +242 -0
- data/vendor/liburing/test/rsrc_tags.c +461 -0
- data/vendor/liburing/test/runtests-loop.sh +16 -0
- data/vendor/liburing/test/runtests-quiet.sh +11 -0
- data/vendor/liburing/test/runtests.sh +168 -0
- data/vendor/liburing/test/rw_merge_test.c +98 -0
- data/vendor/liburing/test/self.c +91 -0
- data/vendor/liburing/test/send-zerocopy.c +971 -0
- data/vendor/liburing/test/send_recv.c +412 -0
- data/vendor/liburing/test/send_recvmsg.c +444 -0
- data/vendor/liburing/test/shared-wq.c +84 -0
- data/vendor/liburing/test/short-read.c +75 -0
- data/vendor/liburing/test/shutdown.c +165 -0
- data/vendor/liburing/test/sigfd-deadlock.c +88 -0
- data/vendor/liburing/test/single-issuer.c +169 -0
- data/vendor/liburing/test/skip-cqe.c +428 -0
- data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
- data/vendor/liburing/test/socket-io-cmd.c +237 -0
- data/vendor/liburing/test/socket-rw-eagain.c +149 -0
- data/vendor/liburing/test/socket-rw-offset.c +149 -0
- data/vendor/liburing/test/socket-rw.c +137 -0
- data/vendor/liburing/test/socket.c +408 -0
- data/vendor/liburing/test/splice.c +512 -0
- data/vendor/liburing/test/sq-full-cpp.cc +45 -0
- data/vendor/liburing/test/sq-full.c +45 -0
- data/vendor/liburing/test/sq-poll-dup.c +211 -0
- data/vendor/liburing/test/sq-poll-kthread.c +169 -0
- data/vendor/liburing/test/sq-poll-share.c +138 -0
- data/vendor/liburing/test/sq-space_left.c +159 -0
- data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
- data/vendor/liburing/test/sqpoll-exec.c +132 -0
- data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
- data/vendor/liburing/test/sqpoll-sleep.c +69 -0
- data/vendor/liburing/test/statx.c +172 -0
- data/vendor/liburing/test/stdout.c +232 -0
- data/vendor/liburing/test/submit-and-wait.c +108 -0
- data/vendor/liburing/test/submit-link-fail.c +156 -0
- data/vendor/liburing/test/submit-reuse.c +237 -0
- data/vendor/liburing/test/symlink.c +117 -0
- data/vendor/liburing/test/sync-cancel.c +235 -0
- data/vendor/liburing/test/teardowns.c +58 -0
- data/vendor/liburing/test/test.h +36 -0
- data/vendor/liburing/test/thread-exit.c +143 -0
- data/vendor/liburing/test/timeout-new.c +256 -0
- data/vendor/liburing/test/timeout.c +1798 -0
- data/vendor/liburing/test/truncate.c +186 -0
- data/vendor/liburing/test/tty-write-dpoll.c +60 -0
- data/vendor/liburing/test/unlink.c +112 -0
- data/vendor/liburing/test/version.c +25 -0
- data/vendor/liburing/test/wait-timeout.c +287 -0
- data/vendor/liburing/test/waitid.c +373 -0
- data/vendor/liburing/test/wakeup-hang.c +162 -0
- data/vendor/liburing/test/wq-aff.c +146 -0
- data/vendor/liburing/test/xattr.c +442 -0
- metadata +412 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
// https://syzkaller.appspot.com/bug?id=99f4ea77bb9b9ef24cefb66469be319f4aa9f162
|
|
3
|
+
// autogenerated by syzkaller (https://github.com/google/syzkaller)
|
|
4
|
+
|
|
5
|
+
#include <dirent.h>
|
|
6
|
+
#include <endian.h>
|
|
7
|
+
#include <errno.h>
|
|
8
|
+
#include <fcntl.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/mman.h>
|
|
17
|
+
#include <sys/prctl.h>
|
|
18
|
+
#include <sys/stat.h>
|
|
19
|
+
#include <sys/types.h>
|
|
20
|
+
#include <sys/wait.h>
|
|
21
|
+
#include <time.h>
|
|
22
|
+
#include <unistd.h>
|
|
23
|
+
|
|
24
|
+
#include "liburing.h"
|
|
25
|
+
#include "../src/syscall.h"
|
|
26
|
+
|
|
27
|
+
static void sleep_ms(uint64_t ms)
|
|
28
|
+
{
|
|
29
|
+
usleep(ms * 1000);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static uint64_t current_time_ms(void)
|
|
33
|
+
{
|
|
34
|
+
struct timespec ts;
|
|
35
|
+
if (clock_gettime(CLOCK_MONOTONIC, &ts))
|
|
36
|
+
exit(1);
|
|
37
|
+
return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static bool write_file(const char* file, const char* what, ...)
|
|
41
|
+
{
|
|
42
|
+
char buf[1024];
|
|
43
|
+
va_list args;
|
|
44
|
+
va_start(args, what);
|
|
45
|
+
vsnprintf(buf, sizeof(buf), what, args);
|
|
46
|
+
va_end(args);
|
|
47
|
+
buf[sizeof(buf) - 1] = 0;
|
|
48
|
+
int len = strlen(buf);
|
|
49
|
+
int fd = open(file, O_WRONLY | O_CLOEXEC);
|
|
50
|
+
if (fd == -1)
|
|
51
|
+
return false;
|
|
52
|
+
if (write(fd, buf, len) != len) {
|
|
53
|
+
int err = errno;
|
|
54
|
+
close(fd);
|
|
55
|
+
errno = err;
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
close(fd);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#define SIZEOF_IO_URING_SQE 64
|
|
63
|
+
#define SIZEOF_IO_URING_CQE 16
|
|
64
|
+
#define SQ_HEAD_OFFSET 0
|
|
65
|
+
#define SQ_TAIL_OFFSET 64
|
|
66
|
+
#define SQ_RING_MASK_OFFSET 256
|
|
67
|
+
#define SQ_RING_ENTRIES_OFFSET 264
|
|
68
|
+
#define SQ_FLAGS_OFFSET 276
|
|
69
|
+
#define SQ_DROPPED_OFFSET 272
|
|
70
|
+
#define CQ_HEAD_OFFSET 128
|
|
71
|
+
#define CQ_TAIL_OFFSET 192
|
|
72
|
+
#define CQ_RING_MASK_OFFSET 260
|
|
73
|
+
#define CQ_RING_ENTRIES_OFFSET 268
|
|
74
|
+
#define CQ_RING_OVERFLOW_OFFSET 284
|
|
75
|
+
#define CQ_FLAGS_OFFSET 280
|
|
76
|
+
#define CQ_CQES_OFFSET 320
|
|
77
|
+
|
|
78
|
+
static long syz_io_uring_setup(volatile long a0, volatile long a1,
|
|
79
|
+
volatile long a2, volatile long a3,
|
|
80
|
+
volatile long a4, volatile long a5)
|
|
81
|
+
{
|
|
82
|
+
uint32_t entries = (uint32_t)a0;
|
|
83
|
+
struct io_uring_params* setup_params = (struct io_uring_params*)a1;
|
|
84
|
+
void* vma1 = (void*)a2;
|
|
85
|
+
void* vma2 = (void*)a3;
|
|
86
|
+
void** ring_ptr_out = (void**)a4;
|
|
87
|
+
void** sqes_ptr_out = (void**)a5;
|
|
88
|
+
uint32_t fd_io_uring = __sys_io_uring_setup(entries, setup_params);
|
|
89
|
+
uint32_t sq_ring_sz =
|
|
90
|
+
setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t);
|
|
91
|
+
uint32_t cq_ring_sz = setup_params->cq_off.cqes +
|
|
92
|
+
setup_params->cq_entries * SIZEOF_IO_URING_CQE;
|
|
93
|
+
uint32_t ring_sz = sq_ring_sz > cq_ring_sz ? sq_ring_sz : cq_ring_sz;
|
|
94
|
+
*ring_ptr_out = mmap(vma1, ring_sz, PROT_READ | PROT_WRITE,
|
|
95
|
+
MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring,
|
|
96
|
+
IORING_OFF_SQ_RING);
|
|
97
|
+
uint32_t sqes_sz = setup_params->sq_entries * SIZEOF_IO_URING_SQE;
|
|
98
|
+
*sqes_ptr_out =
|
|
99
|
+
mmap(vma2, sqes_sz, PROT_READ | PROT_WRITE,
|
|
100
|
+
MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQES);
|
|
101
|
+
return fd_io_uring;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static void kill_and_wait(int pid, int* status)
|
|
105
|
+
{
|
|
106
|
+
kill(-pid, SIGKILL);
|
|
107
|
+
kill(pid, SIGKILL);
|
|
108
|
+
for (int i = 0; i < 100; i++) {
|
|
109
|
+
if (waitpid(-1, status, WNOHANG | __WALL) == pid)
|
|
110
|
+
return;
|
|
111
|
+
usleep(1000);
|
|
112
|
+
}
|
|
113
|
+
DIR* dir = opendir("/sys/fs/fuse/connections");
|
|
114
|
+
if (dir) {
|
|
115
|
+
for (;;) {
|
|
116
|
+
struct dirent* ent = readdir(dir);
|
|
117
|
+
if (!ent)
|
|
118
|
+
break;
|
|
119
|
+
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
|
|
120
|
+
continue;
|
|
121
|
+
char abort[300];
|
|
122
|
+
snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
|
|
123
|
+
ent->d_name);
|
|
124
|
+
int fd = open(abort, O_WRONLY);
|
|
125
|
+
if (fd == -1) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (write(fd, abort, 1) < 0) {
|
|
129
|
+
}
|
|
130
|
+
close(fd);
|
|
131
|
+
}
|
|
132
|
+
closedir(dir);
|
|
133
|
+
} else {
|
|
134
|
+
}
|
|
135
|
+
while (waitpid(-1, status, __WALL) != pid) {
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static void setup_test(void)
|
|
140
|
+
{
|
|
141
|
+
prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
|
|
142
|
+
setpgrp();
|
|
143
|
+
write_file("/proc/self/oom_score_adj", "1000");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static void execute_one(void);
|
|
147
|
+
|
|
148
|
+
#define WAIT_FLAGS __WALL
|
|
149
|
+
|
|
150
|
+
static void loop(void)
|
|
151
|
+
{
|
|
152
|
+
int iter = 0;
|
|
153
|
+
for (; iter < 100; iter++) {
|
|
154
|
+
int pid = fork();
|
|
155
|
+
if (pid < 0)
|
|
156
|
+
exit(1);
|
|
157
|
+
if (pid == 0) {
|
|
158
|
+
setup_test();
|
|
159
|
+
execute_one();
|
|
160
|
+
exit(0);
|
|
161
|
+
}
|
|
162
|
+
int status = 0;
|
|
163
|
+
uint64_t start = current_time_ms();
|
|
164
|
+
for (;;) {
|
|
165
|
+
if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
|
|
166
|
+
break;
|
|
167
|
+
sleep_ms(1);
|
|
168
|
+
if (current_time_ms() - start < 5000) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
kill_and_wait(pid, &status);
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
void execute_one(void)
|
|
178
|
+
{
|
|
179
|
+
*(uint32_t*)0x20000044 = 0;
|
|
180
|
+
*(uint32_t*)0x20000048 = 0x42;
|
|
181
|
+
*(uint32_t*)0x2000004c = 0;
|
|
182
|
+
*(uint32_t*)0x20000050 = 0;
|
|
183
|
+
*(uint32_t*)0x20000058 = -1;
|
|
184
|
+
*(uint32_t*)0x2000005c = 0;
|
|
185
|
+
*(uint32_t*)0x20000060 = 0;
|
|
186
|
+
*(uint32_t*)0x20000064 = 0;
|
|
187
|
+
syz_io_uring_setup(0x74bc, 0x20000040, 0x20ffb000, 0x20ffc000, 0, 0);
|
|
188
|
+
}
|
|
189
|
+
int main(void)
|
|
190
|
+
{
|
|
191
|
+
mmap((void *)0x1ffff000ul, 0x1000ul, 0ul, MAP_ANON|MAP_PRIVATE, -1, 0ul);
|
|
192
|
+
mmap((void *)0x20000000ul, 0x1000000ul, 7ul, MAP_ANON|MAP_PRIVATE, -1, 0ul);
|
|
193
|
+
mmap((void *)0x21000000ul, 0x1000ul, 0ul, MAP_ANON|MAP_PRIVATE, -1, 0ul);
|
|
194
|
+
loop();
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: Check that closing a file with SQPOLL has it immediately closed
|
|
4
|
+
* upon receiving the CQE for the close. The 6.9 kernel had a bug
|
|
5
|
+
* where SQPOLL would not run kernel wide task_work when running the
|
|
6
|
+
* private task_work, which would defer the close if this was the
|
|
7
|
+
* final close of the file.
|
|
8
|
+
*/
|
|
9
|
+
#include <errno.h>
|
|
10
|
+
#include <stdio.h>
|
|
11
|
+
#include <unistd.h>
|
|
12
|
+
#include <stdlib.h>
|
|
13
|
+
#include <string.h>
|
|
14
|
+
#include <fcntl.h>
|
|
15
|
+
#include <sys/time.h>
|
|
16
|
+
#include <sys/wait.h>
|
|
17
|
+
#include <sys/types.h>
|
|
18
|
+
#include <sys/stat.h>
|
|
19
|
+
|
|
20
|
+
#include "helpers.h"
|
|
21
|
+
#include "liburing.h"
|
|
22
|
+
|
|
23
|
+
static int fill_exec_target(char *dst, char *path)
|
|
24
|
+
{
|
|
25
|
+
struct stat sb;
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* Should either be ./exec-target.t or test/exec-target.t
|
|
29
|
+
*/
|
|
30
|
+
sprintf(dst, "%s", path);
|
|
31
|
+
return stat(dst, &sb);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static int test_exec(struct io_uring *ring, char * const argv[])
|
|
35
|
+
{
|
|
36
|
+
char prog_path[PATH_MAX];
|
|
37
|
+
struct io_uring_sqe *sqe;
|
|
38
|
+
struct io_uring_cqe *cqe;
|
|
39
|
+
int ret, wstatus, fd;
|
|
40
|
+
pid_t p;
|
|
41
|
+
|
|
42
|
+
if (fill_exec_target(prog_path, "./exec-target.t") &&
|
|
43
|
+
fill_exec_target(prog_path, "test/exec-target.t")) {
|
|
44
|
+
fprintf(stdout, "Can't find exec-target, skipping\n");
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
sqe = io_uring_get_sqe(ring);
|
|
49
|
+
io_uring_prep_openat(sqe, AT_FDCWD, prog_path, O_WRONLY, 0);
|
|
50
|
+
sqe->user_data = 0;
|
|
51
|
+
|
|
52
|
+
io_uring_submit(ring);
|
|
53
|
+
|
|
54
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
55
|
+
if (ret) {
|
|
56
|
+
fprintf(stderr, "wait cqe %d\n", ret);
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
if (cqe->res < 0) {
|
|
60
|
+
fprintf(stderr, "open: %d\n", cqe->res);
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
fd = cqe->res;
|
|
64
|
+
io_uring_cqe_seen(ring, cqe);
|
|
65
|
+
|
|
66
|
+
sqe = io_uring_get_sqe(ring);
|
|
67
|
+
io_uring_prep_close(sqe, fd);
|
|
68
|
+
sqe->user_data = 1;
|
|
69
|
+
|
|
70
|
+
io_uring_submit(ring);
|
|
71
|
+
|
|
72
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
73
|
+
if (ret) {
|
|
74
|
+
fprintf(stderr, "wait cqe %d\n", ret);
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
if (cqe->res < 0) {
|
|
78
|
+
fprintf(stderr, "close: %d\n", cqe->res);
|
|
79
|
+
return 1;
|
|
80
|
+
}
|
|
81
|
+
io_uring_cqe_seen(ring, cqe);
|
|
82
|
+
|
|
83
|
+
p = fork();
|
|
84
|
+
if (p == -1) {
|
|
85
|
+
fprintf(stderr, "fork() failed\n");
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (p == 0) {
|
|
90
|
+
/* file should be closed, try exec'ing it */
|
|
91
|
+
ret = execve(prog_path, argv, NULL);
|
|
92
|
+
if (ret) {
|
|
93
|
+
fprintf(stderr, "exec failed: %s\n", strerror(errno));
|
|
94
|
+
exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (waitpid(p, &wstatus, 0) == (pid_t)-1) {
|
|
99
|
+
perror("waitpid()");
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus))
|
|
103
|
+
return 1;
|
|
104
|
+
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
int main(int argc, char * const argv[])
|
|
109
|
+
{
|
|
110
|
+
struct io_uring_params p = { .flags = IORING_SETUP_SQPOLL, };
|
|
111
|
+
struct io_uring ring;
|
|
112
|
+
int ret, i;
|
|
113
|
+
|
|
114
|
+
if (argc > 1)
|
|
115
|
+
return T_EXIT_SKIP;
|
|
116
|
+
|
|
117
|
+
ret = t_create_ring_params(8, &ring, &p);
|
|
118
|
+
if (ret == T_SETUP_SKIP)
|
|
119
|
+
return T_EXIT_SKIP;
|
|
120
|
+
else if (ret != T_SETUP_OK)
|
|
121
|
+
return T_EXIT_FAIL;
|
|
122
|
+
|
|
123
|
+
for (i = 0; i < 20; i++) {
|
|
124
|
+
ret = test_exec(&ring, argv);
|
|
125
|
+
if (ret) {
|
|
126
|
+
fprintf(stderr, "test_exec failed\n");
|
|
127
|
+
return ret;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return T_EXIT_PASS;
|
|
132
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Test that we exit properly with SQPOLL and having a request that
|
|
4
|
+
* adds a circular reference to the ring itself.
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <stdlib.h>
|
|
9
|
+
#include <unistd.h>
|
|
10
|
+
#include <sys/time.h>
|
|
11
|
+
#include <poll.h>
|
|
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
|
+
}
|
|
38
|
+
|
|
39
|
+
int main(int argc, char *argv[])
|
|
40
|
+
{
|
|
41
|
+
struct io_uring_params p = {};
|
|
42
|
+
struct timeval tv;
|
|
43
|
+
struct io_uring ring;
|
|
44
|
+
struct io_uring_sqe *sqe;
|
|
45
|
+
int ret;
|
|
46
|
+
|
|
47
|
+
if (argc > 1)
|
|
48
|
+
return 0;
|
|
49
|
+
|
|
50
|
+
p.flags = IORING_SETUP_SQPOLL;
|
|
51
|
+
p.sq_thread_idle = 100;
|
|
52
|
+
|
|
53
|
+
ret = io_uring_queue_init_params(1, &ring, &p);
|
|
54
|
+
if (ret) {
|
|
55
|
+
if (geteuid()) {
|
|
56
|
+
printf("%s: skipped, not root\n", argv[0]);
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
fprintf(stderr, "queue_init=%d\n", ret);
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!(p.features & IORING_FEAT_SQPOLL_NONFIXED)) {
|
|
64
|
+
fprintf(stdout, "Skipping\n");
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
sqe = io_uring_get_sqe(&ring);
|
|
69
|
+
io_uring_prep_poll_add(sqe, ring.ring_fd, POLLIN);
|
|
70
|
+
io_uring_submit(&ring);
|
|
71
|
+
|
|
72
|
+
gettimeofday(&tv, NULL);
|
|
73
|
+
do {
|
|
74
|
+
usleep(1000);
|
|
75
|
+
} while (mtime_since_now(&tv) < 1000);
|
|
76
|
+
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Test that the sqthread goes to sleep around the specified time, and that
|
|
4
|
+
* the NEED_WAKEUP flag is then set.
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <stdlib.h>
|
|
9
|
+
#include <unistd.h>
|
|
10
|
+
#include <sys/time.h>
|
|
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
|
+
}
|
|
37
|
+
|
|
38
|
+
int main(int argc, char *argv[])
|
|
39
|
+
{
|
|
40
|
+
struct io_uring_params p = {};
|
|
41
|
+
struct timeval tv;
|
|
42
|
+
struct io_uring ring;
|
|
43
|
+
int ret;
|
|
44
|
+
|
|
45
|
+
if (argc > 1)
|
|
46
|
+
return 0;
|
|
47
|
+
|
|
48
|
+
p.flags = IORING_SETUP_SQPOLL;
|
|
49
|
+
p.sq_thread_idle = 100;
|
|
50
|
+
|
|
51
|
+
ret = io_uring_queue_init_params(1, &ring, &p);
|
|
52
|
+
if (ret) {
|
|
53
|
+
if (geteuid()) {
|
|
54
|
+
printf("%s: skipped, not root\n", argv[0]);
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
fprintf(stderr, "queue_init=%d\n", ret);
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
gettimeofday(&tv, NULL);
|
|
62
|
+
do {
|
|
63
|
+
usleep(1000);
|
|
64
|
+
if ((*ring.sq.kflags) & IORING_SQ_NEED_WAKEUP)
|
|
65
|
+
return 0;
|
|
66
|
+
} while (mtime_since_now(&tv) < 1000);
|
|
67
|
+
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* Description: run various statx(2) tests
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdio.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <string.h>
|
|
11
|
+
#include <fcntl.h>
|
|
12
|
+
#include <sys/types.h>
|
|
13
|
+
#include <sys/syscall.h>
|
|
14
|
+
#include <sys/stat.h>
|
|
15
|
+
|
|
16
|
+
#include "helpers.h"
|
|
17
|
+
#include "liburing.h"
|
|
18
|
+
|
|
19
|
+
#ifdef __NR_statx
|
|
20
|
+
static int do_statx(int dfd, const char *path, int flags, unsigned mask,
|
|
21
|
+
struct statx *statxbuf)
|
|
22
|
+
{
|
|
23
|
+
return syscall(__NR_statx, dfd, path, flags, mask, statxbuf);
|
|
24
|
+
}
|
|
25
|
+
#else
|
|
26
|
+
static int do_statx(int dfd, const char *path, int flags, unsigned mask,
|
|
27
|
+
struct statx *statxbuf)
|
|
28
|
+
{
|
|
29
|
+
errno = ENOSYS;
|
|
30
|
+
return -1;
|
|
31
|
+
}
|
|
32
|
+
#endif
|
|
33
|
+
|
|
34
|
+
static int statx_syscall_supported(void)
|
|
35
|
+
{
|
|
36
|
+
return errno == ENOSYS ? 0 : -1;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static int test_statx(struct io_uring *ring, const char *path)
|
|
40
|
+
{
|
|
41
|
+
struct io_uring_cqe *cqe;
|
|
42
|
+
struct io_uring_sqe *sqe;
|
|
43
|
+
struct statx x1 = { }, x2 = { };
|
|
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, &x1);
|
|
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)
|
|
67
|
+
return ret;
|
|
68
|
+
ret = do_statx(-1, path, 0, STATX_ALL, &x2);
|
|
69
|
+
if (ret < 0)
|
|
70
|
+
return statx_syscall_supported();
|
|
71
|
+
if (memcmp(&x1, &x2, sizeof(x1))) {
|
|
72
|
+
fprintf(stderr, "Miscompare between io_uring and statx\n");
|
|
73
|
+
goto err;
|
|
74
|
+
}
|
|
75
|
+
return 0;
|
|
76
|
+
err:
|
|
77
|
+
return -1;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
static int test_statx_fd(struct io_uring *ring, const char *path)
|
|
81
|
+
{
|
|
82
|
+
struct io_uring_cqe *cqe;
|
|
83
|
+
struct io_uring_sqe *sqe;
|
|
84
|
+
struct statx x1, x2;
|
|
85
|
+
int ret, fd;
|
|
86
|
+
|
|
87
|
+
fd = open(path, O_RDONLY);
|
|
88
|
+
if (fd < 0) {
|
|
89
|
+
perror("open");
|
|
90
|
+
return 1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
memset(&x1, 0, sizeof(x1));
|
|
94
|
+
|
|
95
|
+
sqe = io_uring_get_sqe(ring);
|
|
96
|
+
if (!sqe) {
|
|
97
|
+
fprintf(stderr, "get sqe failed\n");
|
|
98
|
+
goto err;
|
|
99
|
+
}
|
|
100
|
+
io_uring_prep_statx(sqe, fd, "", AT_EMPTY_PATH, STATX_ALL, &x1);
|
|
101
|
+
|
|
102
|
+
ret = io_uring_submit(ring);
|
|
103
|
+
if (ret <= 0) {
|
|
104
|
+
fprintf(stderr, "sqe submit failed: %d\n", ret);
|
|
105
|
+
goto err;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
ret = io_uring_wait_cqe(ring, &cqe);
|
|
109
|
+
if (ret < 0) {
|
|
110
|
+
fprintf(stderr, "wait completion %d\n", ret);
|
|
111
|
+
goto err;
|
|
112
|
+
}
|
|
113
|
+
ret = cqe->res;
|
|
114
|
+
io_uring_cqe_seen(ring, cqe);
|
|
115
|
+
if (ret)
|
|
116
|
+
return ret;
|
|
117
|
+
memset(&x2, 0, sizeof(x2));
|
|
118
|
+
ret = do_statx(fd, "", AT_EMPTY_PATH, STATX_ALL, &x2);
|
|
119
|
+
if (ret < 0)
|
|
120
|
+
return statx_syscall_supported();
|
|
121
|
+
if (memcmp(&x1, &x2, sizeof(x1))) {
|
|
122
|
+
fprintf(stderr, "Miscompare between io_uring and statx\n");
|
|
123
|
+
goto err;
|
|
124
|
+
}
|
|
125
|
+
return 0;
|
|
126
|
+
err:
|
|
127
|
+
return -1;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
int main(int argc, char *argv[])
|
|
131
|
+
{
|
|
132
|
+
struct io_uring ring;
|
|
133
|
+
const char *fname;
|
|
134
|
+
int ret;
|
|
135
|
+
|
|
136
|
+
ret = io_uring_queue_init(8, &ring, 0);
|
|
137
|
+
if (ret) {
|
|
138
|
+
fprintf(stderr, "ring setup failed\n");
|
|
139
|
+
return 1;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (argc > 1) {
|
|
143
|
+
fname = argv[1];
|
|
144
|
+
} else {
|
|
145
|
+
fname = "/tmp/.statx";
|
|
146
|
+
t_create_file(fname, 4096);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
ret = test_statx(&ring, fname);
|
|
150
|
+
if (ret) {
|
|
151
|
+
if (ret == -EINVAL) {
|
|
152
|
+
fprintf(stdout, "statx not supported, skipping\n");
|
|
153
|
+
goto done;
|
|
154
|
+
}
|
|
155
|
+
fprintf(stderr, "test_statx failed: %d\n", ret);
|
|
156
|
+
goto err;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
ret = test_statx_fd(&ring, fname);
|
|
160
|
+
if (ret) {
|
|
161
|
+
fprintf(stderr, "test_statx_fd failed: %d\n", ret);
|
|
162
|
+
goto err;
|
|
163
|
+
}
|
|
164
|
+
done:
|
|
165
|
+
if (fname != argv[1])
|
|
166
|
+
unlink(fname);
|
|
167
|
+
return 0;
|
|
168
|
+
err:
|
|
169
|
+
if (fname != argv[1])
|
|
170
|
+
unlink(fname);
|
|
171
|
+
return 1;
|
|
172
|
+
}
|