linux/include/uapi/linux/io_uring.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT */
   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 */
  19        __u8    flags;          /* IOSQE_ flags */
  20        __u16   ioprio;         /* ioprio for the request */
  21        __s32   fd;             /* file descriptor to do IO on */
  22        union {
  23                __u64   off;    /* offset into file */
  24                __u64   addr2;
  25        };
  26        union {
  27                __u64   addr;   /* pointer to buffer or iovecs */
  28                __u64   splice_off_in;
  29        };
  30        __u32   len;            /* buffer size or number of iovecs */
  31        union {
  32                __kernel_rwf_t  rw_flags;
  33                __u32           fsync_flags;
  34                __u16           poll_events;    /* compatibility */
  35                __u32           poll32_events;  /* word-reversed for BE */
  36                __u32           sync_range_flags;
  37                __u32           msg_flags;
  38                __u32           timeout_flags;
  39                __u32           accept_flags;
  40                __u32           cancel_flags;
  41                __u32           open_flags;
  42                __u32           statx_flags;
  43                __u32           fadvise_advice;
  44                __u32           splice_flags;
  45                __u32           rename_flags;
  46                __u32           unlink_flags;
  47        };
  48        __u64   user_data;      /* data to be passed back at completion time */
  49        union {
  50                struct {
  51                        /* pack this to avoid bogus arm OABI complaints */
  52                        union {
  53                                /* index into fixed buffers, if used */
  54                                __u16   buf_index;
  55                                /* for grouped buffer selection */
  56                                __u16   buf_group;
  57                        } __attribute__((packed));
  58                        /* personality to use, if used */
  59                        __u16   personality;
  60                        __s32   splice_fd_in;
  61                };
  62                __u64   __pad2[3];
  63        };
  64};
  65
  66enum {
  67        IOSQE_FIXED_FILE_BIT,
  68        IOSQE_IO_DRAIN_BIT,
  69        IOSQE_IO_LINK_BIT,
  70        IOSQE_IO_HARDLINK_BIT,
  71        IOSQE_ASYNC_BIT,
  72        IOSQE_BUFFER_SELECT_BIT,
  73};
  74
  75/*
  76 * sqe->flags
  77 */
  78/* use fixed fileset */
  79#define IOSQE_FIXED_FILE        (1U << IOSQE_FIXED_FILE_BIT)
  80/* issue after inflight IO */
  81#define IOSQE_IO_DRAIN          (1U << IOSQE_IO_DRAIN_BIT)
  82/* links next sqe */
  83#define IOSQE_IO_LINK           (1U << IOSQE_IO_LINK_BIT)
  84/* like LINK, but stronger */
  85#define IOSQE_IO_HARDLINK       (1U << IOSQE_IO_HARDLINK_BIT)
  86/* always go async */
  87#define IOSQE_ASYNC             (1U << IOSQE_ASYNC_BIT)
  88/* select buffer from sqe->buf_group */
  89#define IOSQE_BUFFER_SELECT     (1U << IOSQE_BUFFER_SELECT_BIT)
  90
  91/*
  92 * io_uring_setup() flags
  93 */
  94#define IORING_SETUP_IOPOLL     (1U << 0)       /* io_context is polled */
  95#define IORING_SETUP_SQPOLL     (1U << 1)       /* SQ poll thread */
  96#define IORING_SETUP_SQ_AFF     (1U << 2)       /* sq_thread_cpu is valid */
  97#define IORING_SETUP_CQSIZE     (1U << 3)       /* app defines CQ size */
  98#define IORING_SETUP_CLAMP      (1U << 4)       /* clamp SQ/CQ ring sizes */
  99#define IORING_SETUP_ATTACH_WQ  (1U << 5)       /* attach to existing wq */
 100#define IORING_SETUP_R_DISABLED (1U << 6)       /* start with ring disabled */
 101
 102enum {
 103        IORING_OP_NOP,
 104        IORING_OP_READV,
 105        IORING_OP_WRITEV,
 106        IORING_OP_FSYNC,
 107        IORING_OP_READ_FIXED,
 108        IORING_OP_WRITE_FIXED,
 109        IORING_OP_POLL_ADD,
 110        IORING_OP_POLL_REMOVE,
 111        IORING_OP_SYNC_FILE_RANGE,
 112        IORING_OP_SENDMSG,
 113        IORING_OP_RECVMSG,
 114        IORING_OP_TIMEOUT,
 115        IORING_OP_TIMEOUT_REMOVE,
 116        IORING_OP_ACCEPT,
 117        IORING_OP_ASYNC_CANCEL,
 118        IORING_OP_LINK_TIMEOUT,
 119        IORING_OP_CONNECT,
 120        IORING_OP_FALLOCATE,
 121        IORING_OP_OPENAT,
 122        IORING_OP_CLOSE,
 123        IORING_OP_FILES_UPDATE,
 124        IORING_OP_STATX,
 125        IORING_OP_READ,
 126        IORING_OP_WRITE,
 127        IORING_OP_FADVISE,
 128        IORING_OP_MADVISE,
 129        IORING_OP_SEND,
 130        IORING_OP_RECV,
 131        IORING_OP_OPENAT2,
 132        IORING_OP_EPOLL_CTL,
 133        IORING_OP_SPLICE,
 134        IORING_OP_PROVIDE_BUFFERS,
 135        IORING_OP_REMOVE_BUFFERS,
 136        IORING_OP_TEE,
 137        IORING_OP_SHUTDOWN,
 138        IORING_OP_RENAMEAT,
 139        IORING_OP_UNLINKAT,
 140
 141        /* this goes last, obviously */
 142        IORING_OP_LAST,
 143};
 144
 145/*
 146 * sqe->fsync_flags
 147 */
 148#define IORING_FSYNC_DATASYNC   (1U << 0)
 149
 150/*
 151 * sqe->timeout_flags
 152 */
 153#define IORING_TIMEOUT_ABS      (1U << 0)
 154#define IORING_TIMEOUT_UPDATE   (1U << 1)
 155
 156/*
 157 * sqe->splice_flags
 158 * extends splice(2) flags
 159 */
 160#define SPLICE_F_FD_IN_FIXED    (1U << 31) /* the last bit of __u32 */
 161
 162/*
 163 * POLL_ADD flags. Note that since sqe->poll_events is the flag space, the
 164 * command flags for POLL_ADD are stored in sqe->len.
 165 *
 166 * IORING_POLL_ADD_MULTI        Multishot poll. Sets IORING_CQE_F_MORE if
 167 *                              the poll handler will continue to report
 168 *                              CQEs on behalf of the same SQE.
 169 *
 170 * IORING_POLL_UPDATE           Update existing poll request, matching
 171 *                              sqe->addr as the old user_data field.
 172 */
 173#define IORING_POLL_ADD_MULTI   (1U << 0)
 174#define IORING_POLL_UPDATE_EVENTS       (1U << 1)
 175#define IORING_POLL_UPDATE_USER_DATA    (1U << 2)
 176
 177/*
 178 * IO completion data structure (Completion Queue Entry)
 179 */
 180struct io_uring_cqe {
 181        __u64   user_data;      /* sqe->data submission passed back */
 182        __s32   res;            /* result code for this event */
 183        __u32   flags;
 184};
 185
 186/*
 187 * cqe->flags
 188 *
 189 * IORING_CQE_F_BUFFER  If set, the upper 16 bits are the buffer ID
 190 * IORING_CQE_F_MORE    If set, parent SQE will generate more CQE entries
 191 */
 192#define IORING_CQE_F_BUFFER             (1U << 0)
 193#define IORING_CQE_F_MORE               (1U << 1)
 194
 195enum {
 196        IORING_CQE_BUFFER_SHIFT         = 16,
 197};
 198
 199/*
 200 * Magic offsets for the application to mmap the data it needs
 201 */
 202#define IORING_OFF_SQ_RING              0ULL
 203#define IORING_OFF_CQ_RING              0x8000000ULL
 204#define IORING_OFF_SQES                 0x10000000ULL
 205
 206/*
 207 * Filled with the offset for mmap(2)
 208 */
 209struct io_sqring_offsets {
 210        __u32 head;
 211        __u32 tail;
 212        __u32 ring_mask;
 213        __u32 ring_entries;
 214        __u32 flags;
 215        __u32 dropped;
 216        __u32 array;
 217        __u32 resv1;
 218        __u64 resv2;
 219};
 220
 221/*
 222 * sq_ring->flags
 223 */
 224#define IORING_SQ_NEED_WAKEUP   (1U << 0) /* needs io_uring_enter wakeup */
 225#define IORING_SQ_CQ_OVERFLOW   (1U << 1) /* CQ ring is overflown */
 226
 227struct io_cqring_offsets {
 228        __u32 head;
 229        __u32 tail;
 230        __u32 ring_mask;
 231        __u32 ring_entries;
 232        __u32 overflow;
 233        __u32 cqes;
 234        __u32 flags;
 235        __u32 resv1;
 236        __u64 resv2;
 237};
 238
 239/*
 240 * cq_ring->flags
 241 */
 242
 243/* disable eventfd notifications */
 244#define IORING_CQ_EVENTFD_DISABLED      (1U << 0)
 245
 246/*
 247 * io_uring_enter(2) flags
 248 */
 249#define IORING_ENTER_GETEVENTS  (1U << 0)
 250#define IORING_ENTER_SQ_WAKEUP  (1U << 1)
 251#define IORING_ENTER_SQ_WAIT    (1U << 2)
 252#define IORING_ENTER_EXT_ARG    (1U << 3)
 253
 254/*
 255 * Passed in for io_uring_setup(2). Copied back with updated info on success
 256 */
 257struct io_uring_params {
 258        __u32 sq_entries;
 259        __u32 cq_entries;
 260        __u32 flags;
 261        __u32 sq_thread_cpu;
 262        __u32 sq_thread_idle;
 263        __u32 features;
 264        __u32 wq_fd;
 265        __u32 resv[3];
 266        struct io_sqring_offsets sq_off;
 267        struct io_cqring_offsets cq_off;
 268};
 269
 270/*
 271 * io_uring_params->features flags
 272 */
 273#define IORING_FEAT_SINGLE_MMAP         (1U << 0)
 274#define IORING_FEAT_NODROP              (1U << 1)
 275#define IORING_FEAT_SUBMIT_STABLE       (1U << 2)
 276#define IORING_FEAT_RW_CUR_POS          (1U << 3)
 277#define IORING_FEAT_CUR_PERSONALITY     (1U << 4)
 278#define IORING_FEAT_FAST_POLL           (1U << 5)
 279#define IORING_FEAT_POLL_32BITS         (1U << 6)
 280#define IORING_FEAT_SQPOLL_NONFIXED     (1U << 7)
 281#define IORING_FEAT_EXT_ARG             (1U << 8)
 282#define IORING_FEAT_NATIVE_WORKERS      (1U << 9)
 283#define IORING_FEAT_RSRC_TAGS           (1U << 10)
 284
 285/*
 286 * io_uring_register(2) opcodes and arguments
 287 */
 288enum {
 289        IORING_REGISTER_BUFFERS                 = 0,
 290        IORING_UNREGISTER_BUFFERS               = 1,
 291        IORING_REGISTER_FILES                   = 2,
 292        IORING_UNREGISTER_FILES                 = 3,
 293        IORING_REGISTER_EVENTFD                 = 4,
 294        IORING_UNREGISTER_EVENTFD               = 5,
 295        IORING_REGISTER_FILES_UPDATE            = 6,
 296        IORING_REGISTER_EVENTFD_ASYNC           = 7,
 297        IORING_REGISTER_PROBE                   = 8,
 298        IORING_REGISTER_PERSONALITY             = 9,
 299        IORING_UNREGISTER_PERSONALITY           = 10,
 300        IORING_REGISTER_RESTRICTIONS            = 11,
 301        IORING_REGISTER_ENABLE_RINGS            = 12,
 302
 303        /* extended with tagging */
 304        IORING_REGISTER_FILES2                  = 13,
 305        IORING_REGISTER_FILES_UPDATE2           = 14,
 306        IORING_REGISTER_BUFFERS2                = 15,
 307        IORING_REGISTER_BUFFERS_UPDATE          = 16,
 308
 309        /* this goes last */
 310        IORING_REGISTER_LAST
 311};
 312
 313/* deprecated, see struct io_uring_rsrc_update */
 314struct io_uring_files_update {
 315        __u32 offset;
 316        __u32 resv;
 317        __aligned_u64 /* __s32 * */ fds;
 318};
 319
 320struct io_uring_rsrc_register {
 321        __u32 nr;
 322        __u32 resv;
 323        __u64 resv2;
 324        __aligned_u64 data;
 325        __aligned_u64 tags;
 326};
 327
 328struct io_uring_rsrc_update {
 329        __u32 offset;
 330        __u32 resv;
 331        __aligned_u64 data;
 332};
 333
 334struct io_uring_rsrc_update2 {
 335        __u32 offset;
 336        __u32 resv;
 337        __aligned_u64 data;
 338        __aligned_u64 tags;
 339        __u32 nr;
 340        __u32 resv2;
 341};
 342
 343/* Skip updating fd indexes set to this value in the fd table */
 344#define IORING_REGISTER_FILES_SKIP      (-2)
 345
 346#define IO_URING_OP_SUPPORTED   (1U << 0)
 347
 348struct io_uring_probe_op {
 349        __u8 op;
 350        __u8 resv;
 351        __u16 flags;    /* IO_URING_OP_* flags */
 352        __u32 resv2;
 353};
 354
 355struct io_uring_probe {
 356        __u8 last_op;   /* last opcode supported */
 357        __u8 ops_len;   /* length of ops[] array below */
 358        __u16 resv;
 359        __u32 resv2[3];
 360        struct io_uring_probe_op ops[0];
 361};
 362
 363struct io_uring_restriction {
 364        __u16 opcode;
 365        union {
 366                __u8 register_op; /* IORING_RESTRICTION_REGISTER_OP */
 367                __u8 sqe_op;      /* IORING_RESTRICTION_SQE_OP */
 368                __u8 sqe_flags;   /* IORING_RESTRICTION_SQE_FLAGS_* */
 369        };
 370        __u8 resv;
 371        __u32 resv2[3];
 372};
 373
 374/*
 375 * io_uring_restriction->opcode values
 376 */
 377enum {
 378        /* Allow an io_uring_register(2) opcode */
 379        IORING_RESTRICTION_REGISTER_OP          = 0,
 380
 381        /* Allow an sqe opcode */
 382        IORING_RESTRICTION_SQE_OP               = 1,
 383
 384        /* Allow sqe flags */
 385        IORING_RESTRICTION_SQE_FLAGS_ALLOWED    = 2,
 386
 387        /* Require sqe flags (these flags must be set on each submission) */
 388        IORING_RESTRICTION_SQE_FLAGS_REQUIRED   = 3,
 389
 390        IORING_RESTRICTION_LAST
 391};
 392
 393struct io_uring_getevents_arg {
 394        __u64   sigmask;
 395        __u32   sigmask_sz;
 396        __u32   pad;
 397        __u64   ts;
 398};
 399
 400#endif
 401