Merge tag 'drivers-5.10-2020-10-12' of git://git.kernel.dk/linux-block
[linux-2.6-block.git] / include / uapi / linux / io_uring.h
CommitLineData
9f5834c8 1/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT */
2b188cc1
JA
2/*
3 * Header file for the io_uring interface.
4 *
5 * Copyright (C) 2019 Jens Axboe
6 * Copyright (C) 2019 Christoph Hellwig
7 */
8#ifndef LINUX_IO_URING_H
9#define LINUX_IO_URING_H
10
11#include <linux/fs.h>
12#include <linux/types.h>
13
14/*
15 * IO submission data structure (Submission Queue Entry)
16 */
17struct io_uring_sqe {
18 __u8 opcode; /* type of operation for this sqe */
6b06314c 19 __u8 flags; /* IOSQE_ flags */
2b188cc1
JA
20 __u16 ioprio; /* ioprio for the request */
21 __s32 fd; /* file descriptor to do IO on */
17f2fe35
JA
22 union {
23 __u64 off; /* offset into file */
24 __u64 addr2;
25 };
7d67af2c
PB
26 union {
27 __u64 addr; /* pointer to buffer or iovecs */
28 __u64 splice_off_in;
29 };
2b188cc1
JA
30 __u32 len; /* buffer size or number of iovecs */
31 union {
32 __kernel_rwf_t rw_flags;
c992fe29 33 __u32 fsync_flags;
5769a351
JX
34 __u16 poll_events; /* compatibility */
35 __u32 poll32_events; /* word-reversed for BE */
5d17b4a4 36 __u32 sync_range_flags;
0fa03c62 37 __u32 msg_flags;
5262f567 38 __u32 timeout_flags;
17f2fe35 39 __u32 accept_flags;
62755e35 40 __u32 cancel_flags;
15b71abe 41 __u32 open_flags;
eddc7ef5 42 __u32 statx_flags;
4840e418 43 __u32 fadvise_advice;
7d67af2c 44 __u32 splice_flags;
2b188cc1
JA
45 };
46 __u64 user_data; /* data to be passed back at completion time */
edafccee 47 union {
75c6a039 48 struct {
ddf0322d
JA
49 /* pack this to avoid bogus arm OABI complaints */
50 union {
51 /* index into fixed buffers, if used */
52 __u16 buf_index;
53 /* for grouped buffer selection */
54 __u16 buf_group;
55 } __attribute__((packed));
75c6a039
JA
56 /* personality to use, if used */
57 __u16 personality;
7d67af2c 58 __s32 splice_fd_in;
75c6a039 59 };
edafccee
JA
60 __u64 __pad2[3];
61 };
2b188cc1
JA
62};
63
6b47ee6e
PB
64enum {
65 IOSQE_FIXED_FILE_BIT,
66 IOSQE_IO_DRAIN_BIT,
67 IOSQE_IO_LINK_BIT,
68 IOSQE_IO_HARDLINK_BIT,
69 IOSQE_ASYNC_BIT,
bcda7baa 70 IOSQE_BUFFER_SELECT_BIT,
6b47ee6e
PB
71};
72
6b06314c
JA
73/*
74 * sqe->flags
75 */
6b47ee6e
PB
76/* use fixed fileset */
77#define IOSQE_FIXED_FILE (1U << IOSQE_FIXED_FILE_BIT)
78/* issue after inflight IO */
79#define IOSQE_IO_DRAIN (1U << IOSQE_IO_DRAIN_BIT)
80/* links next sqe */
81#define IOSQE_IO_LINK (1U << IOSQE_IO_LINK_BIT)
82/* like LINK, but stronger */
83#define IOSQE_IO_HARDLINK (1U << IOSQE_IO_HARDLINK_BIT)
84/* always go async */
85#define IOSQE_ASYNC (1U << IOSQE_ASYNC_BIT)
bcda7baa
JA
86/* select buffer from sqe->buf_group */
87#define IOSQE_BUFFER_SELECT (1U << IOSQE_BUFFER_SELECT_BIT)
6b06314c 88
def596e9
JA
89/*
90 * io_uring_setup() flags
91 */
92#define IORING_SETUP_IOPOLL (1U << 0) /* io_context is polled */
6c271ce2
JA
93#define IORING_SETUP_SQPOLL (1U << 1) /* SQ poll thread */
94#define IORING_SETUP_SQ_AFF (1U << 2) /* sq_thread_cpu is valid */
33a107f0 95#define IORING_SETUP_CQSIZE (1U << 3) /* app defines CQ size */
8110c1a6 96#define IORING_SETUP_CLAMP (1U << 4) /* clamp SQ/CQ ring sizes */
24369c2e 97#define IORING_SETUP_ATTACH_WQ (1U << 5) /* attach to existing wq */
7e84e1c7 98#define IORING_SETUP_R_DISABLED (1U << 6) /* start with ring disabled */
def596e9 99
9e3aa61a
JA
100enum {
101 IORING_OP_NOP,
102 IORING_OP_READV,
103 IORING_OP_WRITEV,
104 IORING_OP_FSYNC,
105 IORING_OP_READ_FIXED,
106 IORING_OP_WRITE_FIXED,
107 IORING_OP_POLL_ADD,
108 IORING_OP_POLL_REMOVE,
109 IORING_OP_SYNC_FILE_RANGE,
110 IORING_OP_SENDMSG,
111 IORING_OP_RECVMSG,
112 IORING_OP_TIMEOUT,
113 IORING_OP_TIMEOUT_REMOVE,
114 IORING_OP_ACCEPT,
115 IORING_OP_ASYNC_CANCEL,
116 IORING_OP_LINK_TIMEOUT,
117 IORING_OP_CONNECT,
d63d1b5e 118 IORING_OP_FALLOCATE,
15b71abe 119 IORING_OP_OPENAT,
b5dba59e 120 IORING_OP_CLOSE,
05f3fb3c 121 IORING_OP_FILES_UPDATE,
eddc7ef5 122 IORING_OP_STATX,
3a6820f2
JA
123 IORING_OP_READ,
124 IORING_OP_WRITE,
4840e418 125 IORING_OP_FADVISE,
c1ca757b 126 IORING_OP_MADVISE,
fddaface
JA
127 IORING_OP_SEND,
128 IORING_OP_RECV,
cebdb986 129 IORING_OP_OPENAT2,
3e4827b0 130 IORING_OP_EPOLL_CTL,
7d67af2c 131 IORING_OP_SPLICE,
ddf0322d 132 IORING_OP_PROVIDE_BUFFERS,
067524e9 133 IORING_OP_REMOVE_BUFFERS,
f2a8d5c7 134 IORING_OP_TEE,
9e3aa61a
JA
135
136 /* this goes last, obviously */
137 IORING_OP_LAST,
138};
c992fe29
CH
139
140/*
141 * sqe->fsync_flags
142 */
143#define IORING_FSYNC_DATASYNC (1U << 0)
2b188cc1 144
a41525ab
JA
145/*
146 * sqe->timeout_flags
147 */
148#define IORING_TIMEOUT_ABS (1U << 0)
149
7d67af2c
PB
150/*
151 * sqe->splice_flags
152 * extends splice(2) flags
153 */
154#define SPLICE_F_FD_IN_FIXED (1U << 31) /* the last bit of __u32 */
155
2b188cc1
JA
156/*
157 * IO completion data structure (Completion Queue Entry)
158 */
159struct io_uring_cqe {
160 __u64 user_data; /* sqe->data submission passed back */
161 __s32 res; /* result code for this event */
162 __u32 flags;
163};
164
bcda7baa
JA
165/*
166 * cqe->flags
167 *
168 * IORING_CQE_F_BUFFER If set, the upper 16 bits are the buffer ID
169 */
170#define IORING_CQE_F_BUFFER (1U << 0)
171
172enum {
173 IORING_CQE_BUFFER_SHIFT = 16,
174};
175
2b188cc1
JA
176/*
177 * Magic offsets for the application to mmap the data it needs
178 */
179#define IORING_OFF_SQ_RING 0ULL
180#define IORING_OFF_CQ_RING 0x8000000ULL
181#define IORING_OFF_SQES 0x10000000ULL
182
183/*
184 * Filled with the offset for mmap(2)
185 */
186struct io_sqring_offsets {
187 __u32 head;
188 __u32 tail;
189 __u32 ring_mask;
190 __u32 ring_entries;
191 __u32 flags;
192 __u32 dropped;
193 __u32 array;
194 __u32 resv1;
195 __u64 resv2;
196};
197
6c271ce2
JA
198/*
199 * sq_ring->flags
200 */
201#define IORING_SQ_NEED_WAKEUP (1U << 0) /* needs io_uring_enter wakeup */
6d5f9049 202#define IORING_SQ_CQ_OVERFLOW (1U << 1) /* CQ ring is overflown */
6c271ce2 203
2b188cc1
JA
204struct io_cqring_offsets {
205 __u32 head;
206 __u32 tail;
207 __u32 ring_mask;
208 __u32 ring_entries;
209 __u32 overflow;
210 __u32 cqes;
0d9b5b3a
SG
211 __u32 flags;
212 __u32 resv1;
213 __u64 resv2;
2b188cc1
JA
214};
215
7e55a19c
SG
216/*
217 * cq_ring->flags
218 */
219
220/* disable eventfd notifications */
221#define IORING_CQ_EVENTFD_DISABLED (1U << 0)
222
2b188cc1
JA
223/*
224 * io_uring_enter(2) flags
225 */
226#define IORING_ENTER_GETEVENTS (1U << 0)
6c271ce2 227#define IORING_ENTER_SQ_WAKEUP (1U << 1)
90554200 228#define IORING_ENTER_SQ_WAIT (1U << 2)
2b188cc1
JA
229
230/*
231 * Passed in for io_uring_setup(2). Copied back with updated info on success
232 */
233struct io_uring_params {
234 __u32 sq_entries;
235 __u32 cq_entries;
236 __u32 flags;
6c271ce2
JA
237 __u32 sq_thread_cpu;
238 __u32 sq_thread_idle;
ac90f249 239 __u32 features;
24369c2e
PB
240 __u32 wq_fd;
241 __u32 resv[3];
2b188cc1
JA
242 struct io_sqring_offsets sq_off;
243 struct io_cqring_offsets cq_off;
244};
245
ac90f249
JA
246/*
247 * io_uring_params->features flags
248 */
249#define IORING_FEAT_SINGLE_MMAP (1U << 0)
1d7bb1d5 250#define IORING_FEAT_NODROP (1U << 1)
da8c9690 251#define IORING_FEAT_SUBMIT_STABLE (1U << 2)
ba04291e 252#define IORING_FEAT_RW_CUR_POS (1U << 3)
cccf0ee8 253#define IORING_FEAT_CUR_PERSONALITY (1U << 4)
d7718a9d 254#define IORING_FEAT_FAST_POLL (1U << 5)
5769a351 255#define IORING_FEAT_POLL_32BITS (1U << 6)
ac90f249 256
edafccee
JA
257/*
258 * io_uring_register(2) opcodes and arguments
259 */
9d4a75ef
SG
260enum {
261 IORING_REGISTER_BUFFERS = 0,
262 IORING_UNREGISTER_BUFFERS = 1,
263 IORING_REGISTER_FILES = 2,
264 IORING_UNREGISTER_FILES = 3,
265 IORING_REGISTER_EVENTFD = 4,
266 IORING_UNREGISTER_EVENTFD = 5,
267 IORING_REGISTER_FILES_UPDATE = 6,
268 IORING_REGISTER_EVENTFD_ASYNC = 7,
269 IORING_REGISTER_PROBE = 8,
270 IORING_REGISTER_PERSONALITY = 9,
271 IORING_UNREGISTER_PERSONALITY = 10,
21b55dbc 272 IORING_REGISTER_RESTRICTIONS = 11,
7e84e1c7 273 IORING_REGISTER_ENABLE_RINGS = 12,
9d4a75ef
SG
274
275 /* this goes last */
276 IORING_REGISTER_LAST
277};
c3a31e60
JA
278
279struct io_uring_files_update {
280 __u32 offset;
1292e972
ES
281 __u32 resv;
282 __aligned_u64 /* __s32 * */ fds;
c3a31e60 283};
edafccee 284
66f4af93
JA
285#define IO_URING_OP_SUPPORTED (1U << 0)
286
287struct io_uring_probe_op {
288 __u8 op;
289 __u8 resv;
290 __u16 flags; /* IO_URING_OP_* flags */
291 __u32 resv2;
292};
293
294struct io_uring_probe {
295 __u8 last_op; /* last opcode supported */
296 __u8 ops_len; /* length of ops[] array below */
297 __u16 resv;
298 __u32 resv2[3];
299 struct io_uring_probe_op ops[0];
300};
301
21b55dbc
SG
302struct io_uring_restriction {
303 __u16 opcode;
304 union {
305 __u8 register_op; /* IORING_RESTRICTION_REGISTER_OP */
306 __u8 sqe_op; /* IORING_RESTRICTION_SQE_OP */
307 __u8 sqe_flags; /* IORING_RESTRICTION_SQE_FLAGS_* */
308 };
309 __u8 resv;
310 __u32 resv2[3];
311};
312
313/*
314 * io_uring_restriction->opcode values
315 */
316enum {
317 /* Allow an io_uring_register(2) opcode */
318 IORING_RESTRICTION_REGISTER_OP = 0,
319
320 /* Allow an sqe opcode */
321 IORING_RESTRICTION_SQE_OP = 1,
322
323 /* Allow sqe flags */
324 IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2,
325
326 /* Require sqe flags (these flags must be set on each submission) */
327 IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3,
328
329 IORING_RESTRICTION_LAST
330};
331
2b188cc1 332#endif