1*25da2beaSAndroid Build Coastguard Worker /* SPDX-License-Identifier: MIT */
2*25da2beaSAndroid Build Coastguard Worker #ifndef LIB_URING_H
3*25da2beaSAndroid Build Coastguard Worker #define LIB_URING_H
4*25da2beaSAndroid Build Coastguard Worker
5*25da2beaSAndroid Build Coastguard Worker #ifndef _XOPEN_SOURCE
6*25da2beaSAndroid Build Coastguard Worker #define _XOPEN_SOURCE 500 /* Required for glibc to expose sigset_t */
7*25da2beaSAndroid Build Coastguard Worker #endif
8*25da2beaSAndroid Build Coastguard Worker
9*25da2beaSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE
10*25da2beaSAndroid Build Coastguard Worker #define _GNU_SOURCE /* Required for musl to expose cpu_set_t */
11*25da2beaSAndroid Build Coastguard Worker #endif
12*25da2beaSAndroid Build Coastguard Worker
13*25da2beaSAndroid Build Coastguard Worker #include <sys/socket.h>
14*25da2beaSAndroid Build Coastguard Worker #include <sys/stat.h>
15*25da2beaSAndroid Build Coastguard Worker #include <sys/uio.h>
16*25da2beaSAndroid Build Coastguard Worker #include <errno.h>
17*25da2beaSAndroid Build Coastguard Worker #include <signal.h>
18*25da2beaSAndroid Build Coastguard Worker #include <stdbool.h>
19*25da2beaSAndroid Build Coastguard Worker #include <inttypes.h>
20*25da2beaSAndroid Build Coastguard Worker #include <time.h>
21*25da2beaSAndroid Build Coastguard Worker #include <fcntl.h>
22*25da2beaSAndroid Build Coastguard Worker #include <sched.h>
23*25da2beaSAndroid Build Coastguard Worker #include <linux/swab.h>
24*25da2beaSAndroid Build Coastguard Worker #include "liburing/compat.h"
25*25da2beaSAndroid Build Coastguard Worker #include "liburing/io_uring.h"
26*25da2beaSAndroid Build Coastguard Worker #include "liburing/barrier.h"
27*25da2beaSAndroid Build Coastguard Worker
28*25da2beaSAndroid Build Coastguard Worker #ifndef uring_unlikely
29*25da2beaSAndroid Build Coastguard Worker #define uring_unlikely(cond) __builtin_expect(!!(cond), 0)
30*25da2beaSAndroid Build Coastguard Worker #endif
31*25da2beaSAndroid Build Coastguard Worker
32*25da2beaSAndroid Build Coastguard Worker #ifndef uring_likely
33*25da2beaSAndroid Build Coastguard Worker #define uring_likely(cond) __builtin_expect(!!(cond), 1)
34*25da2beaSAndroid Build Coastguard Worker #endif
35*25da2beaSAndroid Build Coastguard Worker
36*25da2beaSAndroid Build Coastguard Worker #ifdef __cplusplus
37*25da2beaSAndroid Build Coastguard Worker extern "C" {
38*25da2beaSAndroid Build Coastguard Worker #endif
39*25da2beaSAndroid Build Coastguard Worker
40*25da2beaSAndroid Build Coastguard Worker /*
41*25da2beaSAndroid Build Coastguard Worker * Library interface to io_uring
42*25da2beaSAndroid Build Coastguard Worker */
43*25da2beaSAndroid Build Coastguard Worker struct io_uring_sq {
44*25da2beaSAndroid Build Coastguard Worker unsigned *khead;
45*25da2beaSAndroid Build Coastguard Worker unsigned *ktail;
46*25da2beaSAndroid Build Coastguard Worker unsigned *kring_mask;
47*25da2beaSAndroid Build Coastguard Worker unsigned *kring_entries;
48*25da2beaSAndroid Build Coastguard Worker unsigned *kflags;
49*25da2beaSAndroid Build Coastguard Worker unsigned *kdropped;
50*25da2beaSAndroid Build Coastguard Worker unsigned *array;
51*25da2beaSAndroid Build Coastguard Worker struct io_uring_sqe *sqes;
52*25da2beaSAndroid Build Coastguard Worker
53*25da2beaSAndroid Build Coastguard Worker unsigned sqe_head;
54*25da2beaSAndroid Build Coastguard Worker unsigned sqe_tail;
55*25da2beaSAndroid Build Coastguard Worker
56*25da2beaSAndroid Build Coastguard Worker size_t ring_sz;
57*25da2beaSAndroid Build Coastguard Worker void *ring_ptr;
58*25da2beaSAndroid Build Coastguard Worker
59*25da2beaSAndroid Build Coastguard Worker unsigned pad[4];
60*25da2beaSAndroid Build Coastguard Worker };
61*25da2beaSAndroid Build Coastguard Worker
62*25da2beaSAndroid Build Coastguard Worker struct io_uring_cq {
63*25da2beaSAndroid Build Coastguard Worker unsigned *khead;
64*25da2beaSAndroid Build Coastguard Worker unsigned *ktail;
65*25da2beaSAndroid Build Coastguard Worker unsigned *kring_mask;
66*25da2beaSAndroid Build Coastguard Worker unsigned *kring_entries;
67*25da2beaSAndroid Build Coastguard Worker unsigned *kflags;
68*25da2beaSAndroid Build Coastguard Worker unsigned *koverflow;
69*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe *cqes;
70*25da2beaSAndroid Build Coastguard Worker
71*25da2beaSAndroid Build Coastguard Worker size_t ring_sz;
72*25da2beaSAndroid Build Coastguard Worker void *ring_ptr;
73*25da2beaSAndroid Build Coastguard Worker
74*25da2beaSAndroid Build Coastguard Worker unsigned pad[4];
75*25da2beaSAndroid Build Coastguard Worker };
76*25da2beaSAndroid Build Coastguard Worker
77*25da2beaSAndroid Build Coastguard Worker struct io_uring {
78*25da2beaSAndroid Build Coastguard Worker struct io_uring_sq sq;
79*25da2beaSAndroid Build Coastguard Worker struct io_uring_cq cq;
80*25da2beaSAndroid Build Coastguard Worker unsigned flags;
81*25da2beaSAndroid Build Coastguard Worker int ring_fd;
82*25da2beaSAndroid Build Coastguard Worker
83*25da2beaSAndroid Build Coastguard Worker unsigned features;
84*25da2beaSAndroid Build Coastguard Worker int enter_ring_fd;
85*25da2beaSAndroid Build Coastguard Worker __u8 int_flags;
86*25da2beaSAndroid Build Coastguard Worker __u8 pad[3];
87*25da2beaSAndroid Build Coastguard Worker unsigned pad2;
88*25da2beaSAndroid Build Coastguard Worker };
89*25da2beaSAndroid Build Coastguard Worker
90*25da2beaSAndroid Build Coastguard Worker /*
91*25da2beaSAndroid Build Coastguard Worker * Library interface
92*25da2beaSAndroid Build Coastguard Worker */
93*25da2beaSAndroid Build Coastguard Worker
94*25da2beaSAndroid Build Coastguard Worker /*
95*25da2beaSAndroid Build Coastguard Worker * return an allocated io_uring_probe structure, or NULL if probe fails (for
96*25da2beaSAndroid Build Coastguard Worker * example, if it is not available). The caller is responsible for freeing it
97*25da2beaSAndroid Build Coastguard Worker */
98*25da2beaSAndroid Build Coastguard Worker struct io_uring_probe *io_uring_get_probe_ring(struct io_uring *ring);
99*25da2beaSAndroid Build Coastguard Worker /* same as io_uring_get_probe_ring, but takes care of ring init and teardown */
100*25da2beaSAndroid Build Coastguard Worker struct io_uring_probe *io_uring_get_probe(void);
101*25da2beaSAndroid Build Coastguard Worker
102*25da2beaSAndroid Build Coastguard Worker /*
103*25da2beaSAndroid Build Coastguard Worker * frees a probe allocated through io_uring_get_probe() or
104*25da2beaSAndroid Build Coastguard Worker * io_uring_get_probe_ring()
105*25da2beaSAndroid Build Coastguard Worker */
106*25da2beaSAndroid Build Coastguard Worker void io_uring_free_probe(struct io_uring_probe *probe);
107*25da2beaSAndroid Build Coastguard Worker
io_uring_opcode_supported(const struct io_uring_probe * p,int op)108*25da2beaSAndroid Build Coastguard Worker static inline int io_uring_opcode_supported(const struct io_uring_probe *p,
109*25da2beaSAndroid Build Coastguard Worker int op)
110*25da2beaSAndroid Build Coastguard Worker {
111*25da2beaSAndroid Build Coastguard Worker if (op > p->last_op)
112*25da2beaSAndroid Build Coastguard Worker return 0;
113*25da2beaSAndroid Build Coastguard Worker return (p->ops[op].flags & IO_URING_OP_SUPPORTED) != 0;
114*25da2beaSAndroid Build Coastguard Worker }
115*25da2beaSAndroid Build Coastguard Worker
116*25da2beaSAndroid Build Coastguard Worker int io_uring_queue_init_params(unsigned entries, struct io_uring *ring,
117*25da2beaSAndroid Build Coastguard Worker struct io_uring_params *p);
118*25da2beaSAndroid Build Coastguard Worker int io_uring_queue_init(unsigned entries, struct io_uring *ring,
119*25da2beaSAndroid Build Coastguard Worker unsigned flags);
120*25da2beaSAndroid Build Coastguard Worker int io_uring_queue_mmap(int fd, struct io_uring_params *p,
121*25da2beaSAndroid Build Coastguard Worker struct io_uring *ring);
122*25da2beaSAndroid Build Coastguard Worker int io_uring_ring_dontfork(struct io_uring *ring);
123*25da2beaSAndroid Build Coastguard Worker void io_uring_queue_exit(struct io_uring *ring);
124*25da2beaSAndroid Build Coastguard Worker unsigned io_uring_peek_batch_cqe(struct io_uring *ring,
125*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqes, unsigned count);
126*25da2beaSAndroid Build Coastguard Worker int io_uring_wait_cqes(struct io_uring *ring, struct io_uring_cqe **cqe_ptr,
127*25da2beaSAndroid Build Coastguard Worker unsigned wait_nr, struct __kernel_timespec *ts,
128*25da2beaSAndroid Build Coastguard Worker sigset_t *sigmask);
129*25da2beaSAndroid Build Coastguard Worker int io_uring_wait_cqe_timeout(struct io_uring *ring,
130*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqe_ptr,
131*25da2beaSAndroid Build Coastguard Worker struct __kernel_timespec *ts);
132*25da2beaSAndroid Build Coastguard Worker int io_uring_submit(struct io_uring *ring);
133*25da2beaSAndroid Build Coastguard Worker int io_uring_submit_and_wait(struct io_uring *ring, unsigned wait_nr);
134*25da2beaSAndroid Build Coastguard Worker int io_uring_submit_and_wait_timeout(struct io_uring *ring,
135*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqe_ptr,
136*25da2beaSAndroid Build Coastguard Worker unsigned wait_nr,
137*25da2beaSAndroid Build Coastguard Worker struct __kernel_timespec *ts,
138*25da2beaSAndroid Build Coastguard Worker sigset_t *sigmask);
139*25da2beaSAndroid Build Coastguard Worker
140*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
141*25da2beaSAndroid Build Coastguard Worker unsigned nr_iovecs);
142*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers_tags(struct io_uring *ring,
143*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
144*25da2beaSAndroid Build Coastguard Worker const __u64 *tags, unsigned nr);
145*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers_sparse(struct io_uring *ring, unsigned nr);
146*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers_update_tag(struct io_uring *ring,
147*25da2beaSAndroid Build Coastguard Worker unsigned off,
148*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
149*25da2beaSAndroid Build Coastguard Worker const __u64 *tags, unsigned nr);
150*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_buffers(struct io_uring *ring);
151*25da2beaSAndroid Build Coastguard Worker
152*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files(struct io_uring *ring, const int *files,
153*25da2beaSAndroid Build Coastguard Worker unsigned nr_files);
154*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_tags(struct io_uring *ring, const int *files,
155*25da2beaSAndroid Build Coastguard Worker const __u64 *tags, unsigned nr);
156*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_sparse(struct io_uring *ring, unsigned nr);
157*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_update_tag(struct io_uring *ring, unsigned off,
158*25da2beaSAndroid Build Coastguard Worker const int *files, const __u64 *tags,
159*25da2beaSAndroid Build Coastguard Worker unsigned nr_files);
160*25da2beaSAndroid Build Coastguard Worker
161*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_files(struct io_uring *ring);
162*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_update(struct io_uring *ring, unsigned off,
163*25da2beaSAndroid Build Coastguard Worker int *files, unsigned nr_files);
164*25da2beaSAndroid Build Coastguard Worker int io_uring_register_eventfd(struct io_uring *ring, int fd);
165*25da2beaSAndroid Build Coastguard Worker int io_uring_register_eventfd_async(struct io_uring *ring, int fd);
166*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_eventfd(struct io_uring *ring);
167*25da2beaSAndroid Build Coastguard Worker int io_uring_register_probe(struct io_uring *ring, struct io_uring_probe *p,
168*25da2beaSAndroid Build Coastguard Worker unsigned nr);
169*25da2beaSAndroid Build Coastguard Worker int io_uring_register_personality(struct io_uring *ring);
170*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_personality(struct io_uring *ring, int id);
171*25da2beaSAndroid Build Coastguard Worker int io_uring_register_restrictions(struct io_uring *ring,
172*25da2beaSAndroid Build Coastguard Worker struct io_uring_restriction *res,
173*25da2beaSAndroid Build Coastguard Worker unsigned int nr_res);
174*25da2beaSAndroid Build Coastguard Worker int io_uring_enable_rings(struct io_uring *ring);
175*25da2beaSAndroid Build Coastguard Worker int __io_uring_sqring_wait(struct io_uring *ring);
176*25da2beaSAndroid Build Coastguard Worker int io_uring_register_iowq_aff(struct io_uring *ring, size_t cpusz,
177*25da2beaSAndroid Build Coastguard Worker const cpu_set_t *mask);
178*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_iowq_aff(struct io_uring *ring);
179*25da2beaSAndroid Build Coastguard Worker int io_uring_register_iowq_max_workers(struct io_uring *ring,
180*25da2beaSAndroid Build Coastguard Worker unsigned int *values);
181*25da2beaSAndroid Build Coastguard Worker int io_uring_register_ring_fd(struct io_uring *ring);
182*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_ring_fd(struct io_uring *ring);
183*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buf_ring(struct io_uring *ring,
184*25da2beaSAndroid Build Coastguard Worker struct io_uring_buf_reg *reg, unsigned int flags);
185*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_buf_ring(struct io_uring *ring, int bgid);
186*25da2beaSAndroid Build Coastguard Worker
187*25da2beaSAndroid Build Coastguard Worker /*
188*25da2beaSAndroid Build Coastguard Worker * Helper for the peek/wait single cqe functions. Exported because of that,
189*25da2beaSAndroid Build Coastguard Worker * but probably shouldn't be used directly in an application.
190*25da2beaSAndroid Build Coastguard Worker */
191*25da2beaSAndroid Build Coastguard Worker int __io_uring_get_cqe(struct io_uring *ring,
192*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqe_ptr, unsigned submit,
193*25da2beaSAndroid Build Coastguard Worker unsigned wait_nr, sigset_t *sigmask);
194*25da2beaSAndroid Build Coastguard Worker
195*25da2beaSAndroid Build Coastguard Worker #define LIBURING_UDATA_TIMEOUT ((__u64) -1)
196*25da2beaSAndroid Build Coastguard Worker
197*25da2beaSAndroid Build Coastguard Worker /*
198*25da2beaSAndroid Build Coastguard Worker * Calculates the step size for CQE iteration.
199*25da2beaSAndroid Build Coastguard Worker * For standard CQE's its 1, for big CQE's its two.
200*25da2beaSAndroid Build Coastguard Worker */
201*25da2beaSAndroid Build Coastguard Worker #define io_uring_cqe_shift(ring) \
202*25da2beaSAndroid Build Coastguard Worker (!!((ring)->flags & IORING_SETUP_CQE32))
203*25da2beaSAndroid Build Coastguard Worker
204*25da2beaSAndroid Build Coastguard Worker #define io_uring_cqe_index(ring,ptr,mask) \
205*25da2beaSAndroid Build Coastguard Worker (((ptr) & (mask)) << io_uring_cqe_shift(ring))
206*25da2beaSAndroid Build Coastguard Worker
207*25da2beaSAndroid Build Coastguard Worker #define io_uring_for_each_cqe(ring, head, cqe) \
208*25da2beaSAndroid Build Coastguard Worker /* \
209*25da2beaSAndroid Build Coastguard Worker * io_uring_smp_load_acquire() enforces the order of tail \
210*25da2beaSAndroid Build Coastguard Worker * and CQE reads. \
211*25da2beaSAndroid Build Coastguard Worker */ \
212*25da2beaSAndroid Build Coastguard Worker for (head = *(ring)->cq.khead; \
213*25da2beaSAndroid Build Coastguard Worker (cqe = (head != io_uring_smp_load_acquire((ring)->cq.ktail) ? \
214*25da2beaSAndroid Build Coastguard Worker &(ring)->cq.cqes[io_uring_cqe_index(ring, head, *(ring)->cq.kring_mask)] : NULL)); \
215*25da2beaSAndroid Build Coastguard Worker head++) \
216*25da2beaSAndroid Build Coastguard Worker
217*25da2beaSAndroid Build Coastguard Worker /*
218*25da2beaSAndroid Build Coastguard Worker * Must be called after io_uring_for_each_cqe()
219*25da2beaSAndroid Build Coastguard Worker */
io_uring_cq_advance(struct io_uring * ring,unsigned nr)220*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_cq_advance(struct io_uring *ring,
221*25da2beaSAndroid Build Coastguard Worker unsigned nr)
222*25da2beaSAndroid Build Coastguard Worker {
223*25da2beaSAndroid Build Coastguard Worker if (nr) {
224*25da2beaSAndroid Build Coastguard Worker struct io_uring_cq *cq = &ring->cq;
225*25da2beaSAndroid Build Coastguard Worker
226*25da2beaSAndroid Build Coastguard Worker /*
227*25da2beaSAndroid Build Coastguard Worker * Ensure that the kernel only sees the new value of the head
228*25da2beaSAndroid Build Coastguard Worker * index after the CQEs have been read.
229*25da2beaSAndroid Build Coastguard Worker */
230*25da2beaSAndroid Build Coastguard Worker io_uring_smp_store_release(cq->khead, *cq->khead + nr);
231*25da2beaSAndroid Build Coastguard Worker }
232*25da2beaSAndroid Build Coastguard Worker }
233*25da2beaSAndroid Build Coastguard Worker
234*25da2beaSAndroid Build Coastguard Worker /*
235*25da2beaSAndroid Build Coastguard Worker * Must be called after io_uring_{peek,wait}_cqe() after the cqe has
236*25da2beaSAndroid Build Coastguard Worker * been processed by the application.
237*25da2beaSAndroid Build Coastguard Worker */
io_uring_cqe_seen(struct io_uring * ring,struct io_uring_cqe * cqe)238*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_cqe_seen(struct io_uring *ring,
239*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe *cqe)
240*25da2beaSAndroid Build Coastguard Worker {
241*25da2beaSAndroid Build Coastguard Worker if (cqe)
242*25da2beaSAndroid Build Coastguard Worker io_uring_cq_advance(ring, 1);
243*25da2beaSAndroid Build Coastguard Worker }
244*25da2beaSAndroid Build Coastguard Worker
245*25da2beaSAndroid Build Coastguard Worker /*
246*25da2beaSAndroid Build Coastguard Worker * Command prep helpers
247*25da2beaSAndroid Build Coastguard Worker */
248*25da2beaSAndroid Build Coastguard Worker
249*25da2beaSAndroid Build Coastguard Worker /*
250*25da2beaSAndroid Build Coastguard Worker * Associate pointer @data with the sqe, for later retrieval from the cqe
251*25da2beaSAndroid Build Coastguard Worker * at command completion time with io_uring_cqe_get_data().
252*25da2beaSAndroid Build Coastguard Worker */
io_uring_sqe_set_data(struct io_uring_sqe * sqe,void * data)253*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_sqe_set_data(struct io_uring_sqe *sqe, void *data)
254*25da2beaSAndroid Build Coastguard Worker {
255*25da2beaSAndroid Build Coastguard Worker sqe->user_data = (unsigned long) data;
256*25da2beaSAndroid Build Coastguard Worker }
257*25da2beaSAndroid Build Coastguard Worker
io_uring_cqe_get_data(const struct io_uring_cqe * cqe)258*25da2beaSAndroid Build Coastguard Worker static inline void *io_uring_cqe_get_data(const struct io_uring_cqe *cqe)
259*25da2beaSAndroid Build Coastguard Worker {
260*25da2beaSAndroid Build Coastguard Worker return (void *) (uintptr_t) cqe->user_data;
261*25da2beaSAndroid Build Coastguard Worker }
262*25da2beaSAndroid Build Coastguard Worker
263*25da2beaSAndroid Build Coastguard Worker /*
264*25da2beaSAndroid Build Coastguard Worker * Assign a 64-bit value to this sqe, which can get retrieved at completion
265*25da2beaSAndroid Build Coastguard Worker * time with io_uring_cqe_get_data64. Just like the non-64 variants, except
266*25da2beaSAndroid Build Coastguard Worker * these store a 64-bit type rather than a data pointer.
267*25da2beaSAndroid Build Coastguard Worker */
io_uring_sqe_set_data64(struct io_uring_sqe * sqe,__u64 data)268*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_sqe_set_data64(struct io_uring_sqe *sqe,
269*25da2beaSAndroid Build Coastguard Worker __u64 data)
270*25da2beaSAndroid Build Coastguard Worker {
271*25da2beaSAndroid Build Coastguard Worker sqe->user_data = data;
272*25da2beaSAndroid Build Coastguard Worker }
273*25da2beaSAndroid Build Coastguard Worker
io_uring_cqe_get_data64(const struct io_uring_cqe * cqe)274*25da2beaSAndroid Build Coastguard Worker static inline __u64 io_uring_cqe_get_data64(const struct io_uring_cqe *cqe)
275*25da2beaSAndroid Build Coastguard Worker {
276*25da2beaSAndroid Build Coastguard Worker return cqe->user_data;
277*25da2beaSAndroid Build Coastguard Worker }
278*25da2beaSAndroid Build Coastguard Worker
279*25da2beaSAndroid Build Coastguard Worker /*
280*25da2beaSAndroid Build Coastguard Worker * Tell the app the have the 64-bit variants of the get/set userdata
281*25da2beaSAndroid Build Coastguard Worker */
282*25da2beaSAndroid Build Coastguard Worker #define LIBURING_HAVE_DATA64
283*25da2beaSAndroid Build Coastguard Worker
io_uring_sqe_set_flags(struct io_uring_sqe * sqe,unsigned flags)284*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_sqe_set_flags(struct io_uring_sqe *sqe,
285*25da2beaSAndroid Build Coastguard Worker unsigned flags)
286*25da2beaSAndroid Build Coastguard Worker {
287*25da2beaSAndroid Build Coastguard Worker sqe->flags = (__u8) flags;
288*25da2beaSAndroid Build Coastguard Worker }
289*25da2beaSAndroid Build Coastguard Worker
__io_uring_set_target_fixed_file(struct io_uring_sqe * sqe,unsigned int file_index)290*25da2beaSAndroid Build Coastguard Worker static inline void __io_uring_set_target_fixed_file(struct io_uring_sqe *sqe,
291*25da2beaSAndroid Build Coastguard Worker unsigned int file_index)
292*25da2beaSAndroid Build Coastguard Worker {
293*25da2beaSAndroid Build Coastguard Worker /* 0 means no fixed files, indexes should be encoded as "index + 1" */
294*25da2beaSAndroid Build Coastguard Worker sqe->file_index = file_index + 1;
295*25da2beaSAndroid Build Coastguard Worker }
296*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_rw(int op,struct io_uring_sqe * sqe,int fd,const void * addr,unsigned len,__u64 offset)297*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_rw(int op, struct io_uring_sqe *sqe, int fd,
298*25da2beaSAndroid Build Coastguard Worker const void *addr, unsigned len,
299*25da2beaSAndroid Build Coastguard Worker __u64 offset)
300*25da2beaSAndroid Build Coastguard Worker {
301*25da2beaSAndroid Build Coastguard Worker sqe->opcode = (__u8) op;
302*25da2beaSAndroid Build Coastguard Worker sqe->flags = 0;
303*25da2beaSAndroid Build Coastguard Worker sqe->ioprio = 0;
304*25da2beaSAndroid Build Coastguard Worker sqe->fd = fd;
305*25da2beaSAndroid Build Coastguard Worker sqe->off = offset;
306*25da2beaSAndroid Build Coastguard Worker sqe->addr = (unsigned long) addr;
307*25da2beaSAndroid Build Coastguard Worker sqe->len = len;
308*25da2beaSAndroid Build Coastguard Worker sqe->rw_flags = 0;
309*25da2beaSAndroid Build Coastguard Worker sqe->buf_index = 0;
310*25da2beaSAndroid Build Coastguard Worker sqe->personality = 0;
311*25da2beaSAndroid Build Coastguard Worker sqe->file_index = 0;
312*25da2beaSAndroid Build Coastguard Worker sqe->addr3 = 0;
313*25da2beaSAndroid Build Coastguard Worker sqe->__pad2[0] = 0;
314*25da2beaSAndroid Build Coastguard Worker }
315*25da2beaSAndroid Build Coastguard Worker
316*25da2beaSAndroid Build Coastguard Worker /**
317*25da2beaSAndroid Build Coastguard Worker * @pre Either fd_in or fd_out must be a pipe.
318*25da2beaSAndroid Build Coastguard Worker * @param off_in If fd_in refers to a pipe, off_in must be (int64_t) -1;
319*25da2beaSAndroid Build Coastguard Worker * If fd_in does not refer to a pipe and off_in is (int64_t) -1,
320*25da2beaSAndroid Build Coastguard Worker * then bytes are read from fd_in starting from the file offset
321*25da2beaSAndroid Build Coastguard Worker * and it is adjust appropriately;
322*25da2beaSAndroid Build Coastguard Worker * If fd_in does not refer to a pipe and off_in is not
323*25da2beaSAndroid Build Coastguard Worker * (int64_t) -1, then the starting offset of fd_in will be
324*25da2beaSAndroid Build Coastguard Worker * off_in.
325*25da2beaSAndroid Build Coastguard Worker * @param off_out The description of off_in also applied to off_out.
326*25da2beaSAndroid Build Coastguard Worker * @param splice_flags see man splice(2) for description of flags.
327*25da2beaSAndroid Build Coastguard Worker *
328*25da2beaSAndroid Build Coastguard Worker * This splice operation can be used to implement sendfile by splicing to an
329*25da2beaSAndroid Build Coastguard Worker * intermediate pipe first, then splice to the final destination.
330*25da2beaSAndroid Build Coastguard Worker * In fact, the implementation of sendfile in kernel uses splice internally.
331*25da2beaSAndroid Build Coastguard Worker *
332*25da2beaSAndroid Build Coastguard Worker * NOTE that even if fd_in or fd_out refers to a pipe, the splice operation
333*25da2beaSAndroid Build Coastguard Worker * can still failed with EINVAL if one of the fd doesn't explicitly support
334*25da2beaSAndroid Build Coastguard Worker * splice operation, e.g. reading from terminal is unsupported from kernel 5.7
335*25da2beaSAndroid Build Coastguard Worker * to 5.11.
336*25da2beaSAndroid Build Coastguard Worker * Check issue #291 for more information.
337*25da2beaSAndroid Build Coastguard Worker */
io_uring_prep_splice(struct io_uring_sqe * sqe,int fd_in,int64_t off_in,int fd_out,int64_t off_out,unsigned int nbytes,unsigned int splice_flags)338*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_splice(struct io_uring_sqe *sqe,
339*25da2beaSAndroid Build Coastguard Worker int fd_in, int64_t off_in,
340*25da2beaSAndroid Build Coastguard Worker int fd_out, int64_t off_out,
341*25da2beaSAndroid Build Coastguard Worker unsigned int nbytes,
342*25da2beaSAndroid Build Coastguard Worker unsigned int splice_flags)
343*25da2beaSAndroid Build Coastguard Worker {
344*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SPLICE, sqe, fd_out, NULL, nbytes,
345*25da2beaSAndroid Build Coastguard Worker (__u64) off_out);
346*25da2beaSAndroid Build Coastguard Worker sqe->splice_off_in = (__u64) off_in;
347*25da2beaSAndroid Build Coastguard Worker sqe->splice_fd_in = fd_in;
348*25da2beaSAndroid Build Coastguard Worker sqe->splice_flags = splice_flags;
349*25da2beaSAndroid Build Coastguard Worker }
350*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_tee(struct io_uring_sqe * sqe,int fd_in,int fd_out,unsigned int nbytes,unsigned int splice_flags)351*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_tee(struct io_uring_sqe *sqe,
352*25da2beaSAndroid Build Coastguard Worker int fd_in, int fd_out,
353*25da2beaSAndroid Build Coastguard Worker unsigned int nbytes,
354*25da2beaSAndroid Build Coastguard Worker unsigned int splice_flags)
355*25da2beaSAndroid Build Coastguard Worker {
356*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_TEE, sqe, fd_out, NULL, nbytes, 0);
357*25da2beaSAndroid Build Coastguard Worker sqe->splice_off_in = 0;
358*25da2beaSAndroid Build Coastguard Worker sqe->splice_fd_in = fd_in;
359*25da2beaSAndroid Build Coastguard Worker sqe->splice_flags = splice_flags;
360*25da2beaSAndroid Build Coastguard Worker }
361*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_readv(struct io_uring_sqe * sqe,int fd,const struct iovec * iovecs,unsigned nr_vecs,__u64 offset)362*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_readv(struct io_uring_sqe *sqe, int fd,
363*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
364*25da2beaSAndroid Build Coastguard Worker unsigned nr_vecs, __u64 offset)
365*25da2beaSAndroid Build Coastguard Worker {
366*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_READV, sqe, fd, iovecs, nr_vecs, offset);
367*25da2beaSAndroid Build Coastguard Worker }
368*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_readv2(struct io_uring_sqe * sqe,int fd,const struct iovec * iovecs,unsigned nr_vecs,__u64 offset,int flags)369*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_readv2(struct io_uring_sqe *sqe, int fd,
370*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
371*25da2beaSAndroid Build Coastguard Worker unsigned nr_vecs, __u64 offset,
372*25da2beaSAndroid Build Coastguard Worker int flags)
373*25da2beaSAndroid Build Coastguard Worker {
374*25da2beaSAndroid Build Coastguard Worker io_uring_prep_readv(sqe, fd, iovecs, nr_vecs, offset);
375*25da2beaSAndroid Build Coastguard Worker sqe->rw_flags = flags;
376*25da2beaSAndroid Build Coastguard Worker }
377*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_read_fixed(struct io_uring_sqe * sqe,int fd,void * buf,unsigned nbytes,__u64 offset,int buf_index)378*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_read_fixed(struct io_uring_sqe *sqe, int fd,
379*25da2beaSAndroid Build Coastguard Worker void *buf, unsigned nbytes,
380*25da2beaSAndroid Build Coastguard Worker __u64 offset, int buf_index)
381*25da2beaSAndroid Build Coastguard Worker {
382*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_READ_FIXED, sqe, fd, buf, nbytes, offset);
383*25da2beaSAndroid Build Coastguard Worker sqe->buf_index = (__u16) buf_index;
384*25da2beaSAndroid Build Coastguard Worker }
385*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_writev(struct io_uring_sqe * sqe,int fd,const struct iovec * iovecs,unsigned nr_vecs,__u64 offset)386*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_writev(struct io_uring_sqe *sqe, int fd,
387*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
388*25da2beaSAndroid Build Coastguard Worker unsigned nr_vecs, __u64 offset)
389*25da2beaSAndroid Build Coastguard Worker {
390*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_WRITEV, sqe, fd, iovecs, nr_vecs, offset);
391*25da2beaSAndroid Build Coastguard Worker }
392*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_writev2(struct io_uring_sqe * sqe,int fd,const struct iovec * iovecs,unsigned nr_vecs,__u64 offset,int flags)393*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_writev2(struct io_uring_sqe *sqe, int fd,
394*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
395*25da2beaSAndroid Build Coastguard Worker unsigned nr_vecs, __u64 offset,
396*25da2beaSAndroid Build Coastguard Worker int flags)
397*25da2beaSAndroid Build Coastguard Worker {
398*25da2beaSAndroid Build Coastguard Worker io_uring_prep_writev(sqe, fd, iovecs, nr_vecs, offset);
399*25da2beaSAndroid Build Coastguard Worker sqe->rw_flags = flags;
400*25da2beaSAndroid Build Coastguard Worker }
401*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_write_fixed(struct io_uring_sqe * sqe,int fd,const void * buf,unsigned nbytes,__u64 offset,int buf_index)402*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_write_fixed(struct io_uring_sqe *sqe, int fd,
403*25da2beaSAndroid Build Coastguard Worker const void *buf, unsigned nbytes,
404*25da2beaSAndroid Build Coastguard Worker __u64 offset, int buf_index)
405*25da2beaSAndroid Build Coastguard Worker {
406*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_WRITE_FIXED, sqe, fd, buf, nbytes, offset);
407*25da2beaSAndroid Build Coastguard Worker sqe->buf_index = (__u16) buf_index;
408*25da2beaSAndroid Build Coastguard Worker }
409*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_recvmsg(struct io_uring_sqe * sqe,int fd,struct msghdr * msg,unsigned flags)410*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_recvmsg(struct io_uring_sqe *sqe, int fd,
411*25da2beaSAndroid Build Coastguard Worker struct msghdr *msg, unsigned flags)
412*25da2beaSAndroid Build Coastguard Worker {
413*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_RECVMSG, sqe, fd, msg, 1, 0);
414*25da2beaSAndroid Build Coastguard Worker sqe->msg_flags = flags;
415*25da2beaSAndroid Build Coastguard Worker }
416*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_sendmsg(struct io_uring_sqe * sqe,int fd,const struct msghdr * msg,unsigned flags)417*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_sendmsg(struct io_uring_sqe *sqe, int fd,
418*25da2beaSAndroid Build Coastguard Worker const struct msghdr *msg,
419*25da2beaSAndroid Build Coastguard Worker unsigned flags)
420*25da2beaSAndroid Build Coastguard Worker {
421*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SENDMSG, sqe, fd, msg, 1, 0);
422*25da2beaSAndroid Build Coastguard Worker sqe->msg_flags = flags;
423*25da2beaSAndroid Build Coastguard Worker }
424*25da2beaSAndroid Build Coastguard Worker
__io_uring_prep_poll_mask(unsigned poll_mask)425*25da2beaSAndroid Build Coastguard Worker static inline unsigned __io_uring_prep_poll_mask(unsigned poll_mask)
426*25da2beaSAndroid Build Coastguard Worker {
427*25da2beaSAndroid Build Coastguard Worker #if __BYTE_ORDER == __BIG_ENDIAN
428*25da2beaSAndroid Build Coastguard Worker poll_mask = __swahw32(poll_mask);
429*25da2beaSAndroid Build Coastguard Worker #endif
430*25da2beaSAndroid Build Coastguard Worker return poll_mask;
431*25da2beaSAndroid Build Coastguard Worker }
432*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_poll_add(struct io_uring_sqe * sqe,int fd,unsigned poll_mask)433*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_poll_add(struct io_uring_sqe *sqe, int fd,
434*25da2beaSAndroid Build Coastguard Worker unsigned poll_mask)
435*25da2beaSAndroid Build Coastguard Worker {
436*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_POLL_ADD, sqe, fd, NULL, 0, 0);
437*25da2beaSAndroid Build Coastguard Worker sqe->poll32_events = __io_uring_prep_poll_mask(poll_mask);
438*25da2beaSAndroid Build Coastguard Worker }
439*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_poll_multishot(struct io_uring_sqe * sqe,int fd,unsigned poll_mask)440*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_poll_multishot(struct io_uring_sqe *sqe,
441*25da2beaSAndroid Build Coastguard Worker int fd, unsigned poll_mask)
442*25da2beaSAndroid Build Coastguard Worker {
443*25da2beaSAndroid Build Coastguard Worker io_uring_prep_poll_add(sqe, fd, poll_mask);
444*25da2beaSAndroid Build Coastguard Worker sqe->len = IORING_POLL_ADD_MULTI;
445*25da2beaSAndroid Build Coastguard Worker }
446*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_poll_remove(struct io_uring_sqe * sqe,__u64 user_data)447*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_poll_remove(struct io_uring_sqe *sqe,
448*25da2beaSAndroid Build Coastguard Worker __u64 user_data)
449*25da2beaSAndroid Build Coastguard Worker {
450*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_POLL_REMOVE, sqe, -1, NULL, 0, 0);
451*25da2beaSAndroid Build Coastguard Worker sqe->addr = user_data;
452*25da2beaSAndroid Build Coastguard Worker }
453*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_poll_update(struct io_uring_sqe * sqe,__u64 old_user_data,__u64 new_user_data,unsigned poll_mask,unsigned flags)454*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_poll_update(struct io_uring_sqe *sqe,
455*25da2beaSAndroid Build Coastguard Worker __u64 old_user_data,
456*25da2beaSAndroid Build Coastguard Worker __u64 new_user_data,
457*25da2beaSAndroid Build Coastguard Worker unsigned poll_mask, unsigned flags)
458*25da2beaSAndroid Build Coastguard Worker {
459*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_POLL_REMOVE, sqe, -1, NULL, flags,
460*25da2beaSAndroid Build Coastguard Worker new_user_data);
461*25da2beaSAndroid Build Coastguard Worker sqe->addr = old_user_data;
462*25da2beaSAndroid Build Coastguard Worker sqe->poll32_events = __io_uring_prep_poll_mask(poll_mask);
463*25da2beaSAndroid Build Coastguard Worker }
464*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_fsync(struct io_uring_sqe * sqe,int fd,unsigned fsync_flags)465*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_fsync(struct io_uring_sqe *sqe, int fd,
466*25da2beaSAndroid Build Coastguard Worker unsigned fsync_flags)
467*25da2beaSAndroid Build Coastguard Worker {
468*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_FSYNC, sqe, fd, NULL, 0, 0);
469*25da2beaSAndroid Build Coastguard Worker sqe->fsync_flags = fsync_flags;
470*25da2beaSAndroid Build Coastguard Worker }
471*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_nop(struct io_uring_sqe * sqe)472*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_nop(struct io_uring_sqe *sqe)
473*25da2beaSAndroid Build Coastguard Worker {
474*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_NOP, sqe, -1, NULL, 0, 0);
475*25da2beaSAndroid Build Coastguard Worker }
476*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_timeout(struct io_uring_sqe * sqe,struct __kernel_timespec * ts,unsigned count,unsigned flags)477*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_timeout(struct io_uring_sqe *sqe,
478*25da2beaSAndroid Build Coastguard Worker struct __kernel_timespec *ts,
479*25da2beaSAndroid Build Coastguard Worker unsigned count, unsigned flags)
480*25da2beaSAndroid Build Coastguard Worker {
481*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_TIMEOUT, sqe, -1, ts, 1, count);
482*25da2beaSAndroid Build Coastguard Worker sqe->timeout_flags = flags;
483*25da2beaSAndroid Build Coastguard Worker }
484*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_timeout_remove(struct io_uring_sqe * sqe,__u64 user_data,unsigned flags)485*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_timeout_remove(struct io_uring_sqe *sqe,
486*25da2beaSAndroid Build Coastguard Worker __u64 user_data, unsigned flags)
487*25da2beaSAndroid Build Coastguard Worker {
488*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_TIMEOUT_REMOVE, sqe, -1, NULL, 0, 0);
489*25da2beaSAndroid Build Coastguard Worker sqe->addr = user_data;
490*25da2beaSAndroid Build Coastguard Worker sqe->timeout_flags = flags;
491*25da2beaSAndroid Build Coastguard Worker }
492*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_timeout_update(struct io_uring_sqe * sqe,struct __kernel_timespec * ts,__u64 user_data,unsigned flags)493*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_timeout_update(struct io_uring_sqe *sqe,
494*25da2beaSAndroid Build Coastguard Worker struct __kernel_timespec *ts,
495*25da2beaSAndroid Build Coastguard Worker __u64 user_data, unsigned flags)
496*25da2beaSAndroid Build Coastguard Worker {
497*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_TIMEOUT_REMOVE, sqe, -1, NULL, 0,
498*25da2beaSAndroid Build Coastguard Worker (uintptr_t) ts);
499*25da2beaSAndroid Build Coastguard Worker sqe->addr = user_data;
500*25da2beaSAndroid Build Coastguard Worker sqe->timeout_flags = flags | IORING_TIMEOUT_UPDATE;
501*25da2beaSAndroid Build Coastguard Worker }
502*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_accept(struct io_uring_sqe * sqe,int fd,struct sockaddr * addr,socklen_t * addrlen,int flags)503*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_accept(struct io_uring_sqe *sqe, int fd,
504*25da2beaSAndroid Build Coastguard Worker struct sockaddr *addr,
505*25da2beaSAndroid Build Coastguard Worker socklen_t *addrlen, int flags)
506*25da2beaSAndroid Build Coastguard Worker {
507*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_ACCEPT, sqe, fd, addr, 0,
508*25da2beaSAndroid Build Coastguard Worker (__u64) (unsigned long) addrlen);
509*25da2beaSAndroid Build Coastguard Worker sqe->accept_flags = (__u32) flags;
510*25da2beaSAndroid Build Coastguard Worker }
511*25da2beaSAndroid Build Coastguard Worker
512*25da2beaSAndroid Build Coastguard Worker /* accept directly into the fixed file table */
io_uring_prep_accept_direct(struct io_uring_sqe * sqe,int fd,struct sockaddr * addr,socklen_t * addrlen,int flags,unsigned int file_index)513*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_accept_direct(struct io_uring_sqe *sqe, int fd,
514*25da2beaSAndroid Build Coastguard Worker struct sockaddr *addr,
515*25da2beaSAndroid Build Coastguard Worker socklen_t *addrlen, int flags,
516*25da2beaSAndroid Build Coastguard Worker unsigned int file_index)
517*25da2beaSAndroid Build Coastguard Worker {
518*25da2beaSAndroid Build Coastguard Worker io_uring_prep_accept(sqe, fd, addr, addrlen, flags);
519*25da2beaSAndroid Build Coastguard Worker __io_uring_set_target_fixed_file(sqe, file_index);
520*25da2beaSAndroid Build Coastguard Worker }
521*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_multishot_accept(struct io_uring_sqe * sqe,int fd,struct sockaddr * addr,socklen_t * addrlen,int flags)522*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_multishot_accept(struct io_uring_sqe *sqe,
523*25da2beaSAndroid Build Coastguard Worker int fd, struct sockaddr *addr,
524*25da2beaSAndroid Build Coastguard Worker socklen_t *addrlen, int flags)
525*25da2beaSAndroid Build Coastguard Worker {
526*25da2beaSAndroid Build Coastguard Worker io_uring_prep_accept(sqe, fd, addr, addrlen, flags);
527*25da2beaSAndroid Build Coastguard Worker sqe->ioprio |= IORING_ACCEPT_MULTISHOT;
528*25da2beaSAndroid Build Coastguard Worker }
529*25da2beaSAndroid Build Coastguard Worker
530*25da2beaSAndroid Build Coastguard Worker /* multishot accept directly into the fixed file table */
io_uring_prep_multishot_accept_direct(struct io_uring_sqe * sqe,int fd,struct sockaddr * addr,socklen_t * addrlen,int flags)531*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_multishot_accept_direct(struct io_uring_sqe *sqe,
532*25da2beaSAndroid Build Coastguard Worker int fd,
533*25da2beaSAndroid Build Coastguard Worker struct sockaddr *addr,
534*25da2beaSAndroid Build Coastguard Worker socklen_t *addrlen,
535*25da2beaSAndroid Build Coastguard Worker int flags)
536*25da2beaSAndroid Build Coastguard Worker {
537*25da2beaSAndroid Build Coastguard Worker io_uring_prep_multishot_accept(sqe, fd, addr, addrlen, flags);
538*25da2beaSAndroid Build Coastguard Worker __io_uring_set_target_fixed_file(sqe, IORING_FILE_INDEX_ALLOC - 1);
539*25da2beaSAndroid Build Coastguard Worker }
540*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_cancel64(struct io_uring_sqe * sqe,__u64 user_data,int flags)541*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_cancel64(struct io_uring_sqe *sqe,
542*25da2beaSAndroid Build Coastguard Worker __u64 user_data, int flags)
543*25da2beaSAndroid Build Coastguard Worker {
544*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_ASYNC_CANCEL, sqe, -1, NULL, 0, 0);
545*25da2beaSAndroid Build Coastguard Worker sqe->addr = user_data;
546*25da2beaSAndroid Build Coastguard Worker sqe->cancel_flags = (__u32) flags;
547*25da2beaSAndroid Build Coastguard Worker }
548*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_cancel(struct io_uring_sqe * sqe,void * user_data,int flags)549*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_cancel(struct io_uring_sqe *sqe,
550*25da2beaSAndroid Build Coastguard Worker void *user_data, int flags)
551*25da2beaSAndroid Build Coastguard Worker {
552*25da2beaSAndroid Build Coastguard Worker io_uring_prep_cancel64(sqe, (__u64) (uintptr_t) user_data, flags);
553*25da2beaSAndroid Build Coastguard Worker }
554*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_cancel_fd(struct io_uring_sqe * sqe,int fd,unsigned int flags)555*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_cancel_fd(struct io_uring_sqe *sqe, int fd,
556*25da2beaSAndroid Build Coastguard Worker unsigned int flags)
557*25da2beaSAndroid Build Coastguard Worker {
558*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_ASYNC_CANCEL, sqe, fd, NULL, 0, 0);
559*25da2beaSAndroid Build Coastguard Worker sqe->cancel_flags = (__u32) flags | IORING_ASYNC_CANCEL_FD;
560*25da2beaSAndroid Build Coastguard Worker }
561*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_link_timeout(struct io_uring_sqe * sqe,struct __kernel_timespec * ts,unsigned flags)562*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_link_timeout(struct io_uring_sqe *sqe,
563*25da2beaSAndroid Build Coastguard Worker struct __kernel_timespec *ts,
564*25da2beaSAndroid Build Coastguard Worker unsigned flags)
565*25da2beaSAndroid Build Coastguard Worker {
566*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_LINK_TIMEOUT, sqe, -1, ts, 1, 0);
567*25da2beaSAndroid Build Coastguard Worker sqe->timeout_flags = flags;
568*25da2beaSAndroid Build Coastguard Worker }
569*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_connect(struct io_uring_sqe * sqe,int fd,const struct sockaddr * addr,socklen_t addrlen)570*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_connect(struct io_uring_sqe *sqe, int fd,
571*25da2beaSAndroid Build Coastguard Worker const struct sockaddr *addr,
572*25da2beaSAndroid Build Coastguard Worker socklen_t addrlen)
573*25da2beaSAndroid Build Coastguard Worker {
574*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_CONNECT, sqe, fd, addr, 0, addrlen);
575*25da2beaSAndroid Build Coastguard Worker }
576*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_files_update(struct io_uring_sqe * sqe,int * fds,unsigned nr_fds,int offset)577*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_files_update(struct io_uring_sqe *sqe,
578*25da2beaSAndroid Build Coastguard Worker int *fds, unsigned nr_fds,
579*25da2beaSAndroid Build Coastguard Worker int offset)
580*25da2beaSAndroid Build Coastguard Worker {
581*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_FILES_UPDATE, sqe, -1, fds, nr_fds,
582*25da2beaSAndroid Build Coastguard Worker (__u64) offset);
583*25da2beaSAndroid Build Coastguard Worker }
584*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_fallocate(struct io_uring_sqe * sqe,int fd,int mode,off_t offset,off_t len)585*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_fallocate(struct io_uring_sqe *sqe, int fd,
586*25da2beaSAndroid Build Coastguard Worker int mode, off_t offset, off_t len)
587*25da2beaSAndroid Build Coastguard Worker {
588*25da2beaSAndroid Build Coastguard Worker
589*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_FALLOCATE, sqe, fd,
590*25da2beaSAndroid Build Coastguard Worker (const uintptr_t *) (unsigned long) len,
591*25da2beaSAndroid Build Coastguard Worker (unsigned int) mode, (__u64) offset);
592*25da2beaSAndroid Build Coastguard Worker }
593*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_openat(struct io_uring_sqe * sqe,int dfd,const char * path,int flags,mode_t mode)594*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_openat(struct io_uring_sqe *sqe, int dfd,
595*25da2beaSAndroid Build Coastguard Worker const char *path, int flags,
596*25da2beaSAndroid Build Coastguard Worker mode_t mode)
597*25da2beaSAndroid Build Coastguard Worker {
598*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_OPENAT, sqe, dfd, path, mode, 0);
599*25da2beaSAndroid Build Coastguard Worker sqe->open_flags = (__u32) flags;
600*25da2beaSAndroid Build Coastguard Worker }
601*25da2beaSAndroid Build Coastguard Worker
602*25da2beaSAndroid Build Coastguard Worker /* open directly into the fixed file table */
io_uring_prep_openat_direct(struct io_uring_sqe * sqe,int dfd,const char * path,int flags,mode_t mode,unsigned file_index)603*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_openat_direct(struct io_uring_sqe *sqe,
604*25da2beaSAndroid Build Coastguard Worker int dfd, const char *path,
605*25da2beaSAndroid Build Coastguard Worker int flags, mode_t mode,
606*25da2beaSAndroid Build Coastguard Worker unsigned file_index)
607*25da2beaSAndroid Build Coastguard Worker {
608*25da2beaSAndroid Build Coastguard Worker io_uring_prep_openat(sqe, dfd, path, flags, mode);
609*25da2beaSAndroid Build Coastguard Worker __io_uring_set_target_fixed_file(sqe, file_index);
610*25da2beaSAndroid Build Coastguard Worker }
611*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_close(struct io_uring_sqe * sqe,int fd)612*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_close(struct io_uring_sqe *sqe, int fd)
613*25da2beaSAndroid Build Coastguard Worker {
614*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_CLOSE, sqe, fd, NULL, 0, 0);
615*25da2beaSAndroid Build Coastguard Worker }
616*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_close_direct(struct io_uring_sqe * sqe,unsigned file_index)617*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_close_direct(struct io_uring_sqe *sqe,
618*25da2beaSAndroid Build Coastguard Worker unsigned file_index)
619*25da2beaSAndroid Build Coastguard Worker {
620*25da2beaSAndroid Build Coastguard Worker io_uring_prep_close(sqe, 0);
621*25da2beaSAndroid Build Coastguard Worker __io_uring_set_target_fixed_file(sqe, file_index);
622*25da2beaSAndroid Build Coastguard Worker }
623*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_read(struct io_uring_sqe * sqe,int fd,void * buf,unsigned nbytes,__u64 offset)624*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_read(struct io_uring_sqe *sqe, int fd,
625*25da2beaSAndroid Build Coastguard Worker void *buf, unsigned nbytes, __u64 offset)
626*25da2beaSAndroid Build Coastguard Worker {
627*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_READ, sqe, fd, buf, nbytes, offset);
628*25da2beaSAndroid Build Coastguard Worker }
629*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_write(struct io_uring_sqe * sqe,int fd,const void * buf,unsigned nbytes,__u64 offset)630*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_write(struct io_uring_sqe *sqe, int fd,
631*25da2beaSAndroid Build Coastguard Worker const void *buf, unsigned nbytes,
632*25da2beaSAndroid Build Coastguard Worker __u64 offset)
633*25da2beaSAndroid Build Coastguard Worker {
634*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_WRITE, sqe, fd, buf, nbytes, offset);
635*25da2beaSAndroid Build Coastguard Worker }
636*25da2beaSAndroid Build Coastguard Worker
637*25da2beaSAndroid Build Coastguard Worker struct statx;
io_uring_prep_statx(struct io_uring_sqe * sqe,int dfd,const char * path,int flags,unsigned mask,struct statx * statxbuf)638*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_statx(struct io_uring_sqe *sqe, int dfd,
639*25da2beaSAndroid Build Coastguard Worker const char *path, int flags, unsigned mask,
640*25da2beaSAndroid Build Coastguard Worker struct statx *statxbuf)
641*25da2beaSAndroid Build Coastguard Worker {
642*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_STATX, sqe, dfd, path, mask,
643*25da2beaSAndroid Build Coastguard Worker (__u64) (unsigned long) statxbuf);
644*25da2beaSAndroid Build Coastguard Worker sqe->statx_flags = (__u32) flags;
645*25da2beaSAndroid Build Coastguard Worker }
646*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_fadvise(struct io_uring_sqe * sqe,int fd,__u64 offset,off_t len,int advice)647*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_fadvise(struct io_uring_sqe *sqe, int fd,
648*25da2beaSAndroid Build Coastguard Worker __u64 offset, off_t len, int advice)
649*25da2beaSAndroid Build Coastguard Worker {
650*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_FADVISE, sqe, fd, NULL, (__u32) len, offset);
651*25da2beaSAndroid Build Coastguard Worker sqe->fadvise_advice = (__u32) advice;
652*25da2beaSAndroid Build Coastguard Worker }
653*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_madvise(struct io_uring_sqe * sqe,void * addr,off_t length,int advice)654*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_madvise(struct io_uring_sqe *sqe, void *addr,
655*25da2beaSAndroid Build Coastguard Worker off_t length, int advice)
656*25da2beaSAndroid Build Coastguard Worker {
657*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_MADVISE, sqe, -1, addr, (__u32) length, 0);
658*25da2beaSAndroid Build Coastguard Worker sqe->fadvise_advice = (__u32) advice;
659*25da2beaSAndroid Build Coastguard Worker }
660*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_send(struct io_uring_sqe * sqe,int sockfd,const void * buf,size_t len,int flags)661*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_send(struct io_uring_sqe *sqe, int sockfd,
662*25da2beaSAndroid Build Coastguard Worker const void *buf, size_t len, int flags)
663*25da2beaSAndroid Build Coastguard Worker {
664*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SEND, sqe, sockfd, buf, (__u32) len, 0);
665*25da2beaSAndroid Build Coastguard Worker sqe->msg_flags = (__u32) flags;
666*25da2beaSAndroid Build Coastguard Worker }
667*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_recv(struct io_uring_sqe * sqe,int sockfd,void * buf,size_t len,int flags)668*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_recv(struct io_uring_sqe *sqe, int sockfd,
669*25da2beaSAndroid Build Coastguard Worker void *buf, size_t len, int flags)
670*25da2beaSAndroid Build Coastguard Worker {
671*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_RECV, sqe, sockfd, buf, (__u32) len, 0);
672*25da2beaSAndroid Build Coastguard Worker sqe->msg_flags = (__u32) flags;
673*25da2beaSAndroid Build Coastguard Worker }
674*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_openat2(struct io_uring_sqe * sqe,int dfd,const char * path,struct open_how * how)675*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_openat2(struct io_uring_sqe *sqe, int dfd,
676*25da2beaSAndroid Build Coastguard Worker const char *path, struct open_how *how)
677*25da2beaSAndroid Build Coastguard Worker {
678*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_OPENAT2, sqe, dfd, path, sizeof(*how),
679*25da2beaSAndroid Build Coastguard Worker (uint64_t) (uintptr_t) how);
680*25da2beaSAndroid Build Coastguard Worker }
681*25da2beaSAndroid Build Coastguard Worker
682*25da2beaSAndroid Build Coastguard Worker /* open directly into the fixed file table */
io_uring_prep_openat2_direct(struct io_uring_sqe * sqe,int dfd,const char * path,struct open_how * how,unsigned file_index)683*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_openat2_direct(struct io_uring_sqe *sqe,
684*25da2beaSAndroid Build Coastguard Worker int dfd, const char *path,
685*25da2beaSAndroid Build Coastguard Worker struct open_how *how,
686*25da2beaSAndroid Build Coastguard Worker unsigned file_index)
687*25da2beaSAndroid Build Coastguard Worker {
688*25da2beaSAndroid Build Coastguard Worker io_uring_prep_openat2(sqe, dfd, path, how);
689*25da2beaSAndroid Build Coastguard Worker __io_uring_set_target_fixed_file(sqe, file_index);
690*25da2beaSAndroid Build Coastguard Worker }
691*25da2beaSAndroid Build Coastguard Worker
692*25da2beaSAndroid Build Coastguard Worker struct epoll_event;
io_uring_prep_epoll_ctl(struct io_uring_sqe * sqe,int epfd,int fd,int op,struct epoll_event * ev)693*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_epoll_ctl(struct io_uring_sqe *sqe, int epfd,
694*25da2beaSAndroid Build Coastguard Worker int fd, int op,
695*25da2beaSAndroid Build Coastguard Worker struct epoll_event *ev)
696*25da2beaSAndroid Build Coastguard Worker {
697*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_EPOLL_CTL, sqe, epfd, ev,
698*25da2beaSAndroid Build Coastguard Worker (__u32) op, (__u32) fd);
699*25da2beaSAndroid Build Coastguard Worker }
700*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_provide_buffers(struct io_uring_sqe * sqe,void * addr,int len,int nr,int bgid,int bid)701*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_provide_buffers(struct io_uring_sqe *sqe,
702*25da2beaSAndroid Build Coastguard Worker void *addr, int len, int nr,
703*25da2beaSAndroid Build Coastguard Worker int bgid, int bid)
704*25da2beaSAndroid Build Coastguard Worker {
705*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_PROVIDE_BUFFERS, sqe, nr, addr, (__u32) len,
706*25da2beaSAndroid Build Coastguard Worker (__u64) bid);
707*25da2beaSAndroid Build Coastguard Worker sqe->buf_group = (__u16) bgid;
708*25da2beaSAndroid Build Coastguard Worker }
709*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_remove_buffers(struct io_uring_sqe * sqe,int nr,int bgid)710*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_remove_buffers(struct io_uring_sqe *sqe,
711*25da2beaSAndroid Build Coastguard Worker int nr, int bgid)
712*25da2beaSAndroid Build Coastguard Worker {
713*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_REMOVE_BUFFERS, sqe, nr, NULL, 0, 0);
714*25da2beaSAndroid Build Coastguard Worker sqe->buf_group = (__u16) bgid;
715*25da2beaSAndroid Build Coastguard Worker }
716*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_shutdown(struct io_uring_sqe * sqe,int fd,int how)717*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_shutdown(struct io_uring_sqe *sqe, int fd,
718*25da2beaSAndroid Build Coastguard Worker int how)
719*25da2beaSAndroid Build Coastguard Worker {
720*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SHUTDOWN, sqe, fd, NULL, (__u32) how, 0);
721*25da2beaSAndroid Build Coastguard Worker }
722*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_unlinkat(struct io_uring_sqe * sqe,int dfd,const char * path,int flags)723*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_unlinkat(struct io_uring_sqe *sqe, int dfd,
724*25da2beaSAndroid Build Coastguard Worker const char *path, int flags)
725*25da2beaSAndroid Build Coastguard Worker {
726*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_UNLINKAT, sqe, dfd, path, 0, 0);
727*25da2beaSAndroid Build Coastguard Worker sqe->unlink_flags = (__u32) flags;
728*25da2beaSAndroid Build Coastguard Worker }
729*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_unlink(struct io_uring_sqe * sqe,const char * path,int flags)730*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_unlink(struct io_uring_sqe *sqe,
731*25da2beaSAndroid Build Coastguard Worker const char *path, int flags)
732*25da2beaSAndroid Build Coastguard Worker {
733*25da2beaSAndroid Build Coastguard Worker io_uring_prep_unlinkat(sqe, AT_FDCWD, path, flags);
734*25da2beaSAndroid Build Coastguard Worker }
735*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_renameat(struct io_uring_sqe * sqe,int olddfd,const char * oldpath,int newdfd,const char * newpath,int flags)736*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_renameat(struct io_uring_sqe *sqe, int olddfd,
737*25da2beaSAndroid Build Coastguard Worker const char *oldpath, int newdfd,
738*25da2beaSAndroid Build Coastguard Worker const char *newpath, int flags)
739*25da2beaSAndroid Build Coastguard Worker {
740*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_RENAMEAT, sqe, olddfd, oldpath,
741*25da2beaSAndroid Build Coastguard Worker (__u32) newdfd,
742*25da2beaSAndroid Build Coastguard Worker (uint64_t) (uintptr_t) newpath);
743*25da2beaSAndroid Build Coastguard Worker sqe->rename_flags = (__u32) flags;
744*25da2beaSAndroid Build Coastguard Worker }
745*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_rename(struct io_uring_sqe * sqe,const char * oldpath,const char * newpath)746*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_rename(struct io_uring_sqe *sqe,
747*25da2beaSAndroid Build Coastguard Worker const char *oldpath, const char *newpath)
748*25da2beaSAndroid Build Coastguard Worker {
749*25da2beaSAndroid Build Coastguard Worker io_uring_prep_renameat(sqe, AT_FDCWD, oldpath, AT_FDCWD, newpath, 0);
750*25da2beaSAndroid Build Coastguard Worker }
751*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_sync_file_range(struct io_uring_sqe * sqe,int fd,unsigned len,__u64 offset,int flags)752*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_sync_file_range(struct io_uring_sqe *sqe,
753*25da2beaSAndroid Build Coastguard Worker int fd, unsigned len,
754*25da2beaSAndroid Build Coastguard Worker __u64 offset, int flags)
755*25da2beaSAndroid Build Coastguard Worker {
756*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SYNC_FILE_RANGE, sqe, fd, NULL, len, offset);
757*25da2beaSAndroid Build Coastguard Worker sqe->sync_range_flags = (__u32) flags;
758*25da2beaSAndroid Build Coastguard Worker }
759*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_mkdirat(struct io_uring_sqe * sqe,int dfd,const char * path,mode_t mode)760*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_mkdirat(struct io_uring_sqe *sqe, int dfd,
761*25da2beaSAndroid Build Coastguard Worker const char *path, mode_t mode)
762*25da2beaSAndroid Build Coastguard Worker {
763*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_MKDIRAT, sqe, dfd, path, mode, 0);
764*25da2beaSAndroid Build Coastguard Worker }
765*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_mkdir(struct io_uring_sqe * sqe,const char * path,mode_t mode)766*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_mkdir(struct io_uring_sqe *sqe,
767*25da2beaSAndroid Build Coastguard Worker const char *path, mode_t mode)
768*25da2beaSAndroid Build Coastguard Worker {
769*25da2beaSAndroid Build Coastguard Worker io_uring_prep_mkdirat(sqe, AT_FDCWD, path, mode);
770*25da2beaSAndroid Build Coastguard Worker }
771*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_symlinkat(struct io_uring_sqe * sqe,const char * target,int newdirfd,const char * linkpath)772*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_symlinkat(struct io_uring_sqe *sqe,
773*25da2beaSAndroid Build Coastguard Worker const char *target, int newdirfd,
774*25da2beaSAndroid Build Coastguard Worker const char *linkpath)
775*25da2beaSAndroid Build Coastguard Worker {
776*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SYMLINKAT, sqe, newdirfd, target, 0,
777*25da2beaSAndroid Build Coastguard Worker (uint64_t) (uintptr_t) linkpath);
778*25da2beaSAndroid Build Coastguard Worker }
779*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_symlink(struct io_uring_sqe * sqe,const char * target,const char * linkpath)780*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_symlink(struct io_uring_sqe *sqe,
781*25da2beaSAndroid Build Coastguard Worker const char *target, const char *linkpath)
782*25da2beaSAndroid Build Coastguard Worker {
783*25da2beaSAndroid Build Coastguard Worker io_uring_prep_symlinkat(sqe, target, AT_FDCWD, linkpath);
784*25da2beaSAndroid Build Coastguard Worker }
785*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_linkat(struct io_uring_sqe * sqe,int olddfd,const char * oldpath,int newdfd,const char * newpath,int flags)786*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_linkat(struct io_uring_sqe *sqe, int olddfd,
787*25da2beaSAndroid Build Coastguard Worker const char *oldpath, int newdfd,
788*25da2beaSAndroid Build Coastguard Worker const char *newpath, int flags)
789*25da2beaSAndroid Build Coastguard Worker {
790*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_LINKAT, sqe, olddfd, oldpath, (__u32) newdfd,
791*25da2beaSAndroid Build Coastguard Worker (uint64_t) (uintptr_t) newpath);
792*25da2beaSAndroid Build Coastguard Worker sqe->hardlink_flags = (__u32) flags;
793*25da2beaSAndroid Build Coastguard Worker }
794*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_link(struct io_uring_sqe * sqe,const char * oldpath,const char * newpath,int flags)795*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_link(struct io_uring_sqe *sqe,
796*25da2beaSAndroid Build Coastguard Worker const char *oldpath, const char *newpath, int flags)
797*25da2beaSAndroid Build Coastguard Worker {
798*25da2beaSAndroid Build Coastguard Worker io_uring_prep_linkat(sqe, AT_FDCWD, oldpath, AT_FDCWD, newpath, flags);
799*25da2beaSAndroid Build Coastguard Worker }
800*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_msg_ring(struct io_uring_sqe * sqe,int fd,unsigned int len,__u64 data,unsigned int flags)801*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_msg_ring(struct io_uring_sqe *sqe, int fd,
802*25da2beaSAndroid Build Coastguard Worker unsigned int len, __u64 data,
803*25da2beaSAndroid Build Coastguard Worker unsigned int flags)
804*25da2beaSAndroid Build Coastguard Worker {
805*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_MSG_RING, sqe, fd, NULL, len, data);
806*25da2beaSAndroid Build Coastguard Worker sqe->rw_flags = flags;
807*25da2beaSAndroid Build Coastguard Worker }
808*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_getxattr(struct io_uring_sqe * sqe,const char * name,const char * value,const char * path,size_t len)809*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_getxattr(struct io_uring_sqe *sqe,
810*25da2beaSAndroid Build Coastguard Worker const char *name,
811*25da2beaSAndroid Build Coastguard Worker const char *value,
812*25da2beaSAndroid Build Coastguard Worker const char *path,
813*25da2beaSAndroid Build Coastguard Worker size_t len)
814*25da2beaSAndroid Build Coastguard Worker {
815*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_GETXATTR, sqe, 0, name, len,
816*25da2beaSAndroid Build Coastguard Worker (__u64) (uintptr_t) value);
817*25da2beaSAndroid Build Coastguard Worker sqe->addr3 = (__u64) (uintptr_t) path;
818*25da2beaSAndroid Build Coastguard Worker sqe->xattr_flags = 0;
819*25da2beaSAndroid Build Coastguard Worker }
820*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_setxattr(struct io_uring_sqe * sqe,const char * name,const char * value,const char * path,int flags,size_t len)821*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_setxattr(struct io_uring_sqe *sqe,
822*25da2beaSAndroid Build Coastguard Worker const char *name,
823*25da2beaSAndroid Build Coastguard Worker const char *value,
824*25da2beaSAndroid Build Coastguard Worker const char *path,
825*25da2beaSAndroid Build Coastguard Worker int flags,
826*25da2beaSAndroid Build Coastguard Worker size_t len)
827*25da2beaSAndroid Build Coastguard Worker {
828*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SETXATTR, sqe, 0, name, len,
829*25da2beaSAndroid Build Coastguard Worker (__u64) (uintptr_t) value);
830*25da2beaSAndroid Build Coastguard Worker sqe->addr3 = (__u64) (uintptr_t) path;
831*25da2beaSAndroid Build Coastguard Worker sqe->xattr_flags = flags;
832*25da2beaSAndroid Build Coastguard Worker }
833*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_fgetxattr(struct io_uring_sqe * sqe,int fd,const char * name,const char * value,size_t len)834*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_fgetxattr(struct io_uring_sqe *sqe,
835*25da2beaSAndroid Build Coastguard Worker int fd,
836*25da2beaSAndroid Build Coastguard Worker const char *name,
837*25da2beaSAndroid Build Coastguard Worker const char *value,
838*25da2beaSAndroid Build Coastguard Worker size_t len)
839*25da2beaSAndroid Build Coastguard Worker {
840*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_FGETXATTR, sqe, fd, name, len,
841*25da2beaSAndroid Build Coastguard Worker (__u64) (uintptr_t) value);
842*25da2beaSAndroid Build Coastguard Worker sqe->xattr_flags = 0;
843*25da2beaSAndroid Build Coastguard Worker }
844*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_fsetxattr(struct io_uring_sqe * sqe,int fd,const char * name,const char * value,int flags,size_t len)845*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_fsetxattr(struct io_uring_sqe *sqe,
846*25da2beaSAndroid Build Coastguard Worker int fd,
847*25da2beaSAndroid Build Coastguard Worker const char *name,
848*25da2beaSAndroid Build Coastguard Worker const char *value,
849*25da2beaSAndroid Build Coastguard Worker int flags,
850*25da2beaSAndroid Build Coastguard Worker size_t len)
851*25da2beaSAndroid Build Coastguard Worker {
852*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_FSETXATTR, sqe, fd, name, len,
853*25da2beaSAndroid Build Coastguard Worker (__u64) (uintptr_t) value);
854*25da2beaSAndroid Build Coastguard Worker sqe->xattr_flags = flags;
855*25da2beaSAndroid Build Coastguard Worker }
856*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_socket(struct io_uring_sqe * sqe,int domain,int type,int protocol,unsigned int flags)857*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_socket(struct io_uring_sqe *sqe, int domain,
858*25da2beaSAndroid Build Coastguard Worker int type, int protocol,
859*25da2beaSAndroid Build Coastguard Worker unsigned int flags)
860*25da2beaSAndroid Build Coastguard Worker {
861*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SOCKET, sqe, domain, NULL, protocol, type);
862*25da2beaSAndroid Build Coastguard Worker sqe->rw_flags = flags;
863*25da2beaSAndroid Build Coastguard Worker }
864*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_socket_direct(struct io_uring_sqe * sqe,int domain,int type,int protocol,unsigned file_index,unsigned int flags)865*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_socket_direct(struct io_uring_sqe *sqe,
866*25da2beaSAndroid Build Coastguard Worker int domain, int type,
867*25da2beaSAndroid Build Coastguard Worker int protocol,
868*25da2beaSAndroid Build Coastguard Worker unsigned file_index,
869*25da2beaSAndroid Build Coastguard Worker unsigned int flags)
870*25da2beaSAndroid Build Coastguard Worker {
871*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SOCKET, sqe, domain, NULL, protocol, type);
872*25da2beaSAndroid Build Coastguard Worker sqe->rw_flags = flags;
873*25da2beaSAndroid Build Coastguard Worker __io_uring_set_target_fixed_file(sqe, file_index);
874*25da2beaSAndroid Build Coastguard Worker }
875*25da2beaSAndroid Build Coastguard Worker
io_uring_prep_socket_direct_alloc(struct io_uring_sqe * sqe,int domain,int type,int protocol,unsigned int flags)876*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_prep_socket_direct_alloc(struct io_uring_sqe *sqe,
877*25da2beaSAndroid Build Coastguard Worker int domain, int type, int protocol,
878*25da2beaSAndroid Build Coastguard Worker unsigned int flags)
879*25da2beaSAndroid Build Coastguard Worker {
880*25da2beaSAndroid Build Coastguard Worker io_uring_prep_rw(IORING_OP_SOCKET, sqe, domain, NULL, protocol, type);
881*25da2beaSAndroid Build Coastguard Worker sqe->rw_flags = flags;
882*25da2beaSAndroid Build Coastguard Worker __io_uring_set_target_fixed_file(sqe, IORING_FILE_INDEX_ALLOC - 1);
883*25da2beaSAndroid Build Coastguard Worker }
884*25da2beaSAndroid Build Coastguard Worker
885*25da2beaSAndroid Build Coastguard Worker /*
886*25da2beaSAndroid Build Coastguard Worker * Returns number of unconsumed (if SQPOLL) or unsubmitted entries exist in
887*25da2beaSAndroid Build Coastguard Worker * the SQ ring
888*25da2beaSAndroid Build Coastguard Worker */
io_uring_sq_ready(const struct io_uring * ring)889*25da2beaSAndroid Build Coastguard Worker static inline unsigned io_uring_sq_ready(const struct io_uring *ring)
890*25da2beaSAndroid Build Coastguard Worker {
891*25da2beaSAndroid Build Coastguard Worker unsigned khead = *ring->sq.khead;
892*25da2beaSAndroid Build Coastguard Worker
893*25da2beaSAndroid Build Coastguard Worker /*
894*25da2beaSAndroid Build Coastguard Worker * Without a barrier, we could miss an update and think the SQ wasn't
895*25da2beaSAndroid Build Coastguard Worker * ready. We don't need the load acquire for non-SQPOLL since then we
896*25da2beaSAndroid Build Coastguard Worker * drive updates.
897*25da2beaSAndroid Build Coastguard Worker */
898*25da2beaSAndroid Build Coastguard Worker if (ring->flags & IORING_SETUP_SQPOLL)
899*25da2beaSAndroid Build Coastguard Worker khead = io_uring_smp_load_acquire(ring->sq.khead);
900*25da2beaSAndroid Build Coastguard Worker
901*25da2beaSAndroid Build Coastguard Worker /* always use real head, to avoid losing sync for short submit */
902*25da2beaSAndroid Build Coastguard Worker return ring->sq.sqe_tail - khead;
903*25da2beaSAndroid Build Coastguard Worker }
904*25da2beaSAndroid Build Coastguard Worker
905*25da2beaSAndroid Build Coastguard Worker /*
906*25da2beaSAndroid Build Coastguard Worker * Returns how much space is left in the SQ ring.
907*25da2beaSAndroid Build Coastguard Worker */
io_uring_sq_space_left(const struct io_uring * ring)908*25da2beaSAndroid Build Coastguard Worker static inline unsigned io_uring_sq_space_left(const struct io_uring *ring)
909*25da2beaSAndroid Build Coastguard Worker {
910*25da2beaSAndroid Build Coastguard Worker return *ring->sq.kring_entries - io_uring_sq_ready(ring);
911*25da2beaSAndroid Build Coastguard Worker }
912*25da2beaSAndroid Build Coastguard Worker
913*25da2beaSAndroid Build Coastguard Worker /*
914*25da2beaSAndroid Build Coastguard Worker * Only applicable when using SQPOLL - allows the caller to wait for space
915*25da2beaSAndroid Build Coastguard Worker * to free up in the SQ ring, which happens when the kernel side thread has
916*25da2beaSAndroid Build Coastguard Worker * consumed one or more entries. If the SQ ring is currently non-full, no
917*25da2beaSAndroid Build Coastguard Worker * action is taken. Note: may return -EINVAL if the kernel doesn't support
918*25da2beaSAndroid Build Coastguard Worker * this feature.
919*25da2beaSAndroid Build Coastguard Worker */
io_uring_sqring_wait(struct io_uring * ring)920*25da2beaSAndroid Build Coastguard Worker static inline int io_uring_sqring_wait(struct io_uring *ring)
921*25da2beaSAndroid Build Coastguard Worker {
922*25da2beaSAndroid Build Coastguard Worker if (!(ring->flags & IORING_SETUP_SQPOLL))
923*25da2beaSAndroid Build Coastguard Worker return 0;
924*25da2beaSAndroid Build Coastguard Worker if (io_uring_sq_space_left(ring))
925*25da2beaSAndroid Build Coastguard Worker return 0;
926*25da2beaSAndroid Build Coastguard Worker
927*25da2beaSAndroid Build Coastguard Worker return __io_uring_sqring_wait(ring);
928*25da2beaSAndroid Build Coastguard Worker }
929*25da2beaSAndroid Build Coastguard Worker
930*25da2beaSAndroid Build Coastguard Worker /*
931*25da2beaSAndroid Build Coastguard Worker * Returns how many unconsumed entries are ready in the CQ ring
932*25da2beaSAndroid Build Coastguard Worker */
io_uring_cq_ready(const struct io_uring * ring)933*25da2beaSAndroid Build Coastguard Worker static inline unsigned io_uring_cq_ready(const struct io_uring *ring)
934*25da2beaSAndroid Build Coastguard Worker {
935*25da2beaSAndroid Build Coastguard Worker return io_uring_smp_load_acquire(ring->cq.ktail) - *ring->cq.khead;
936*25da2beaSAndroid Build Coastguard Worker }
937*25da2beaSAndroid Build Coastguard Worker
938*25da2beaSAndroid Build Coastguard Worker /*
939*25da2beaSAndroid Build Coastguard Worker * Returns true if the eventfd notification is currently enabled
940*25da2beaSAndroid Build Coastguard Worker */
io_uring_cq_eventfd_enabled(const struct io_uring * ring)941*25da2beaSAndroid Build Coastguard Worker static inline bool io_uring_cq_eventfd_enabled(const struct io_uring *ring)
942*25da2beaSAndroid Build Coastguard Worker {
943*25da2beaSAndroid Build Coastguard Worker if (!ring->cq.kflags)
944*25da2beaSAndroid Build Coastguard Worker return true;
945*25da2beaSAndroid Build Coastguard Worker
946*25da2beaSAndroid Build Coastguard Worker return !(*ring->cq.kflags & IORING_CQ_EVENTFD_DISABLED);
947*25da2beaSAndroid Build Coastguard Worker }
948*25da2beaSAndroid Build Coastguard Worker
949*25da2beaSAndroid Build Coastguard Worker /*
950*25da2beaSAndroid Build Coastguard Worker * Toggle eventfd notification on or off, if an eventfd is registered with
951*25da2beaSAndroid Build Coastguard Worker * the ring.
952*25da2beaSAndroid Build Coastguard Worker */
io_uring_cq_eventfd_toggle(struct io_uring * ring,bool enabled)953*25da2beaSAndroid Build Coastguard Worker static inline int io_uring_cq_eventfd_toggle(struct io_uring *ring,
954*25da2beaSAndroid Build Coastguard Worker bool enabled)
955*25da2beaSAndroid Build Coastguard Worker {
956*25da2beaSAndroid Build Coastguard Worker uint32_t flags;
957*25da2beaSAndroid Build Coastguard Worker
958*25da2beaSAndroid Build Coastguard Worker if (!!enabled == io_uring_cq_eventfd_enabled(ring))
959*25da2beaSAndroid Build Coastguard Worker return 0;
960*25da2beaSAndroid Build Coastguard Worker
961*25da2beaSAndroid Build Coastguard Worker if (!ring->cq.kflags)
962*25da2beaSAndroid Build Coastguard Worker return -EOPNOTSUPP;
963*25da2beaSAndroid Build Coastguard Worker
964*25da2beaSAndroid Build Coastguard Worker flags = *ring->cq.kflags;
965*25da2beaSAndroid Build Coastguard Worker
966*25da2beaSAndroid Build Coastguard Worker if (enabled)
967*25da2beaSAndroid Build Coastguard Worker flags &= ~IORING_CQ_EVENTFD_DISABLED;
968*25da2beaSAndroid Build Coastguard Worker else
969*25da2beaSAndroid Build Coastguard Worker flags |= IORING_CQ_EVENTFD_DISABLED;
970*25da2beaSAndroid Build Coastguard Worker
971*25da2beaSAndroid Build Coastguard Worker IO_URING_WRITE_ONCE(*ring->cq.kflags, flags);
972*25da2beaSAndroid Build Coastguard Worker
973*25da2beaSAndroid Build Coastguard Worker return 0;
974*25da2beaSAndroid Build Coastguard Worker }
975*25da2beaSAndroid Build Coastguard Worker
976*25da2beaSAndroid Build Coastguard Worker /*
977*25da2beaSAndroid Build Coastguard Worker * Return an IO completion, waiting for 'wait_nr' completions if one isn't
978*25da2beaSAndroid Build Coastguard Worker * readily available. Returns 0 with cqe_ptr filled in on success, -errno on
979*25da2beaSAndroid Build Coastguard Worker * failure.
980*25da2beaSAndroid Build Coastguard Worker */
io_uring_wait_cqe_nr(struct io_uring * ring,struct io_uring_cqe ** cqe_ptr,unsigned wait_nr)981*25da2beaSAndroid Build Coastguard Worker static inline int io_uring_wait_cqe_nr(struct io_uring *ring,
982*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqe_ptr,
983*25da2beaSAndroid Build Coastguard Worker unsigned wait_nr)
984*25da2beaSAndroid Build Coastguard Worker {
985*25da2beaSAndroid Build Coastguard Worker return __io_uring_get_cqe(ring, cqe_ptr, 0, wait_nr, NULL);
986*25da2beaSAndroid Build Coastguard Worker }
987*25da2beaSAndroid Build Coastguard Worker
988*25da2beaSAndroid Build Coastguard Worker /*
989*25da2beaSAndroid Build Coastguard Worker * Internal helper, don't use directly in applications. Use one of the
990*25da2beaSAndroid Build Coastguard Worker * "official" versions of this, io_uring_peek_cqe(), io_uring_wait_cqe(),
991*25da2beaSAndroid Build Coastguard Worker * or io_uring_wait_cqes*().
992*25da2beaSAndroid Build Coastguard Worker */
__io_uring_peek_cqe(struct io_uring * ring,struct io_uring_cqe ** cqe_ptr,unsigned * nr_available)993*25da2beaSAndroid Build Coastguard Worker static inline int __io_uring_peek_cqe(struct io_uring *ring,
994*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqe_ptr,
995*25da2beaSAndroid Build Coastguard Worker unsigned *nr_available)
996*25da2beaSAndroid Build Coastguard Worker {
997*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe *cqe;
998*25da2beaSAndroid Build Coastguard Worker int err = 0;
999*25da2beaSAndroid Build Coastguard Worker unsigned available;
1000*25da2beaSAndroid Build Coastguard Worker unsigned mask = *ring->cq.kring_mask;
1001*25da2beaSAndroid Build Coastguard Worker int shift = 0;
1002*25da2beaSAndroid Build Coastguard Worker
1003*25da2beaSAndroid Build Coastguard Worker if (ring->flags & IORING_SETUP_CQE32)
1004*25da2beaSAndroid Build Coastguard Worker shift = 1;
1005*25da2beaSAndroid Build Coastguard Worker
1006*25da2beaSAndroid Build Coastguard Worker do {
1007*25da2beaSAndroid Build Coastguard Worker unsigned tail = io_uring_smp_load_acquire(ring->cq.ktail);
1008*25da2beaSAndroid Build Coastguard Worker unsigned head = *ring->cq.khead;
1009*25da2beaSAndroid Build Coastguard Worker
1010*25da2beaSAndroid Build Coastguard Worker cqe = NULL;
1011*25da2beaSAndroid Build Coastguard Worker available = tail - head;
1012*25da2beaSAndroid Build Coastguard Worker if (!available)
1013*25da2beaSAndroid Build Coastguard Worker break;
1014*25da2beaSAndroid Build Coastguard Worker
1015*25da2beaSAndroid Build Coastguard Worker cqe = &ring->cq.cqes[(head & mask) << shift];
1016*25da2beaSAndroid Build Coastguard Worker if (!(ring->features & IORING_FEAT_EXT_ARG) &&
1017*25da2beaSAndroid Build Coastguard Worker cqe->user_data == LIBURING_UDATA_TIMEOUT) {
1018*25da2beaSAndroid Build Coastguard Worker if (cqe->res < 0)
1019*25da2beaSAndroid Build Coastguard Worker err = cqe->res;
1020*25da2beaSAndroid Build Coastguard Worker io_uring_cq_advance(ring, 1);
1021*25da2beaSAndroid Build Coastguard Worker if (!err)
1022*25da2beaSAndroid Build Coastguard Worker continue;
1023*25da2beaSAndroid Build Coastguard Worker cqe = NULL;
1024*25da2beaSAndroid Build Coastguard Worker }
1025*25da2beaSAndroid Build Coastguard Worker
1026*25da2beaSAndroid Build Coastguard Worker break;
1027*25da2beaSAndroid Build Coastguard Worker } while (1);
1028*25da2beaSAndroid Build Coastguard Worker
1029*25da2beaSAndroid Build Coastguard Worker *cqe_ptr = cqe;
1030*25da2beaSAndroid Build Coastguard Worker if (nr_available)
1031*25da2beaSAndroid Build Coastguard Worker *nr_available = available;
1032*25da2beaSAndroid Build Coastguard Worker return err;
1033*25da2beaSAndroid Build Coastguard Worker }
1034*25da2beaSAndroid Build Coastguard Worker
1035*25da2beaSAndroid Build Coastguard Worker /*
1036*25da2beaSAndroid Build Coastguard Worker * Return an IO completion, if one is readily available. Returns 0 with
1037*25da2beaSAndroid Build Coastguard Worker * cqe_ptr filled in on success, -errno on failure.
1038*25da2beaSAndroid Build Coastguard Worker */
io_uring_peek_cqe(struct io_uring * ring,struct io_uring_cqe ** cqe_ptr)1039*25da2beaSAndroid Build Coastguard Worker static inline int io_uring_peek_cqe(struct io_uring *ring,
1040*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqe_ptr)
1041*25da2beaSAndroid Build Coastguard Worker {
1042*25da2beaSAndroid Build Coastguard Worker if (!__io_uring_peek_cqe(ring, cqe_ptr, NULL) && *cqe_ptr)
1043*25da2beaSAndroid Build Coastguard Worker return 0;
1044*25da2beaSAndroid Build Coastguard Worker
1045*25da2beaSAndroid Build Coastguard Worker return io_uring_wait_cqe_nr(ring, cqe_ptr, 0);
1046*25da2beaSAndroid Build Coastguard Worker }
1047*25da2beaSAndroid Build Coastguard Worker
1048*25da2beaSAndroid Build Coastguard Worker /*
1049*25da2beaSAndroid Build Coastguard Worker * Return an IO completion, waiting for it if necessary. Returns 0 with
1050*25da2beaSAndroid Build Coastguard Worker * cqe_ptr filled in on success, -errno on failure.
1051*25da2beaSAndroid Build Coastguard Worker */
io_uring_wait_cqe(struct io_uring * ring,struct io_uring_cqe ** cqe_ptr)1052*25da2beaSAndroid Build Coastguard Worker static inline int io_uring_wait_cqe(struct io_uring *ring,
1053*25da2beaSAndroid Build Coastguard Worker struct io_uring_cqe **cqe_ptr)
1054*25da2beaSAndroid Build Coastguard Worker {
1055*25da2beaSAndroid Build Coastguard Worker if (!__io_uring_peek_cqe(ring, cqe_ptr, NULL) && *cqe_ptr)
1056*25da2beaSAndroid Build Coastguard Worker return 0;
1057*25da2beaSAndroid Build Coastguard Worker
1058*25da2beaSAndroid Build Coastguard Worker return io_uring_wait_cqe_nr(ring, cqe_ptr, 1);
1059*25da2beaSAndroid Build Coastguard Worker }
1060*25da2beaSAndroid Build Coastguard Worker
1061*25da2beaSAndroid Build Coastguard Worker /*
1062*25da2beaSAndroid Build Coastguard Worker * Return an sqe to fill. Application must later call io_uring_submit()
1063*25da2beaSAndroid Build Coastguard Worker * when it's ready to tell the kernel about it. The caller may call this
1064*25da2beaSAndroid Build Coastguard Worker * function multiple times before calling io_uring_submit().
1065*25da2beaSAndroid Build Coastguard Worker *
1066*25da2beaSAndroid Build Coastguard Worker * Returns a vacant sqe, or NULL if we're full.
1067*25da2beaSAndroid Build Coastguard Worker */
_io_uring_get_sqe(struct io_uring * ring)1068*25da2beaSAndroid Build Coastguard Worker static inline struct io_uring_sqe *_io_uring_get_sqe(struct io_uring *ring)
1069*25da2beaSAndroid Build Coastguard Worker {
1070*25da2beaSAndroid Build Coastguard Worker struct io_uring_sq *sq = &ring->sq;
1071*25da2beaSAndroid Build Coastguard Worker unsigned int head = io_uring_smp_load_acquire(sq->khead);
1072*25da2beaSAndroid Build Coastguard Worker unsigned int next = sq->sqe_tail + 1;
1073*25da2beaSAndroid Build Coastguard Worker int shift = 0;
1074*25da2beaSAndroid Build Coastguard Worker
1075*25da2beaSAndroid Build Coastguard Worker if (ring->flags & IORING_SETUP_SQE128)
1076*25da2beaSAndroid Build Coastguard Worker shift = 1;
1077*25da2beaSAndroid Build Coastguard Worker
1078*25da2beaSAndroid Build Coastguard Worker if (next - head <= *sq->kring_entries) {
1079*25da2beaSAndroid Build Coastguard Worker struct io_uring_sqe *sqe;
1080*25da2beaSAndroid Build Coastguard Worker
1081*25da2beaSAndroid Build Coastguard Worker sqe = &sq->sqes[(sq->sqe_tail & *sq->kring_mask) << shift];
1082*25da2beaSAndroid Build Coastguard Worker sq->sqe_tail = next;
1083*25da2beaSAndroid Build Coastguard Worker return sqe;
1084*25da2beaSAndroid Build Coastguard Worker }
1085*25da2beaSAndroid Build Coastguard Worker
1086*25da2beaSAndroid Build Coastguard Worker return NULL;
1087*25da2beaSAndroid Build Coastguard Worker }
1088*25da2beaSAndroid Build Coastguard Worker
1089*25da2beaSAndroid Build Coastguard Worker /*
1090*25da2beaSAndroid Build Coastguard Worker * Return the appropriate mask for a buffer ring of size 'ring_entries'
1091*25da2beaSAndroid Build Coastguard Worker */
io_uring_buf_ring_mask(__u32 ring_entries)1092*25da2beaSAndroid Build Coastguard Worker static inline int io_uring_buf_ring_mask(__u32 ring_entries)
1093*25da2beaSAndroid Build Coastguard Worker {
1094*25da2beaSAndroid Build Coastguard Worker return ring_entries - 1;
1095*25da2beaSAndroid Build Coastguard Worker }
1096*25da2beaSAndroid Build Coastguard Worker
io_uring_buf_ring_init(struct io_uring_buf_ring * br)1097*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_buf_ring_init(struct io_uring_buf_ring *br)
1098*25da2beaSAndroid Build Coastguard Worker {
1099*25da2beaSAndroid Build Coastguard Worker br->tail = 0;
1100*25da2beaSAndroid Build Coastguard Worker }
1101*25da2beaSAndroid Build Coastguard Worker
1102*25da2beaSAndroid Build Coastguard Worker /*
1103*25da2beaSAndroid Build Coastguard Worker * Assign 'buf' with the addr/len/buffer ID supplied
1104*25da2beaSAndroid Build Coastguard Worker */
io_uring_buf_ring_add(struct io_uring_buf_ring * br,void * addr,unsigned int len,unsigned short bid,int mask,int buf_offset)1105*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_buf_ring_add(struct io_uring_buf_ring *br,
1106*25da2beaSAndroid Build Coastguard Worker void *addr, unsigned int len,
1107*25da2beaSAndroid Build Coastguard Worker unsigned short bid, int mask,
1108*25da2beaSAndroid Build Coastguard Worker int buf_offset)
1109*25da2beaSAndroid Build Coastguard Worker {
1110*25da2beaSAndroid Build Coastguard Worker struct io_uring_buf *buf = &br->bufs[(br->tail + buf_offset) & mask];
1111*25da2beaSAndroid Build Coastguard Worker
1112*25da2beaSAndroid Build Coastguard Worker buf->addr = (unsigned long) (uintptr_t) addr;
1113*25da2beaSAndroid Build Coastguard Worker buf->len = len;
1114*25da2beaSAndroid Build Coastguard Worker buf->bid = bid;
1115*25da2beaSAndroid Build Coastguard Worker }
1116*25da2beaSAndroid Build Coastguard Worker
1117*25da2beaSAndroid Build Coastguard Worker /*
1118*25da2beaSAndroid Build Coastguard Worker * Make 'count' new buffers visible to the kernel. Called after
1119*25da2beaSAndroid Build Coastguard Worker * io_uring_buf_ring_add() has been called 'count' times to fill in new
1120*25da2beaSAndroid Build Coastguard Worker * buffers.
1121*25da2beaSAndroid Build Coastguard Worker */
io_uring_buf_ring_advance(struct io_uring_buf_ring * br,int count)1122*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_buf_ring_advance(struct io_uring_buf_ring *br,
1123*25da2beaSAndroid Build Coastguard Worker int count)
1124*25da2beaSAndroid Build Coastguard Worker {
1125*25da2beaSAndroid Build Coastguard Worker unsigned short new_tail = br->tail + count;
1126*25da2beaSAndroid Build Coastguard Worker
1127*25da2beaSAndroid Build Coastguard Worker io_uring_smp_store_release(&br->tail, new_tail);
1128*25da2beaSAndroid Build Coastguard Worker }
1129*25da2beaSAndroid Build Coastguard Worker
1130*25da2beaSAndroid Build Coastguard Worker /*
1131*25da2beaSAndroid Build Coastguard Worker * Make 'count' new buffers visible to the kernel while at the same time
1132*25da2beaSAndroid Build Coastguard Worker * advancing the CQ ring seen entries. This can be used when the application
1133*25da2beaSAndroid Build Coastguard Worker * is using ring provided buffers and returns buffers while processing CQEs,
1134*25da2beaSAndroid Build Coastguard Worker * avoiding an extra atomic when needing to increment both the CQ ring and
1135*25da2beaSAndroid Build Coastguard Worker * the ring buffer index at the same time.
1136*25da2beaSAndroid Build Coastguard Worker */
io_uring_buf_ring_cq_advance(struct io_uring * ring,struct io_uring_buf_ring * br,int count)1137*25da2beaSAndroid Build Coastguard Worker static inline void io_uring_buf_ring_cq_advance(struct io_uring *ring,
1138*25da2beaSAndroid Build Coastguard Worker struct io_uring_buf_ring *br,
1139*25da2beaSAndroid Build Coastguard Worker int count)
1140*25da2beaSAndroid Build Coastguard Worker {
1141*25da2beaSAndroid Build Coastguard Worker br->tail += count;
1142*25da2beaSAndroid Build Coastguard Worker io_uring_cq_advance(ring, count);
1143*25da2beaSAndroid Build Coastguard Worker }
1144*25da2beaSAndroid Build Coastguard Worker
1145*25da2beaSAndroid Build Coastguard Worker #ifndef LIBURING_INTERNAL
io_uring_get_sqe(struct io_uring * ring)1146*25da2beaSAndroid Build Coastguard Worker static inline struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring)
1147*25da2beaSAndroid Build Coastguard Worker {
1148*25da2beaSAndroid Build Coastguard Worker return _io_uring_get_sqe(ring);
1149*25da2beaSAndroid Build Coastguard Worker }
1150*25da2beaSAndroid Build Coastguard Worker #else
1151*25da2beaSAndroid Build Coastguard Worker struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring);
1152*25da2beaSAndroid Build Coastguard Worker #endif
1153*25da2beaSAndroid Build Coastguard Worker
1154*25da2beaSAndroid Build Coastguard Worker ssize_t io_uring_mlock_size(unsigned entries, unsigned flags);
1155*25da2beaSAndroid Build Coastguard Worker ssize_t io_uring_mlock_size_params(unsigned entries, struct io_uring_params *p);
1156*25da2beaSAndroid Build Coastguard Worker
1157*25da2beaSAndroid Build Coastguard Worker #ifdef __cplusplus
1158*25da2beaSAndroid Build Coastguard Worker }
1159*25da2beaSAndroid Build Coastguard Worker #endif
1160*25da2beaSAndroid Build Coastguard Worker
1161*25da2beaSAndroid Build Coastguard Worker #endif
1162