1*25da2beaSAndroid Build Coastguard Worker /* SPDX-License-Identifier: MIT */
2*25da2beaSAndroid Build Coastguard Worker #define _POSIX_C_SOURCE 200112L
3*25da2beaSAndroid Build Coastguard Worker
4*25da2beaSAndroid Build Coastguard Worker #include "lib.h"
5*25da2beaSAndroid Build Coastguard Worker #include "syscall.h"
6*25da2beaSAndroid Build Coastguard Worker #include "liburing.h"
7*25da2beaSAndroid Build Coastguard Worker #include "int_flags.h"
8*25da2beaSAndroid Build Coastguard Worker #include "liburing/compat.h"
9*25da2beaSAndroid Build Coastguard Worker #include "liburing/io_uring.h"
10*25da2beaSAndroid Build Coastguard Worker
io_uring_register_buffers_update_tag(struct io_uring * ring,unsigned off,const struct iovec * iovecs,const __u64 * tags,unsigned nr)11*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers_update_tag(struct io_uring *ring, unsigned off,
12*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
13*25da2beaSAndroid Build Coastguard Worker const __u64 *tags,
14*25da2beaSAndroid Build Coastguard Worker unsigned nr)
15*25da2beaSAndroid Build Coastguard Worker {
16*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_update2 up = {
17*25da2beaSAndroid Build Coastguard Worker .offset = off,
18*25da2beaSAndroid Build Coastguard Worker .data = (unsigned long)iovecs,
19*25da2beaSAndroid Build Coastguard Worker .tags = (unsigned long)tags,
20*25da2beaSAndroid Build Coastguard Worker .nr = nr,
21*25da2beaSAndroid Build Coastguard Worker };
22*25da2beaSAndroid Build Coastguard Worker
23*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
24*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_BUFFERS_UPDATE, &up,
25*25da2beaSAndroid Build Coastguard Worker sizeof(up));
26*25da2beaSAndroid Build Coastguard Worker }
27*25da2beaSAndroid Build Coastguard Worker
io_uring_register_buffers_tags(struct io_uring * ring,const struct iovec * iovecs,const __u64 * tags,unsigned nr)28*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers_tags(struct io_uring *ring,
29*25da2beaSAndroid Build Coastguard Worker const struct iovec *iovecs,
30*25da2beaSAndroid Build Coastguard Worker const __u64 *tags,
31*25da2beaSAndroid Build Coastguard Worker unsigned nr)
32*25da2beaSAndroid Build Coastguard Worker {
33*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_register reg = {
34*25da2beaSAndroid Build Coastguard Worker .nr = nr,
35*25da2beaSAndroid Build Coastguard Worker .data = (unsigned long)iovecs,
36*25da2beaSAndroid Build Coastguard Worker .tags = (unsigned long)tags,
37*25da2beaSAndroid Build Coastguard Worker };
38*25da2beaSAndroid Build Coastguard Worker
39*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
40*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_BUFFERS2, ®,
41*25da2beaSAndroid Build Coastguard Worker sizeof(reg));
42*25da2beaSAndroid Build Coastguard Worker }
43*25da2beaSAndroid Build Coastguard Worker
io_uring_register_buffers_sparse(struct io_uring * ring,unsigned nr)44*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers_sparse(struct io_uring *ring, unsigned nr)
45*25da2beaSAndroid Build Coastguard Worker {
46*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_register reg = {
47*25da2beaSAndroid Build Coastguard Worker .flags = IORING_RSRC_REGISTER_SPARSE,
48*25da2beaSAndroid Build Coastguard Worker .nr = nr,
49*25da2beaSAndroid Build Coastguard Worker };
50*25da2beaSAndroid Build Coastguard Worker
51*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
52*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_BUFFERS2, ®,
53*25da2beaSAndroid Build Coastguard Worker sizeof(reg));
54*25da2beaSAndroid Build Coastguard Worker }
55*25da2beaSAndroid Build Coastguard Worker
io_uring_register_buffers(struct io_uring * ring,const struct iovec * iovecs,unsigned nr_iovecs)56*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
57*25da2beaSAndroid Build Coastguard Worker unsigned nr_iovecs)
58*25da2beaSAndroid Build Coastguard Worker {
59*25da2beaSAndroid Build Coastguard Worker int ret;
60*25da2beaSAndroid Build Coastguard Worker
61*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd, IORING_REGISTER_BUFFERS,
62*25da2beaSAndroid Build Coastguard Worker iovecs, nr_iovecs);
63*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
64*25da2beaSAndroid Build Coastguard Worker }
65*25da2beaSAndroid Build Coastguard Worker
io_uring_unregister_buffers(struct io_uring * ring)66*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_buffers(struct io_uring *ring)
67*25da2beaSAndroid Build Coastguard Worker {
68*25da2beaSAndroid Build Coastguard Worker int ret;
69*25da2beaSAndroid Build Coastguard Worker
70*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
71*25da2beaSAndroid Build Coastguard Worker IORING_UNREGISTER_BUFFERS, NULL, 0);
72*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
73*25da2beaSAndroid Build Coastguard Worker }
74*25da2beaSAndroid Build Coastguard Worker
io_uring_register_files_update_tag(struct io_uring * ring,unsigned off,const int * files,const __u64 * tags,unsigned nr_files)75*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_update_tag(struct io_uring *ring, unsigned off,
76*25da2beaSAndroid Build Coastguard Worker const int *files, const __u64 *tags,
77*25da2beaSAndroid Build Coastguard Worker unsigned nr_files)
78*25da2beaSAndroid Build Coastguard Worker {
79*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_update2 up = {
80*25da2beaSAndroid Build Coastguard Worker .offset = off,
81*25da2beaSAndroid Build Coastguard Worker .data = (unsigned long)files,
82*25da2beaSAndroid Build Coastguard Worker .tags = (unsigned long)tags,
83*25da2beaSAndroid Build Coastguard Worker .nr = nr_files,
84*25da2beaSAndroid Build Coastguard Worker };
85*25da2beaSAndroid Build Coastguard Worker
86*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
87*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_FILES_UPDATE2, &up,
88*25da2beaSAndroid Build Coastguard Worker sizeof(up));
89*25da2beaSAndroid Build Coastguard Worker }
90*25da2beaSAndroid Build Coastguard Worker
91*25da2beaSAndroid Build Coastguard Worker /*
92*25da2beaSAndroid Build Coastguard Worker * Register an update for an existing file set. The updates will start at
93*25da2beaSAndroid Build Coastguard Worker * 'off' in the original array, and 'nr_files' is the number of files we'll
94*25da2beaSAndroid Build Coastguard Worker * update.
95*25da2beaSAndroid Build Coastguard Worker *
96*25da2beaSAndroid Build Coastguard Worker * Returns number of files updated on success, -ERROR on failure.
97*25da2beaSAndroid Build Coastguard Worker */
io_uring_register_files_update(struct io_uring * ring,unsigned off,int * files,unsigned nr_files)98*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_update(struct io_uring *ring, unsigned off,
99*25da2beaSAndroid Build Coastguard Worker int *files, unsigned nr_files)
100*25da2beaSAndroid Build Coastguard Worker {
101*25da2beaSAndroid Build Coastguard Worker struct io_uring_files_update up = {
102*25da2beaSAndroid Build Coastguard Worker .offset = off,
103*25da2beaSAndroid Build Coastguard Worker .fds = (unsigned long) files,
104*25da2beaSAndroid Build Coastguard Worker };
105*25da2beaSAndroid Build Coastguard Worker
106*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
107*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_FILES_UPDATE, &up,
108*25da2beaSAndroid Build Coastguard Worker nr_files);
109*25da2beaSAndroid Build Coastguard Worker }
110*25da2beaSAndroid Build Coastguard Worker
increase_rlimit_nofile(unsigned nr)111*25da2beaSAndroid Build Coastguard Worker static int increase_rlimit_nofile(unsigned nr)
112*25da2beaSAndroid Build Coastguard Worker {
113*25da2beaSAndroid Build Coastguard Worker int ret;
114*25da2beaSAndroid Build Coastguard Worker struct rlimit rlim;
115*25da2beaSAndroid Build Coastguard Worker
116*25da2beaSAndroid Build Coastguard Worker ret = __sys_getrlimit(RLIMIT_NOFILE, &rlim);
117*25da2beaSAndroid Build Coastguard Worker if (ret < 0)
118*25da2beaSAndroid Build Coastguard Worker return ret;
119*25da2beaSAndroid Build Coastguard Worker
120*25da2beaSAndroid Build Coastguard Worker if (rlim.rlim_cur < nr) {
121*25da2beaSAndroid Build Coastguard Worker rlim.rlim_cur += nr;
122*25da2beaSAndroid Build Coastguard Worker __sys_setrlimit(RLIMIT_NOFILE, &rlim);
123*25da2beaSAndroid Build Coastguard Worker }
124*25da2beaSAndroid Build Coastguard Worker
125*25da2beaSAndroid Build Coastguard Worker return 0;
126*25da2beaSAndroid Build Coastguard Worker }
127*25da2beaSAndroid Build Coastguard Worker
io_uring_register_files_sparse(struct io_uring * ring,unsigned nr)128*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_sparse(struct io_uring *ring, unsigned nr)
129*25da2beaSAndroid Build Coastguard Worker {
130*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_register reg = {
131*25da2beaSAndroid Build Coastguard Worker .flags = IORING_RSRC_REGISTER_SPARSE,
132*25da2beaSAndroid Build Coastguard Worker .nr = nr,
133*25da2beaSAndroid Build Coastguard Worker };
134*25da2beaSAndroid Build Coastguard Worker int ret, did_increase = 0;
135*25da2beaSAndroid Build Coastguard Worker
136*25da2beaSAndroid Build Coastguard Worker do {
137*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
138*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_FILES2, ®,
139*25da2beaSAndroid Build Coastguard Worker sizeof(reg));
140*25da2beaSAndroid Build Coastguard Worker if (ret >= 0)
141*25da2beaSAndroid Build Coastguard Worker break;
142*25da2beaSAndroid Build Coastguard Worker if (ret == -EMFILE && !did_increase) {
143*25da2beaSAndroid Build Coastguard Worker did_increase = 1;
144*25da2beaSAndroid Build Coastguard Worker increase_rlimit_nofile(nr);
145*25da2beaSAndroid Build Coastguard Worker continue;
146*25da2beaSAndroid Build Coastguard Worker }
147*25da2beaSAndroid Build Coastguard Worker break;
148*25da2beaSAndroid Build Coastguard Worker } while (1);
149*25da2beaSAndroid Build Coastguard Worker
150*25da2beaSAndroid Build Coastguard Worker return ret;
151*25da2beaSAndroid Build Coastguard Worker }
152*25da2beaSAndroid Build Coastguard Worker
io_uring_register_files_tags(struct io_uring * ring,const int * files,const __u64 * tags,unsigned nr)153*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files_tags(struct io_uring *ring, const int *files,
154*25da2beaSAndroid Build Coastguard Worker const __u64 *tags, unsigned nr)
155*25da2beaSAndroid Build Coastguard Worker {
156*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_register reg = {
157*25da2beaSAndroid Build Coastguard Worker .nr = nr,
158*25da2beaSAndroid Build Coastguard Worker .data = (unsigned long)files,
159*25da2beaSAndroid Build Coastguard Worker .tags = (unsigned long)tags,
160*25da2beaSAndroid Build Coastguard Worker };
161*25da2beaSAndroid Build Coastguard Worker int ret, did_increase = 0;
162*25da2beaSAndroid Build Coastguard Worker
163*25da2beaSAndroid Build Coastguard Worker do {
164*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
165*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_FILES2, ®,
166*25da2beaSAndroid Build Coastguard Worker sizeof(reg));
167*25da2beaSAndroid Build Coastguard Worker if (ret >= 0)
168*25da2beaSAndroid Build Coastguard Worker break;
169*25da2beaSAndroid Build Coastguard Worker if (ret == -EMFILE && !did_increase) {
170*25da2beaSAndroid Build Coastguard Worker did_increase = 1;
171*25da2beaSAndroid Build Coastguard Worker increase_rlimit_nofile(nr);
172*25da2beaSAndroid Build Coastguard Worker continue;
173*25da2beaSAndroid Build Coastguard Worker }
174*25da2beaSAndroid Build Coastguard Worker break;
175*25da2beaSAndroid Build Coastguard Worker } while (1);
176*25da2beaSAndroid Build Coastguard Worker
177*25da2beaSAndroid Build Coastguard Worker return ret;
178*25da2beaSAndroid Build Coastguard Worker }
179*25da2beaSAndroid Build Coastguard Worker
io_uring_register_files(struct io_uring * ring,const int * files,unsigned nr_files)180*25da2beaSAndroid Build Coastguard Worker int io_uring_register_files(struct io_uring *ring, const int *files,
181*25da2beaSAndroid Build Coastguard Worker unsigned nr_files)
182*25da2beaSAndroid Build Coastguard Worker {
183*25da2beaSAndroid Build Coastguard Worker int ret, did_increase = 0;
184*25da2beaSAndroid Build Coastguard Worker
185*25da2beaSAndroid Build Coastguard Worker do {
186*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
187*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_FILES, files,
188*25da2beaSAndroid Build Coastguard Worker nr_files);
189*25da2beaSAndroid Build Coastguard Worker if (ret >= 0)
190*25da2beaSAndroid Build Coastguard Worker break;
191*25da2beaSAndroid Build Coastguard Worker if (ret == -EMFILE && !did_increase) {
192*25da2beaSAndroid Build Coastguard Worker did_increase = 1;
193*25da2beaSAndroid Build Coastguard Worker increase_rlimit_nofile(nr_files);
194*25da2beaSAndroid Build Coastguard Worker continue;
195*25da2beaSAndroid Build Coastguard Worker }
196*25da2beaSAndroid Build Coastguard Worker break;
197*25da2beaSAndroid Build Coastguard Worker } while (1);
198*25da2beaSAndroid Build Coastguard Worker
199*25da2beaSAndroid Build Coastguard Worker return ret;
200*25da2beaSAndroid Build Coastguard Worker }
201*25da2beaSAndroid Build Coastguard Worker
io_uring_unregister_files(struct io_uring * ring)202*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_files(struct io_uring *ring)
203*25da2beaSAndroid Build Coastguard Worker {
204*25da2beaSAndroid Build Coastguard Worker int ret;
205*25da2beaSAndroid Build Coastguard Worker
206*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_FILES,
207*25da2beaSAndroid Build Coastguard Worker NULL, 0);
208*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
209*25da2beaSAndroid Build Coastguard Worker }
210*25da2beaSAndroid Build Coastguard Worker
io_uring_register_eventfd(struct io_uring * ring,int event_fd)211*25da2beaSAndroid Build Coastguard Worker int io_uring_register_eventfd(struct io_uring *ring, int event_fd)
212*25da2beaSAndroid Build Coastguard Worker {
213*25da2beaSAndroid Build Coastguard Worker int ret;
214*25da2beaSAndroid Build Coastguard Worker
215*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd, IORING_REGISTER_EVENTFD,
216*25da2beaSAndroid Build Coastguard Worker &event_fd, 1);
217*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
218*25da2beaSAndroid Build Coastguard Worker }
219*25da2beaSAndroid Build Coastguard Worker
io_uring_unregister_eventfd(struct io_uring * ring)220*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_eventfd(struct io_uring *ring)
221*25da2beaSAndroid Build Coastguard Worker {
222*25da2beaSAndroid Build Coastguard Worker int ret;
223*25da2beaSAndroid Build Coastguard Worker
224*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
225*25da2beaSAndroid Build Coastguard Worker IORING_UNREGISTER_EVENTFD, NULL, 0);
226*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
227*25da2beaSAndroid Build Coastguard Worker }
228*25da2beaSAndroid Build Coastguard Worker
io_uring_register_eventfd_async(struct io_uring * ring,int event_fd)229*25da2beaSAndroid Build Coastguard Worker int io_uring_register_eventfd_async(struct io_uring *ring, int event_fd)
230*25da2beaSAndroid Build Coastguard Worker {
231*25da2beaSAndroid Build Coastguard Worker int ret;
232*25da2beaSAndroid Build Coastguard Worker
233*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
234*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_EVENTFD_ASYNC,
235*25da2beaSAndroid Build Coastguard Worker &event_fd, 1);
236*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
237*25da2beaSAndroid Build Coastguard Worker }
238*25da2beaSAndroid Build Coastguard Worker
io_uring_register_probe(struct io_uring * ring,struct io_uring_probe * p,unsigned int nr_ops)239*25da2beaSAndroid Build Coastguard Worker int io_uring_register_probe(struct io_uring *ring, struct io_uring_probe *p,
240*25da2beaSAndroid Build Coastguard Worker unsigned int nr_ops)
241*25da2beaSAndroid Build Coastguard Worker {
242*25da2beaSAndroid Build Coastguard Worker int ret;
243*25da2beaSAndroid Build Coastguard Worker
244*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd, IORING_REGISTER_PROBE, p,
245*25da2beaSAndroid Build Coastguard Worker nr_ops);
246*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
247*25da2beaSAndroid Build Coastguard Worker }
248*25da2beaSAndroid Build Coastguard Worker
io_uring_register_personality(struct io_uring * ring)249*25da2beaSAndroid Build Coastguard Worker int io_uring_register_personality(struct io_uring *ring)
250*25da2beaSAndroid Build Coastguard Worker {
251*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
252*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_PERSONALITY, NULL, 0);
253*25da2beaSAndroid Build Coastguard Worker }
254*25da2beaSAndroid Build Coastguard Worker
io_uring_unregister_personality(struct io_uring * ring,int id)255*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_personality(struct io_uring *ring, int id)
256*25da2beaSAndroid Build Coastguard Worker {
257*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
258*25da2beaSAndroid Build Coastguard Worker IORING_UNREGISTER_PERSONALITY, NULL,
259*25da2beaSAndroid Build Coastguard Worker id);
260*25da2beaSAndroid Build Coastguard Worker }
261*25da2beaSAndroid Build Coastguard Worker
io_uring_register_restrictions(struct io_uring * ring,struct io_uring_restriction * res,unsigned int nr_res)262*25da2beaSAndroid Build Coastguard Worker int io_uring_register_restrictions(struct io_uring *ring,
263*25da2beaSAndroid Build Coastguard Worker struct io_uring_restriction *res,
264*25da2beaSAndroid Build Coastguard Worker unsigned int nr_res)
265*25da2beaSAndroid Build Coastguard Worker {
266*25da2beaSAndroid Build Coastguard Worker int ret;
267*25da2beaSAndroid Build Coastguard Worker
268*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
269*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_RESTRICTIONS, res,
270*25da2beaSAndroid Build Coastguard Worker nr_res);
271*25da2beaSAndroid Build Coastguard Worker return (ret < 0) ? ret : 0;
272*25da2beaSAndroid Build Coastguard Worker }
273*25da2beaSAndroid Build Coastguard Worker
io_uring_enable_rings(struct io_uring * ring)274*25da2beaSAndroid Build Coastguard Worker int io_uring_enable_rings(struct io_uring *ring)
275*25da2beaSAndroid Build Coastguard Worker {
276*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
277*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_ENABLE_RINGS, NULL, 0);
278*25da2beaSAndroid Build Coastguard Worker }
279*25da2beaSAndroid Build Coastguard Worker
io_uring_register_iowq_aff(struct io_uring * ring,size_t cpusz,const cpu_set_t * mask)280*25da2beaSAndroid Build Coastguard Worker int io_uring_register_iowq_aff(struct io_uring *ring, size_t cpusz,
281*25da2beaSAndroid Build Coastguard Worker const cpu_set_t *mask)
282*25da2beaSAndroid Build Coastguard Worker {
283*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
284*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_IOWQ_AFF, mask, cpusz);
285*25da2beaSAndroid Build Coastguard Worker }
286*25da2beaSAndroid Build Coastguard Worker
io_uring_unregister_iowq_aff(struct io_uring * ring)287*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_iowq_aff(struct io_uring *ring)
288*25da2beaSAndroid Build Coastguard Worker {
289*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
290*25da2beaSAndroid Build Coastguard Worker IORING_UNREGISTER_IOWQ_AFF, NULL, 0);
291*25da2beaSAndroid Build Coastguard Worker }
292*25da2beaSAndroid Build Coastguard Worker
io_uring_register_iowq_max_workers(struct io_uring * ring,unsigned int * val)293*25da2beaSAndroid Build Coastguard Worker int io_uring_register_iowq_max_workers(struct io_uring *ring, unsigned int *val)
294*25da2beaSAndroid Build Coastguard Worker {
295*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
296*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_IOWQ_MAX_WORKERS, val,
297*25da2beaSAndroid Build Coastguard Worker 2);
298*25da2beaSAndroid Build Coastguard Worker }
299*25da2beaSAndroid Build Coastguard Worker
io_uring_register_ring_fd(struct io_uring * ring)300*25da2beaSAndroid Build Coastguard Worker int io_uring_register_ring_fd(struct io_uring *ring)
301*25da2beaSAndroid Build Coastguard Worker {
302*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_update up = {
303*25da2beaSAndroid Build Coastguard Worker .data = ring->ring_fd,
304*25da2beaSAndroid Build Coastguard Worker .offset = -1U,
305*25da2beaSAndroid Build Coastguard Worker };
306*25da2beaSAndroid Build Coastguard Worker int ret;
307*25da2beaSAndroid Build Coastguard Worker
308*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd, IORING_REGISTER_RING_FDS,
309*25da2beaSAndroid Build Coastguard Worker &up, 1);
310*25da2beaSAndroid Build Coastguard Worker if (ret == 1) {
311*25da2beaSAndroid Build Coastguard Worker ring->enter_ring_fd = up.offset;
312*25da2beaSAndroid Build Coastguard Worker ring->int_flags |= INT_FLAG_REG_RING;
313*25da2beaSAndroid Build Coastguard Worker }
314*25da2beaSAndroid Build Coastguard Worker return ret;
315*25da2beaSAndroid Build Coastguard Worker }
316*25da2beaSAndroid Build Coastguard Worker
317*25da2beaSAndroid Build Coastguard Worker
io_uring_unregister_ring_fd(struct io_uring * ring)318*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_ring_fd(struct io_uring *ring)
319*25da2beaSAndroid Build Coastguard Worker {
320*25da2beaSAndroid Build Coastguard Worker struct io_uring_rsrc_update up = {
321*25da2beaSAndroid Build Coastguard Worker .offset = ring->enter_ring_fd,
322*25da2beaSAndroid Build Coastguard Worker };
323*25da2beaSAndroid Build Coastguard Worker int ret;
324*25da2beaSAndroid Build Coastguard Worker
325*25da2beaSAndroid Build Coastguard Worker ret = ____sys_io_uring_register(ring->ring_fd,
326*25da2beaSAndroid Build Coastguard Worker IORING_UNREGISTER_RING_FDS, &up, 1);
327*25da2beaSAndroid Build Coastguard Worker if (ret == 1) {
328*25da2beaSAndroid Build Coastguard Worker ring->enter_ring_fd = ring->ring_fd;
329*25da2beaSAndroid Build Coastguard Worker ring->int_flags &= ~INT_FLAG_REG_RING;
330*25da2beaSAndroid Build Coastguard Worker }
331*25da2beaSAndroid Build Coastguard Worker return ret;
332*25da2beaSAndroid Build Coastguard Worker }
333*25da2beaSAndroid Build Coastguard Worker
io_uring_register_buf_ring(struct io_uring * ring,struct io_uring_buf_reg * reg,unsigned int flags)334*25da2beaSAndroid Build Coastguard Worker int io_uring_register_buf_ring(struct io_uring *ring,
335*25da2beaSAndroid Build Coastguard Worker struct io_uring_buf_reg *reg, unsigned int flags)
336*25da2beaSAndroid Build Coastguard Worker {
337*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
338*25da2beaSAndroid Build Coastguard Worker IORING_REGISTER_PBUF_RING, reg, 1);
339*25da2beaSAndroid Build Coastguard Worker }
340*25da2beaSAndroid Build Coastguard Worker
io_uring_unregister_buf_ring(struct io_uring * ring,int bgid)341*25da2beaSAndroid Build Coastguard Worker int io_uring_unregister_buf_ring(struct io_uring *ring, int bgid)
342*25da2beaSAndroid Build Coastguard Worker {
343*25da2beaSAndroid Build Coastguard Worker struct io_uring_buf_reg reg = { .bgid = bgid };
344*25da2beaSAndroid Build Coastguard Worker
345*25da2beaSAndroid Build Coastguard Worker return ____sys_io_uring_register(ring->ring_fd,
346*25da2beaSAndroid Build Coastguard Worker IORING_UNREGISTER_PBUF_RING, ®, 1);
347*25da2beaSAndroid Build Coastguard Worker }
348