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,258 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
/*
|
|
3
|
+
* gcc -Wall -O2 -D_GNU_SOURCE -o ucontext-cp ucontext-cp.c -luring
|
|
4
|
+
*/
|
|
5
|
+
#define _POSIX_C_SOURCE 199309L
|
|
6
|
+
#include <stdio.h>
|
|
7
|
+
#include <fcntl.h>
|
|
8
|
+
#include <string.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <unistd.h>
|
|
11
|
+
#include <assert.h>
|
|
12
|
+
#include <errno.h>
|
|
13
|
+
#include <ucontext.h>
|
|
14
|
+
#include <signal.h>
|
|
15
|
+
#include <inttypes.h>
|
|
16
|
+
#include <sys/types.h>
|
|
17
|
+
#include <sys/ioctl.h>
|
|
18
|
+
#include <sys/timerfd.h>
|
|
19
|
+
#include <poll.h>
|
|
20
|
+
#include "liburing.h"
|
|
21
|
+
|
|
22
|
+
#define QD 64
|
|
23
|
+
#define BS 1024
|
|
24
|
+
|
|
25
|
+
#ifndef SIGSTKSZ
|
|
26
|
+
#define SIGSTKSZ 8192
|
|
27
|
+
#endif
|
|
28
|
+
|
|
29
|
+
typedef struct {
|
|
30
|
+
struct io_uring *ring;
|
|
31
|
+
unsigned char *stack_buf;
|
|
32
|
+
ucontext_t ctx_main, ctx_fnew;
|
|
33
|
+
} async_context;
|
|
34
|
+
|
|
35
|
+
typedef struct {
|
|
36
|
+
async_context *pctx;
|
|
37
|
+
int *psuccess;
|
|
38
|
+
int *pfailure;
|
|
39
|
+
int infd;
|
|
40
|
+
int outfd;
|
|
41
|
+
} arguments_bundle;
|
|
42
|
+
|
|
43
|
+
#define DEFINE_AWAIT_OP(operation) \
|
|
44
|
+
static ssize_t await_##operation( \
|
|
45
|
+
async_context *pctx, \
|
|
46
|
+
int fd, \
|
|
47
|
+
const struct iovec *ioves, \
|
|
48
|
+
unsigned int nr_vecs, \
|
|
49
|
+
off_t offset) \
|
|
50
|
+
{ \
|
|
51
|
+
struct io_uring_sqe *sqe = io_uring_get_sqe(pctx->ring); \
|
|
52
|
+
struct io_uring_cqe *cqe; \
|
|
53
|
+
\
|
|
54
|
+
if (!sqe) \
|
|
55
|
+
return -1; \
|
|
56
|
+
\
|
|
57
|
+
io_uring_prep_##operation(sqe, fd, ioves, nr_vecs, offset); \
|
|
58
|
+
io_uring_sqe_set_data(sqe, pctx); \
|
|
59
|
+
swapcontext(&pctx->ctx_fnew, &pctx->ctx_main); \
|
|
60
|
+
io_uring_peek_cqe(pctx->ring, &cqe); \
|
|
61
|
+
assert(cqe); \
|
|
62
|
+
io_uring_cqe_seen(pctx->ring, cqe); \
|
|
63
|
+
\
|
|
64
|
+
return cqe->res; \
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
DEFINE_AWAIT_OP(readv)
|
|
68
|
+
DEFINE_AWAIT_OP(writev)
|
|
69
|
+
#undef DEFINE_AWAIT_OP
|
|
70
|
+
|
|
71
|
+
static int await_delay(async_context *pctx, time_t seconds)
|
|
72
|
+
{
|
|
73
|
+
struct io_uring_sqe *sqe = io_uring_get_sqe(pctx->ring);
|
|
74
|
+
struct io_uring_cqe *cqe;
|
|
75
|
+
struct __kernel_timespec ts = {
|
|
76
|
+
.tv_sec = seconds,
|
|
77
|
+
.tv_nsec = 0
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
if (!sqe)
|
|
81
|
+
return -1;
|
|
82
|
+
|
|
83
|
+
io_uring_prep_timeout(sqe, &ts, 0, 0);
|
|
84
|
+
io_uring_sqe_set_data(sqe, pctx);
|
|
85
|
+
swapcontext(&pctx->ctx_fnew, &pctx->ctx_main);
|
|
86
|
+
io_uring_peek_cqe(pctx->ring, &cqe);
|
|
87
|
+
assert(cqe);
|
|
88
|
+
io_uring_cqe_seen(pctx->ring, cqe);
|
|
89
|
+
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static int setup_context(async_context *pctx, struct io_uring *ring)
|
|
94
|
+
{
|
|
95
|
+
int ret;
|
|
96
|
+
|
|
97
|
+
pctx->ring = ring;
|
|
98
|
+
ret = getcontext(&pctx->ctx_fnew);
|
|
99
|
+
if (ret < 0) {
|
|
100
|
+
perror("getcontext");
|
|
101
|
+
return -1;
|
|
102
|
+
}
|
|
103
|
+
pctx->stack_buf = malloc(SIGSTKSZ);
|
|
104
|
+
if (!pctx->stack_buf) {
|
|
105
|
+
perror("malloc");
|
|
106
|
+
return -1;
|
|
107
|
+
}
|
|
108
|
+
pctx->ctx_fnew.uc_stack.ss_sp = pctx->stack_buf;
|
|
109
|
+
pctx->ctx_fnew.uc_stack.ss_size = SIGSTKSZ;
|
|
110
|
+
pctx->ctx_fnew.uc_link = &pctx->ctx_main;
|
|
111
|
+
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
static int copy_file(async_context *pctx, int infd, int outfd, struct iovec* piov)
|
|
116
|
+
{
|
|
117
|
+
off_t offset = 0;
|
|
118
|
+
|
|
119
|
+
for (;;) {
|
|
120
|
+
ssize_t bytes_read;
|
|
121
|
+
|
|
122
|
+
printf("%d->%d: readv %ld bytes from %ld\n", infd, outfd, (long) piov->iov_len, (long) offset);
|
|
123
|
+
if ((bytes_read = await_readv(pctx, infd, piov, 1, offset)) < 0) {
|
|
124
|
+
perror("await_readv");
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
if (bytes_read == 0)
|
|
128
|
+
return 0;
|
|
129
|
+
|
|
130
|
+
piov->iov_len = bytes_read;
|
|
131
|
+
|
|
132
|
+
printf("%d->%d: writev %ld bytes from %ld\n", infd, outfd, (long) piov->iov_len, (long) offset);
|
|
133
|
+
if (await_writev(pctx, outfd, piov, 1, offset) != bytes_read) {
|
|
134
|
+
perror("await_writev");
|
|
135
|
+
return 1;
|
|
136
|
+
}
|
|
137
|
+
if (bytes_read < BS)
|
|
138
|
+
return 0;
|
|
139
|
+
offset += bytes_read;
|
|
140
|
+
|
|
141
|
+
printf("%d->%d: wait %ds\n", infd, outfd, 1);
|
|
142
|
+
await_delay(pctx, 1);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static void copy_file_wrapper(arguments_bundle *pbundle)
|
|
147
|
+
{
|
|
148
|
+
struct iovec iov = {
|
|
149
|
+
.iov_base = malloc(BS),
|
|
150
|
+
.iov_len = BS,
|
|
151
|
+
};
|
|
152
|
+
async_context *pctx = pbundle->pctx;
|
|
153
|
+
|
|
154
|
+
int ret = copy_file(pctx, pbundle->infd, pbundle->outfd, &iov);
|
|
155
|
+
|
|
156
|
+
printf("%d->%d: done with ret code %d\n", pbundle->infd, pbundle->outfd, ret);
|
|
157
|
+
|
|
158
|
+
if (ret == 0) {
|
|
159
|
+
++*pbundle->psuccess;
|
|
160
|
+
} else {
|
|
161
|
+
++*pbundle->pfailure;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
free(iov.iov_base);
|
|
165
|
+
close(pbundle->infd);
|
|
166
|
+
close(pbundle->outfd);
|
|
167
|
+
free(pbundle->pctx->stack_buf);
|
|
168
|
+
free(pbundle->pctx);
|
|
169
|
+
free(pbundle);
|
|
170
|
+
|
|
171
|
+
swapcontext(&pctx->ctx_fnew, &pctx->ctx_main);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
int main(int argc, char *argv[])
|
|
175
|
+
{
|
|
176
|
+
struct io_uring ring;
|
|
177
|
+
int i, req_count, ret;
|
|
178
|
+
int success = 0, failure = 0;
|
|
179
|
+
|
|
180
|
+
if (argc < 3) {
|
|
181
|
+
fprintf(stderr, "%s: infile1 outfile1 [infile2 outfile2 [...]]\n", argv[0]);
|
|
182
|
+
return 1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
ret = io_uring_queue_init(QD, &ring, 0);
|
|
186
|
+
if (ret < 0) {
|
|
187
|
+
fprintf(stderr, "queue_init: %s\n", strerror(-ret));
|
|
188
|
+
return -1;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
req_count = (argc - 1) / 2;
|
|
192
|
+
printf("copying %d files...\n", req_count);
|
|
193
|
+
|
|
194
|
+
for (i = 1; i < argc; i += 2) {
|
|
195
|
+
int infd, outfd;
|
|
196
|
+
|
|
197
|
+
async_context *pctx = malloc(sizeof(*pctx));
|
|
198
|
+
|
|
199
|
+
if (!pctx || setup_context(pctx, &ring))
|
|
200
|
+
return 1;
|
|
201
|
+
|
|
202
|
+
infd = open(argv[i], O_RDONLY);
|
|
203
|
+
if (infd < 0) {
|
|
204
|
+
perror("open infile");
|
|
205
|
+
return 1;
|
|
206
|
+
}
|
|
207
|
+
outfd = open(argv[i + 1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
|
208
|
+
if (outfd < 0) {
|
|
209
|
+
perror("open outfile");
|
|
210
|
+
return 1;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
arguments_bundle *pbundle = malloc(sizeof(*pbundle));
|
|
214
|
+
pbundle->pctx = pctx;
|
|
215
|
+
pbundle->psuccess = &success;
|
|
216
|
+
pbundle->pfailure = &failure;
|
|
217
|
+
pbundle->infd = infd;
|
|
218
|
+
pbundle->outfd = outfd;
|
|
219
|
+
|
|
220
|
+
makecontext(&pctx->ctx_fnew, (void (*)(void)) copy_file_wrapper, 1, pbundle);
|
|
221
|
+
|
|
222
|
+
if (swapcontext(&pctx->ctx_main, &pctx->ctx_fnew)) {
|
|
223
|
+
perror("swapcontext");
|
|
224
|
+
return 1;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* event loop */
|
|
229
|
+
while (success + failure < req_count) {
|
|
230
|
+
struct io_uring_cqe *cqe;
|
|
231
|
+
|
|
232
|
+
/* usually be timed waiting */
|
|
233
|
+
ret = io_uring_submit_and_wait(&ring, 1);
|
|
234
|
+
if (ret < 0) {
|
|
235
|
+
fprintf(stderr, "submit_and_wait: %s\n", strerror(-ret));
|
|
236
|
+
return 1;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
ret = io_uring_wait_cqe(&ring, &cqe);
|
|
240
|
+
if (ret < 0) {
|
|
241
|
+
fprintf(stderr, "wait_cqe: %s\n", strerror(-ret));
|
|
242
|
+
return 1;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async_context *pctx = io_uring_cqe_get_data(cqe);
|
|
246
|
+
|
|
247
|
+
if (swapcontext(&pctx->ctx_main, &pctx->ctx_fnew)) {
|
|
248
|
+
perror("swapcontext");
|
|
249
|
+
return 1;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
io_uring_queue_exit(&ring);
|
|
254
|
+
|
|
255
|
+
printf("finished with %d success(es) and %d failure(s)\n", success, failure);
|
|
256
|
+
|
|
257
|
+
return failure > 0;
|
|
258
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
prefix=@prefix@
|
|
2
|
+
exec_prefix=${prefix}
|
|
3
|
+
libdir=@libdir@
|
|
4
|
+
includedir=@includedir@
|
|
5
|
+
|
|
6
|
+
Name: @NAME@
|
|
7
|
+
Version: @VERSION@
|
|
8
|
+
Description: io_uring FFI library
|
|
9
|
+
URL: https://git.kernel.dk/cgit/liburing/
|
|
10
|
+
|
|
11
|
+
Libs: -L${libdir} -luring-ffi
|
|
12
|
+
Cflags: -I${includedir}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
prefix=@prefix@
|
|
2
|
+
exec_prefix=${prefix}
|
|
3
|
+
libdir=@libdir@
|
|
4
|
+
includedir=@includedir@
|
|
5
|
+
|
|
6
|
+
Name: @NAME@
|
|
7
|
+
Version: @VERSION@
|
|
8
|
+
Description: io_uring library
|
|
9
|
+
URL: https://git.kernel.dk/cgit/liburing/
|
|
10
|
+
|
|
11
|
+
Libs: -L${libdir} -luring
|
|
12
|
+
Cflags: -I${includedir} -D_GNU_SOURCE
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Name: liburing
|
|
2
|
+
Version: 2.8
|
|
3
|
+
Release: 1%{?dist}
|
|
4
|
+
Summary: Linux-native io_uring I/O access library
|
|
5
|
+
License: (GPLv2 with exceptions and LGPLv2+) or MIT
|
|
6
|
+
Source0: https://brick.kernel.dk/snaps/%{name}-%{version}.tar.gz
|
|
7
|
+
Source1: https://brick.kernel.dk/snaps/%{name}-%{version}.tar.gz.asc
|
|
8
|
+
URL: https://git.kernel.dk/cgit/liburing/
|
|
9
|
+
BuildRequires: gcc
|
|
10
|
+
BuildRequires: make
|
|
11
|
+
|
|
12
|
+
%description
|
|
13
|
+
Provides native async IO for the Linux kernel, in a fast and efficient
|
|
14
|
+
manner, for both buffered and O_DIRECT.
|
|
15
|
+
|
|
16
|
+
%package devel
|
|
17
|
+
Summary: Development files for Linux-native io_uring I/O access library
|
|
18
|
+
Requires: %{name}%{_isa} = %{version}-%{release}
|
|
19
|
+
Requires: pkgconfig
|
|
20
|
+
|
|
21
|
+
%description devel
|
|
22
|
+
This package provides header files to include and libraries to link with
|
|
23
|
+
for the Linux-native io_uring.
|
|
24
|
+
|
|
25
|
+
%prep
|
|
26
|
+
%autosetup
|
|
27
|
+
|
|
28
|
+
%build
|
|
29
|
+
%set_build_flags
|
|
30
|
+
./configure --prefix=%{_prefix} --libdir=%{_libdir} --libdevdir=%{_libdir} --mandir=%{_mandir} --includedir=%{_includedir}
|
|
31
|
+
|
|
32
|
+
%make_build
|
|
33
|
+
|
|
34
|
+
%install
|
|
35
|
+
%make_install
|
|
36
|
+
|
|
37
|
+
%files
|
|
38
|
+
%attr(0755,root,root) %{_libdir}/liburing.so.*
|
|
39
|
+
%license COPYING
|
|
40
|
+
|
|
41
|
+
%files devel
|
|
42
|
+
%{_includedir}/liburing/
|
|
43
|
+
%{_includedir}/liburing.h
|
|
44
|
+
%{_libdir}/liburing.so
|
|
45
|
+
%exclude %{_libdir}/liburing.a
|
|
46
|
+
%{_libdir}/pkgconfig/*
|
|
47
|
+
%{_mandir}/man2/*
|
|
48
|
+
%{_mandir}/man3/*
|
|
49
|
+
%{_mandir}/man7/*
|
|
50
|
+
|
|
51
|
+
%changelog
|
|
52
|
+
* Thu Oct 31 2019 Jeff Moyer <jmoyer@redhat.com> - 0.2-1
|
|
53
|
+
- Add io_uring_cq_ready()
|
|
54
|
+
- Add io_uring_peek_batch_cqe()
|
|
55
|
+
- Add io_uring_prep_accept()
|
|
56
|
+
- Add io_uring_prep_{recv,send}msg()
|
|
57
|
+
- Add io_uring_prep_timeout_remove()
|
|
58
|
+
- Add io_uring_queue_init_params()
|
|
59
|
+
- Add io_uring_register_files_update()
|
|
60
|
+
- Add io_uring_sq_space_left()
|
|
61
|
+
- Add io_uring_wait_cqe_timeout()
|
|
62
|
+
- Add io_uring_wait_cqes()
|
|
63
|
+
- Add io_uring_wait_cqes_timeout()
|
|
64
|
+
|
|
65
|
+
* Tue Jan 8 2019 Jens Axboe <axboe@kernel.dk> - 0.1
|
|
66
|
+
- Initial version
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (C) 2019 Liu Changcheng <changcheng.liu@aliyun.com>
|
|
3
|
+
# Author: Liu Changcheng <changcheng.liu@aliyun.com>
|
|
4
|
+
#
|
|
5
|
+
# This program is free software; you can redistribute it and/or
|
|
6
|
+
# modify it under the terms of the GNU General Public License
|
|
7
|
+
# as published by the Free Software Foundation; either version 2
|
|
8
|
+
# of the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU General Public License
|
|
16
|
+
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
set -xe
|
|
19
|
+
|
|
20
|
+
# Create dir for build
|
|
21
|
+
base=${1:-/tmp/release}
|
|
22
|
+
distro=unstable
|
|
23
|
+
releasedir=$base/$(lsb_release -si)/liburing
|
|
24
|
+
rm -rf $releasedir
|
|
25
|
+
mkdir -p $releasedir
|
|
26
|
+
HEAD=$(which head)
|
|
27
|
+
DCH=$(which dch)
|
|
28
|
+
|
|
29
|
+
src_dir=$(readlink -e `basename $0`)
|
|
30
|
+
liburing_dir=$(dirname $src_dir)
|
|
31
|
+
basename=$(basename $liburing_dir)
|
|
32
|
+
dirname=$(dirname $liburing_dir)
|
|
33
|
+
version=$(git describe --match "lib*" | cut -d '-' -f 2)
|
|
34
|
+
outfile="liburing-$version"
|
|
35
|
+
orgfile=$(echo $outfile | tr '-' '_')
|
|
36
|
+
|
|
37
|
+
# Prepare source code
|
|
38
|
+
cp -arf ${dirname}/${basename} ${releasedir}/${outfile}
|
|
39
|
+
cd ${releasedir}/${outfile}
|
|
40
|
+
git clean -dxf
|
|
41
|
+
|
|
42
|
+
# Change changelog if it's needed
|
|
43
|
+
cur_ver=`$HEAD < debian/changelog | sed -n -e 's/.* (\(.*\)) .*/\1/p'`
|
|
44
|
+
if [ "$cur_ver" != "$version-1" ]; then
|
|
45
|
+
$DCH -D $distro --force-distribution -b -v "$version-1" "new version"
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# Create tar archive
|
|
49
|
+
cd ../
|
|
50
|
+
tar cvzf ${outfile}.tar.gz ${outfile}
|
|
51
|
+
ln -s ${outfile}.tar.gz ${orgfile}.orig.tar.gz
|
|
52
|
+
|
|
53
|
+
# Build debian package
|
|
54
|
+
cd -
|
|
55
|
+
debuild
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
include ../Makefile.common
|
|
2
|
+
|
|
3
|
+
prefix ?= /usr
|
|
4
|
+
includedir ?= $(prefix)/include
|
|
5
|
+
libdir ?= $(prefix)/lib
|
|
6
|
+
libdevdir ?= $(prefix)/lib
|
|
7
|
+
|
|
8
|
+
LIBURING_CFLAGS ?=
|
|
9
|
+
CPPFLAGS ?=
|
|
10
|
+
override CPPFLAGS += -D_GNU_SOURCE \
|
|
11
|
+
-Iinclude/ -include ../config-host.h \
|
|
12
|
+
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
|
|
13
|
+
CFLAGS ?= -O3 -Wall -Wextra -fno-stack-protector
|
|
14
|
+
override CFLAGS += -Wno-unused-parameter \
|
|
15
|
+
-DLIBURING_INTERNAL \
|
|
16
|
+
$(LIBURING_CFLAGS)
|
|
17
|
+
SO_CFLAGS=-fPIC $(CFLAGS)
|
|
18
|
+
L_CFLAGS=$(CFLAGS)
|
|
19
|
+
LINK_FLAGS=-Wl,-z,defs
|
|
20
|
+
LINK_FLAGS+=$(LDFLAGS)
|
|
21
|
+
ENABLE_SHARED ?= 1
|
|
22
|
+
|
|
23
|
+
soname=liburing.so.$(VERSION_MAJOR)
|
|
24
|
+
libname=liburing.so.$(VERSION)
|
|
25
|
+
ffi_soname=liburing-ffi.so.$(VERSION_MAJOR)
|
|
26
|
+
ffi_libname=liburing-ffi.so.$(VERSION)
|
|
27
|
+
|
|
28
|
+
all_targets += liburing.a
|
|
29
|
+
all_targets += liburing-ffi.a
|
|
30
|
+
|
|
31
|
+
ifeq ($(ENABLE_SHARED),1)
|
|
32
|
+
all_targets += $(libname)
|
|
33
|
+
all_targets += $(ffi_libname)
|
|
34
|
+
endif
|
|
35
|
+
|
|
36
|
+
include ../Makefile.quiet
|
|
37
|
+
|
|
38
|
+
ifneq ($(MAKECMDGOALS),clean)
|
|
39
|
+
include ../config-host.mak
|
|
40
|
+
endif
|
|
41
|
+
|
|
42
|
+
all: $(all_targets)
|
|
43
|
+
|
|
44
|
+
liburing_srcs := setup.c queue.c register.c syscall.c version.c
|
|
45
|
+
|
|
46
|
+
ifeq ($(CONFIG_NOLIBC),y)
|
|
47
|
+
liburing_srcs += nolibc.c
|
|
48
|
+
override CFLAGS += -nostdlib -nodefaultlibs -ffreestanding -fno-builtin -fno-stack-protector
|
|
49
|
+
override CPPFLAGS += -nostdlib -nodefaultlibs -ffreestanding -fno-builtin -fno-stack-protector
|
|
50
|
+
override LINK_FLAGS += -nostdlib -nodefaultlibs $(libgcc_link_flag)
|
|
51
|
+
endif
|
|
52
|
+
|
|
53
|
+
override CPPFLAGS += -MT "$@" -MMD -MP -MF "$@.d"
|
|
54
|
+
liburing_objs := $(patsubst %.c,%.ol,$(liburing_srcs))
|
|
55
|
+
liburing_sobjs := $(patsubst %.c,%.os,$(liburing_srcs))
|
|
56
|
+
liburing_ffi_objs := ffi.ol
|
|
57
|
+
liburing_ffi_sobjs := ffi.os
|
|
58
|
+
|
|
59
|
+
%.os: %.c
|
|
60
|
+
$(QUIET_CC)$(CC) $(CPPFLAGS) $(SO_CFLAGS) -c -o $@ $<
|
|
61
|
+
|
|
62
|
+
%.ol: %.c
|
|
63
|
+
$(QUIET_CC)$(CC) $(CPPFLAGS) $(L_CFLAGS) -c -o $@ $<
|
|
64
|
+
|
|
65
|
+
# Include compiler generated dependency files.
|
|
66
|
+
-include $(liburing_objs:%=%.d)
|
|
67
|
+
-include $(liburing_sobjs:%=%.d)
|
|
68
|
+
|
|
69
|
+
AR ?= ar
|
|
70
|
+
RANLIB ?= ranlib
|
|
71
|
+
liburing.a: $(liburing_objs)
|
|
72
|
+
@rm -f liburing.a
|
|
73
|
+
$(QUIET_AR)$(AR) r liburing.a $^
|
|
74
|
+
$(QUIET_RANLIB)$(RANLIB) liburing.a
|
|
75
|
+
|
|
76
|
+
liburing-ffi.a: $(liburing_objs) $(liburing_ffi_objs)
|
|
77
|
+
@rm -f liburing-ffi.a
|
|
78
|
+
$(QUIET_AR)$(AR) r liburing-ffi.a $^
|
|
79
|
+
$(QUIET_RANLIB)$(RANLIB) liburing-ffi.a
|
|
80
|
+
|
|
81
|
+
$(libname): $(liburing_sobjs) liburing.map
|
|
82
|
+
$(QUIET_CC)$(CC) $(SO_CFLAGS) -shared -Wl,--version-script=liburing.map -Wl,-soname=$(soname) -o $@ $(liburing_sobjs) $(LINK_FLAGS)
|
|
83
|
+
|
|
84
|
+
$(ffi_libname): $(liburing_ffi_objs) $(liburing_ffi_sobjs) $(liburing_sobjs) liburing-ffi.map
|
|
85
|
+
$(QUIET_CC)$(CC) $(SO_CFLAGS) -shared -Wl,--version-script=liburing-ffi.map -Wl,-soname=$(ffi_soname) -o $@ $(liburing_sobjs) $(liburing_ffi_sobjs) $(LINK_FLAGS)
|
|
86
|
+
|
|
87
|
+
install: $(all_targets)
|
|
88
|
+
install -D -m 644 include/liburing/io_uring.h $(includedir)/liburing/io_uring.h
|
|
89
|
+
install -D -m 644 include/liburing.h $(includedir)/liburing.h
|
|
90
|
+
install -D -m 644 include/liburing/compat.h $(includedir)/liburing/compat.h
|
|
91
|
+
install -D -m 644 include/liburing/barrier.h $(includedir)/liburing/barrier.h
|
|
92
|
+
install -D -m 644 include/liburing/io_uring_version.h $(includedir)/liburing/io_uring_version.h
|
|
93
|
+
install -D -m 644 liburing.a $(libdevdir)/liburing.a
|
|
94
|
+
install -D -m 644 liburing-ffi.a $(libdevdir)/liburing-ffi.a
|
|
95
|
+
ifeq ($(ENABLE_SHARED),1)
|
|
96
|
+
install -D -m 755 $(libname) $(libdir)/$(libname)
|
|
97
|
+
install -D -m 755 $(ffi_libname) $(libdir)/$(ffi_libname)
|
|
98
|
+
ln -sf $(libname) $(libdir)/$(soname)
|
|
99
|
+
ln -sf $(relativelibdir)$(libname) $(libdevdir)/liburing.so
|
|
100
|
+
ln -sf $(ffi_libname) $(libdir)/$(ffi_soname)
|
|
101
|
+
ln -sf $(relativelibdir)$(ffi_libname) $(libdevdir)/liburing-ffi.so
|
|
102
|
+
endif
|
|
103
|
+
|
|
104
|
+
uninstall:
|
|
105
|
+
@rm -f $(includedir)/liburing/io_uring.h
|
|
106
|
+
@rm -f $(includedir)/liburing.h
|
|
107
|
+
@rm -f $(includedir)/liburing/compat.h
|
|
108
|
+
@rm -f $(includedir)/liburing/barrier.h
|
|
109
|
+
@rm -f $(includedir)/liburing/io_uring_version.h
|
|
110
|
+
@rm -f $(libdevdir)/liburing.a
|
|
111
|
+
@rm -f $(libdevdir)/liburing-ffi.a
|
|
112
|
+
ifeq ($(ENABLE_SHARED),1)
|
|
113
|
+
@rm -f $(libdir)/$(libname)
|
|
114
|
+
@rm -f $(libdir)/$(ffi_libname)
|
|
115
|
+
@rm -f $(libdir)/$(soname)
|
|
116
|
+
@rm -f $(libdevdir)/liburing.so
|
|
117
|
+
@rm -f $(libdir)/$(ffi_soname)
|
|
118
|
+
@rm -f $(libdevdir)/liburing-ffi.so
|
|
119
|
+
endif
|
|
120
|
+
|
|
121
|
+
clean:
|
|
122
|
+
@rm -f $(all_targets) $(liburing_objs) $(liburing_sobjs) $(liburing_ffi_objs) $(liburing_ffi_sobjs) $(soname).new
|
|
123
|
+
@rm -f *.so* *.a *.o *.d
|
|
124
|
+
@rm -f include/liburing/compat.h
|
|
125
|
+
@rm -f include/liburing/io_uring_version.h
|
|
126
|
+
|
|
127
|
+
@# When cleaning, we don't include ../config-host.mak,
|
|
128
|
+
@# so the nolibc objects are always skipped, clean them up!
|
|
129
|
+
@rm -f nolibc.ol nolibc.os
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
|
|
3
|
+
#ifndef LIBURING_ARCH_AARCH64_LIB_H
|
|
4
|
+
#define LIBURING_ARCH_AARCH64_LIB_H
|
|
5
|
+
|
|
6
|
+
#include <elf.h>
|
|
7
|
+
#include "../../syscall.h"
|
|
8
|
+
|
|
9
|
+
static inline long __get_page_size(void)
|
|
10
|
+
{
|
|
11
|
+
Elf64_Off buf[2];
|
|
12
|
+
long ret = 4096;
|
|
13
|
+
int fd;
|
|
14
|
+
|
|
15
|
+
fd = __sys_open("/proc/self/auxv", O_RDONLY, 0);
|
|
16
|
+
if (fd < 0)
|
|
17
|
+
return ret;
|
|
18
|
+
|
|
19
|
+
while (1) {
|
|
20
|
+
ssize_t x;
|
|
21
|
+
|
|
22
|
+
x = __sys_read(fd, buf, sizeof(buf));
|
|
23
|
+
if (x < (long) sizeof(buf))
|
|
24
|
+
break;
|
|
25
|
+
|
|
26
|
+
if (buf[0] == AT_PAGESZ) {
|
|
27
|
+
ret = buf[1];
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
__sys_close(fd);
|
|
33
|
+
return ret;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static inline long get_page_size(void)
|
|
37
|
+
{
|
|
38
|
+
static long cache_val;
|
|
39
|
+
|
|
40
|
+
if (cache_val)
|
|
41
|
+
return cache_val;
|
|
42
|
+
|
|
43
|
+
cache_val = __get_page_size();
|
|
44
|
+
return cache_val;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#endif /* #ifndef LIBURING_ARCH_AARCH64_LIB_H */
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
|
|
3
|
+
#ifndef LIBURING_ARCH_AARCH64_SYSCALL_H
|
|
4
|
+
#define LIBURING_ARCH_AARCH64_SYSCALL_H
|
|
5
|
+
|
|
6
|
+
#if defined(__aarch64__)
|
|
7
|
+
|
|
8
|
+
#define __do_syscallN(...) ({ \
|
|
9
|
+
__asm__ volatile ( \
|
|
10
|
+
"svc 0" \
|
|
11
|
+
: "=r"(x0) \
|
|
12
|
+
: __VA_ARGS__ \
|
|
13
|
+
: "memory", "cc"); \
|
|
14
|
+
(long) x0; \
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
#define __do_syscall0(__n) ({ \
|
|
18
|
+
register long x8 __asm__("x8") = __n; \
|
|
19
|
+
register long x0 __asm__("x0"); \
|
|
20
|
+
\
|
|
21
|
+
__do_syscallN("r" (x8)); \
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
#define __do_syscall1(__n, __a) ({ \
|
|
25
|
+
register long x8 __asm__("x8") = __n; \
|
|
26
|
+
register __typeof__(__a) x0 __asm__("x0") = __a; \
|
|
27
|
+
\
|
|
28
|
+
__do_syscallN("r" (x8), "0" (x0)); \
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
#define __do_syscall2(__n, __a, __b) ({ \
|
|
32
|
+
register long x8 __asm__("x8") = __n; \
|
|
33
|
+
register __typeof__(__a) x0 __asm__("x0") = __a; \
|
|
34
|
+
register __typeof__(__b) x1 __asm__("x1") = __b; \
|
|
35
|
+
\
|
|
36
|
+
__do_syscallN("r" (x8), "0" (x0), "r" (x1)); \
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
#define __do_syscall3(__n, __a, __b, __c) ({ \
|
|
40
|
+
register long x8 __asm__("x8") = __n; \
|
|
41
|
+
register __typeof__(__a) x0 __asm__("x0") = __a; \
|
|
42
|
+
register __typeof__(__b) x1 __asm__("x1") = __b; \
|
|
43
|
+
register __typeof__(__c) x2 __asm__("x2") = __c; \
|
|
44
|
+
\
|
|
45
|
+
__do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2)); \
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
#define __do_syscall4(__n, __a, __b, __c, __d) ({ \
|
|
49
|
+
register long x8 __asm__("x8") = __n; \
|
|
50
|
+
register __typeof__(__a) x0 __asm__("x0") = __a; \
|
|
51
|
+
register __typeof__(__b) x1 __asm__("x1") = __b; \
|
|
52
|
+
register __typeof__(__c) x2 __asm__("x2") = __c; \
|
|
53
|
+
register __typeof__(__d) x3 __asm__("x3") = __d; \
|
|
54
|
+
\
|
|
55
|
+
__do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2), "r" (x3));\
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
#define __do_syscall5(__n, __a, __b, __c, __d, __e) ({ \
|
|
59
|
+
register long x8 __asm__("x8") = __n; \
|
|
60
|
+
register __typeof__(__a) x0 __asm__("x0") = __a; \
|
|
61
|
+
register __typeof__(__b) x1 __asm__("x1") = __b; \
|
|
62
|
+
register __typeof__(__c) x2 __asm__("x2") = __c; \
|
|
63
|
+
register __typeof__(__d) x3 __asm__("x3") = __d; \
|
|
64
|
+
register __typeof__(__e) x4 __asm__("x4") = __e; \
|
|
65
|
+
\
|
|
66
|
+
__do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2), "r" (x3), \
|
|
67
|
+
"r"(x4)); \
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
#define __do_syscall6(__n, __a, __b, __c, __d, __e, __f) ({ \
|
|
71
|
+
register long x8 __asm__("x8") = __n; \
|
|
72
|
+
register __typeof__(__a) x0 __asm__("x0") = __a; \
|
|
73
|
+
register __typeof__(__b) x1 __asm__("x1") = __b; \
|
|
74
|
+
register __typeof__(__c) x2 __asm__("x2") = __c; \
|
|
75
|
+
register __typeof__(__d) x3 __asm__("x3") = __d; \
|
|
76
|
+
register __typeof__(__e) x4 __asm__("x4") = __e; \
|
|
77
|
+
register __typeof__(__f) x5 __asm__("x5") = __f; \
|
|
78
|
+
\
|
|
79
|
+
__do_syscallN("r" (x8), "0" (x0), "r" (x1), "r" (x2), "r" (x3), \
|
|
80
|
+
"r" (x4), "r"(x5)); \
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
#include "../syscall-defs.h"
|
|
84
|
+
|
|
85
|
+
#else /* #if defined(__aarch64__) */
|
|
86
|
+
|
|
87
|
+
#include "../generic/syscall.h"
|
|
88
|
+
|
|
89
|
+
#endif /* #if defined(__aarch64__) */
|
|
90
|
+
|
|
91
|
+
#endif /* #ifndef LIBURING_ARCH_AARCH64_SYSCALL_H */
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
2
|
+
|
|
3
|
+
#ifndef LIBURING_ARCH_GENERIC_LIB_H
|
|
4
|
+
#define LIBURING_ARCH_GENERIC_LIB_H
|
|
5
|
+
|
|
6
|
+
static inline long get_page_size(void)
|
|
7
|
+
{
|
|
8
|
+
long page_size;
|
|
9
|
+
|
|
10
|
+
page_size = sysconf(_SC_PAGESIZE);
|
|
11
|
+
if (page_size < 0)
|
|
12
|
+
page_size = 4096;
|
|
13
|
+
|
|
14
|
+
return page_size;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#endif /* #ifndef LIBURING_ARCH_GENERIC_LIB_H */
|