]>
Commit | Line | Data |
---|---|---|
21b4aa5d JA |
1 | #ifndef LIB_URING_H |
2 | #define LIB_URING_H | |
3 | ||
4 | #include <sys/uio.h> | |
5 | #include <signal.h> | |
6 | #include <string.h> | |
7 | #include "../../include/uapi/linux/io_uring.h" | |
8 | ||
9 | /* | |
10 | * Library interface to io_uring | |
11 | */ | |
12 | struct io_uring_sq { | |
13 | unsigned *khead; | |
14 | unsigned *ktail; | |
15 | unsigned *kring_mask; | |
16 | unsigned *kring_entries; | |
17 | unsigned *kflags; | |
18 | unsigned *kdropped; | |
19 | unsigned *array; | |
20 | struct io_uring_sqe *sqes; | |
21 | ||
22 | unsigned sqe_head; | |
23 | unsigned sqe_tail; | |
24 | ||
25 | size_t ring_sz; | |
26 | }; | |
27 | ||
28 | struct io_uring_cq { | |
29 | unsigned *khead; | |
30 | unsigned *ktail; | |
31 | unsigned *kring_mask; | |
32 | unsigned *kring_entries; | |
33 | unsigned *koverflow; | |
34 | struct io_uring_cqe *cqes; | |
35 | ||
36 | size_t ring_sz; | |
37 | }; | |
38 | ||
39 | struct io_uring { | |
40 | struct io_uring_sq sq; | |
41 | struct io_uring_cq cq; | |
42 | int ring_fd; | |
43 | }; | |
44 | ||
45 | /* | |
46 | * System calls | |
47 | */ | |
48 | extern int io_uring_setup(unsigned entries, struct io_uring_params *p); | |
49 | extern int io_uring_enter(unsigned fd, unsigned to_submit, | |
50 | unsigned min_complete, unsigned flags, sigset_t *sig); | |
51 | extern int io_uring_register(int fd, unsigned int opcode, void *arg, | |
52 | unsigned int nr_args); | |
53 | ||
54 | /* | |
55 | * Library interface | |
56 | */ | |
57 | extern int io_uring_queue_init(unsigned entries, struct io_uring *ring, | |
58 | unsigned flags); | |
59 | extern int io_uring_queue_mmap(int fd, struct io_uring_params *p, | |
60 | struct io_uring *ring); | |
61 | extern void io_uring_queue_exit(struct io_uring *ring); | |
62 | extern int io_uring_get_completion(struct io_uring *ring, | |
63 | struct io_uring_cqe **cqe_ptr); | |
64 | extern int io_uring_wait_completion(struct io_uring *ring, | |
65 | struct io_uring_cqe **cqe_ptr); | |
66 | extern int io_uring_submit(struct io_uring *ring); | |
67 | extern struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring); | |
68 | ||
69 | /* | |
70 | * Command prep helpers | |
71 | */ | |
72 | static inline void io_uring_sqe_set_data(struct io_uring_sqe *sqe, void *data) | |
73 | { | |
74 | sqe->user_data = (unsigned long) data; | |
75 | } | |
76 | ||
77 | static inline void io_uring_prep_rw(int op, struct io_uring_sqe *sqe, int fd, | |
78 | void *addr, unsigned len, off_t offset) | |
79 | { | |
80 | memset(sqe, 0, sizeof(*sqe)); | |
81 | sqe->opcode = op; | |
82 | sqe->fd = fd; | |
83 | sqe->off = offset; | |
84 | sqe->addr = (unsigned long) addr; | |
85 | sqe->len = len; | |
86 | } | |
87 | ||
88 | static inline void io_uring_prep_readv(struct io_uring_sqe *sqe, int fd, | |
89 | struct iovec *iovecs, unsigned nr_vecs, | |
90 | off_t offset) | |
91 | { | |
92 | io_uring_prep_rw(IORING_OP_READV, sqe, fd, iovecs, nr_vecs, offset); | |
93 | } | |
94 | ||
95 | static inline void io_uring_prep_read_fixed(struct io_uring_sqe *sqe, int fd, | |
96 | void *buf, unsigned nbytes, | |
97 | off_t offset) | |
98 | { | |
99 | io_uring_prep_rw(IORING_OP_READ_FIXED, sqe, fd, buf, nbytes, offset); | |
100 | } | |
101 | ||
102 | static inline void io_uring_prep_writev(struct io_uring_sqe *sqe, int fd, | |
103 | struct iovec *iovecs, unsigned nr_vecs, | |
104 | off_t offset) | |
105 | { | |
106 | io_uring_prep_rw(IORING_OP_WRITEV, sqe, fd, iovecs, nr_vecs, offset); | |
107 | } | |
108 | ||
109 | static inline void io_uring_prep_write_fixed(struct io_uring_sqe *sqe, int fd, | |
110 | void *buf, unsigned nbytes, | |
111 | off_t offset) | |
112 | { | |
113 | io_uring_prep_rw(IORING_OP_WRITE_FIXED, sqe, fd, buf, nbytes, offset); | |
114 | } | |
115 | ||
116 | static inline void io_uring_prep_poll_add(struct io_uring_sqe *sqe, int fd, | |
117 | short poll_mask) | |
118 | { | |
119 | memset(sqe, 0, sizeof(*sqe)); | |
120 | sqe->opcode = IORING_OP_POLL_ADD; | |
121 | sqe->fd = fd; | |
122 | sqe->poll_events = poll_mask; | |
123 | } | |
124 | ||
125 | static inline void io_uring_prep_poll_remove(struct io_uring_sqe *sqe, | |
126 | void *user_data) | |
127 | { | |
128 | memset(sqe, 0, sizeof(*sqe)); | |
129 | sqe->opcode = IORING_OP_POLL_REMOVE; | |
130 | sqe->addr = (unsigned long) user_data; | |
131 | } | |
132 | ||
133 | static inline void io_uring_prep_fsync(struct io_uring_sqe *sqe, int fd, | |
134 | int datasync) | |
135 | { | |
136 | memset(sqe, 0, sizeof(*sqe)); | |
137 | sqe->opcode = IORING_OP_FSYNC; | |
138 | sqe->fd = fd; | |
139 | if (datasync) | |
140 | sqe->fsync_flags = IORING_FSYNC_DATASYNC; | |
141 | } | |
142 | ||
143 | #endif |