History

Merge tag 'for-5.19/io_uring-2022-05-22' of git://git.kernel.dk/linux-block

Pull io_uring updates from Jens Axboe: "Here are the main io_uring changes for 5.19. This contains: - Fixes for sparse type warnings (Christoph, Vasily) - Support for multi-shot accept (Hao) - Support for io_uring managed fixed files, rather than always needing the applicationt o manage the indices (me) - Fix for a spurious poll wakeup (Dylan) - CQE overflow fixes (Dylan) - Support more types of cancelations (me) - Support for co-operative task_work signaling, rather than always forcing an IPI (me) - Support for doing poll first when appropriate, rather than always attempting a transfer first (me) - Provided buffer cleanups and support for mapped buffers (me) - Improve how io_uring handles inflight SCM files (Pavel) - Speedups for registered files (Pavel, me) - Organize the completion data in a struct in io_kiocb rather than keep it in separate spots (Pavel) - task_work improvements (Pavel) - Cleanup and optimize the submission path, in general and for handling links (Pavel) - Speedups for registered resource handling (Pavel) - Support sparse buffers and file maps (Pavel, me) - Various fixes and cleanups (Almog, Pavel, me)" * tag 'for-5.19/io_uring-2022-05-22' of git://git.kernel.dk/linux-block: (111 commits) io_uring: fix incorrect __kernel_rwf_t cast io_uring: disallow mixed provided buffer group registrations io_uring: initialize io_buffer_list head when shared ring is unregistered io_uring: add fully sparse buffer registration io_uring: use rcu_dereference in io_close io_uring: consistently use the EPOLL* defines io_uring: make apoll_events a __poll_t io_uring: drop a spurious inline on a forward declaration io_uring: don't use ERR_PTR for user pointers io_uring: use a rwf_t for io_rw.flags io_uring: add support for ring mapped supplied buffers io_uring: add io_pin_pages() helper io_uring: add buffer selection support to IORING_OP_NOP io_uring: fix locking state for empty buffer group io_uring: implement multishot mode for accept io_uring: let fast poll support multishot io_uring: add REQ_F_APOLL_MULTISHOT for requests io_uring: add IORING_ACCEPT_MULTISHOT for accept io_uring: only wake when the correct events are set io_uring: avoid io-wq -EAGAIN looping for !IOPOLL ...

Linus Torvalds committed 4 years ago

Commit 3a166bd2 parents 1e57930 0e7579c8 files · +1813 −1031Browse files

Showing the changes to include/uapi (1 of 8 files). Show all

Unified · Split

include/uapi/linux/io_uring.h+94−1
@@ -63,6 +63,15 @@ struct io_uring_sqe { · 62 unmodified lines
6363 __u64 __pad2[2];
6464 };
6565
66+/*
67+ * If sqe->file_index is set to this for opcodes that instantiate a new
68+ * direct descriptor (like openat/openat2/accept), then io_uring will allocate
69+ * an available direct descriptor instead of having the application pass one
70+ * in. The picked direct descriptor will be returned in cqe->res, or -ENFILE
71+ * if the space is full.
72+ */
73+#define IORING_FILE_INDEX_ALLOC (~0U)
74+
6675 enum {
6776 IOSQE_FIXED_FILE_BIT,
6877 IOSQE_IO_DRAIN_BIT,
@@ -102,6 +111,20 @@ enum { · 33 unmodified lines
102111 #define IORING_SETUP_ATTACH_WQ (1U << 5) /* attach to existing wq */
103112 #define IORING_SETUP_R_DISABLED (1U << 6) /* start with ring disabled */
104113 #define IORING_SETUP_SUBMIT_ALL (1U << 7) /* continue submit on error */
114+/*
115+ * Cooperative task running. When requests complete, they often require
116+ * forcing the submitter to transition to the kernel to complete. If this
117+ * flag is set, work will be done when the task transitions anyway, rather
118+ * than force an inter-processor interrupt reschedule. This avoids interrupting
119+ * a task running in userspace, and saves an IPI.
120+ */
121+#define IORING_SETUP_COOP_TASKRUN (1U << 8)
122+/*
123+ * If COOP_TASKRUN is set, get notified if task work is available for
124+ * running and a kernel transition would be needed to run it. This sets
125+ * IORING_SQ_TASKRUN in the sq ring flags. Not valid with COOP_TASKRUN.
126+ */
127+#define IORING_SETUP_TASKRUN_FLAG (1U << 9)
105128
106129 enum {
107130 IORING_OP_NOP,
@@ -187,6 +210,33 @@ enum { · 79 unmodified lines
187210 #define IORING_POLL_UPDATE_EVENTS (1U << 1)
188211 #define IORING_POLL_UPDATE_USER_DATA (1U << 2)
189212
213+/*
214+ * ASYNC_CANCEL flags.
215+ *
216+ * IORING_ASYNC_CANCEL_ALL Cancel all requests that match the given key
217+ * IORING_ASYNC_CANCEL_FD Key off 'fd' for cancelation rather than the
218+ * request 'user_data'
219+ * IORING_ASYNC_CANCEL_ANY Match any request
220+ */
221+#define IORING_ASYNC_CANCEL_ALL (1U << 0)
222+#define IORING_ASYNC_CANCEL_FD (1U << 1)
223+#define IORING_ASYNC_CANCEL_ANY (1U << 2)
224+
225+/*
226+ * send/sendmsg and recv/recvmsg flags (sqe->addr2)
227+ *
228+ * IORING_RECVSEND_POLL_FIRST If set, instead of first attempting to send
229+ * or receive and arm poll if that yields an
230+ * -EAGAIN result, arm poll upfront and skip
231+ * the initial transfer attempt.
232+ */
233+#define IORING_RECVSEND_POLL_FIRST (1U << 0)
234+
235+/*
236+ * accept flags stored in sqe->ioprio
237+ */
238+#define IORING_ACCEPT_MULTISHOT (1U << 0)
239+
190240 /*
191241 * IO completion data structure (Completion Queue Entry)
192242 */
@@ -236,6 +286,7 @@ struct io_sqring_offsets { · 43 unmodified lines
236286 */
237287 #define IORING_SQ_NEED_WAKEUP (1U << 0) /* needs io_uring_enter wakeup */
238288 #define IORING_SQ_CQ_OVERFLOW (1U << 1) /* CQ ring is overflown */
289+#define IORING_SQ_TASKRUN (1U << 2) /* task should enter the kernel */
239290
240291 struct io_cqring_offsets {
241292 __u32 head;
@@ -333,6 +384,10 @@ enum { · 91 unmodified lines
333384 IORING_REGISTER_RING_FDS = 20,
334385 IORING_UNREGISTER_RING_FDS = 21,
335386
387+ /* register ring based provide buffer group */
388+ IORING_REGISTER_PBUF_RING = 22,
389+ IORING_UNREGISTER_PBUF_RING = 23,
390+
336391 /* this goes last */
337392 IORING_REGISTER_LAST
338393 };
@@ -350,9 +405,15 @@ struct io_uring_files_update { · 11 unmodified lines
350405 __aligned_u64 /* __s32 * */ fds;
351406 };
352407
408+/*
409+ * Register a fully sparse file space, rather than pass in an array of all
410+ * -1 file descriptors.
411+ */
412+#define IORING_RSRC_REGISTER_SPARSE (1U << 0)
413+
353414 struct io_uring_rsrc_register {
354415 __u32 nr;
355− __u32 resv;
416+ __u32 flags;
356417 __u64 resv2;
357418 __aligned_u64 data;
358419 __aligned_u64 tags;
@@ -404,6 +465,38 @@ struct io_uring_restriction { · 45 unmodified lines
404465 __u32 resv2[3];
405466 };
406467
468+struct io_uring_buf {
469+ __u64 addr;
470+ __u32 len;
471+ __u16 bid;
472+ __u16 resv;
473+};
474+
475+struct io_uring_buf_ring {
476+ union {
477+ /*
478+ * To avoid spilling into more pages than we need to, the
479+ * ring tail is overlaid with the io_uring_buf->resv field.
480+ */
481+ struct {
482+ __u64 resv1;
483+ __u32 resv2;
484+ __u16 resv3;
485+ __u16 tail;
486+ };
487+ struct io_uring_buf bufs[0];
488+ };
489+};
490+
491+/* argument for IORING_(UN)REGISTER_PBUF_RING */
492+struct io_uring_buf_reg {
493+ __u64 ring_addr;
494+ __u32 ring_entries;
495+ __u16 bgid;
496+ __u16 pad;
497+ __u64 resv[3];
498+};
499+
407500 /*
408501 * io_uring_restriction->opcode values
409502 */