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                __u32           hardlink_flags;
  48        };
  49        __u64   user_data;      /* data to be passed back at completion time */
  50        /* pack this to avoid bogus arm OABI complaints */
  51        union {
  52                /* index into fixed buffers, if used */
  53                __u16   buf_index;
  54                /* for grouped buffer selection */
  55                __u16   buf_group;
  56        } __attribute__((packed));
  57        /* personality to use, if used */
  58        __u16   personality;
  59        union {
  60                __s32   splice_fd_in;
  61                __u32   file_index;
  62        };
  63        __u64   __pad2[2];
  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        IORING_OP_MKDIRAT,
 141        IORING_OP_SYMLINKAT,
 142        IORING_OP_LINKAT,
 143
 144        /* this goes last, obviously */
 145        IORING_OP_LAST,
 146};
 147
 148/*
 149 * sqe->fsync_flags
 150 */
 151#define IORING_FSYNC_DATASYNC   (1U << 0)
 152
 153/*
 154 * sqe->timeout_flags
 155 */
 156#define IORING_TIMEOUT_ABS              (1U << 0)
 157#define IORING_TIMEOUT_UPDATE           (1U << 1)
 158#define IORING_TIMEOUT_BOOTTIME         (1U << 2)
 159#define IORING_TIMEOUT_REALTIME         (1U << 3)
 160#define IORING_LINK_TIMEOUT_UPDATE      (1U << 4)
 161#define IORING_TIMEOUT_CLOCK_MASK       (IORING_TIMEOUT_BOOTTIME | IORING_TIMEOUT_REALTIME)
 162#define IORING_TIMEOUT_UPDATE_MASK      (IORING_TIMEOUT_UPDATE | IORING_LINK_TIMEOUT_UPDATE)
 163/*
 164 * sqe->splice_flags
 165 * extends splice(2) flags
 166 */
 167#define SPLICE_F_FD_IN_FIXED    (1U << 31) /* the last bit of __u32 */
 168
 169/*
 170 * POLL_ADD flags. Note that since sqe->poll_events is the flag space, the
 171 * command flags for POLL_ADD are stored in sqe->len.
 172 *
 173 * IORING_POLL_ADD_MULTI        Multishot poll. Sets IORING_CQE_F_MORE if
 174 *                              the poll handler will continue to report
 175 *                              CQEs on behalf of the same SQE.
 176 *
 177 * IORING_POLL_UPDATE           Update existing poll request, matching
 178 *                              sqe->addr as the old user_data field.
 179 */
 180#define IORING_POLL_ADD_MULTI   (1U << 0)
 181#define IORING_POLL_UPDATE_EVENTS       (1U << 1)
 182#define IORING_POLL_UPDATE_USER_DATA    (1U << 2)
 183
 184/*
 185 * IO completion data structure (Completion Queue Entry)
 186 */
 187struct io_uring_cqe {
 188        __u64   user_data;      /* sqe->data submission passed back */
 189        __s32   res;            /* result code for this event */
 190        __u32   flags;
 191};
 192
 193/*
 194 * cqe->flags
 195 *
 196 * IORING_CQE_F_BUFFER  If set, the upper 16 bits are the buffer ID
 197 * IORING_CQE_F_MORE    If set, parent SQE will generate more CQE entries
 198 */
 199#define IORING_CQE_F_BUFFER             (1U << 0)
 200#define IORING_CQE_F_MORE               (1U << 1)
 201
 202enum {
 203        IORING_CQE_BUFFER_SHIFT         = 16,
 204};
 205
 206/*
 207 * Magic offsets for the application to mmap the data it needs
 208 */
 209#define IORING_OFF_SQ_RING              0ULL
 210#define IORING_OFF_CQ_RING              0x8000000ULL
 211#define IORING_OFF_SQES                 0x10000000ULL
 212
 213/*
 214 * Filled with the offset for mmap(2)
 215 */
 216struct io_sqring_offsets {
 217        __u32 head;
 218        __u32 tail;
 219        __u32 ring_mask;
 220        __u32 ring_entries;
 221        __u32 flags;
 222        __u32 dropped;
 223        __u32 array;
 224        __u32 resv1;
 225        __u64 resv2;
 226};
 227
 228/*
 229 * sq_ring->flags
 230 */
 231#define IORING_SQ_NEED_WAKEUP   (1U << 0) /* needs io_uring_enter wakeup */
 232#define IORING_SQ_CQ_OVERFLOW   (1U << 1) /* CQ ring is overflown */
 233
 234struct io_cqring_offsets {
 235        __u32 head;
 236        __u32 tail;
 237        __u32 ring_mask;
 238        __u32 ring_entries;
 239        __u32 overflow;
 240        __u32 cqes;
 241        __u32 flags;
 242        __u32 resv1;
 243        __u64 resv2;
 244};
 245
 246/*
 247 * cq_ring->flags
 248 */
 249
 250/* disable eventfd notifications */
 251#define IORING_CQ_EVENTFD_DISABLED      (1U << 0)
 252
 253/*
 254 * io_uring_enter(2) flags
 255 */
 256#define IORING_ENTER_GETEVENTS  (1U << 0)
 257#define IORING_ENTER_SQ_WAKEUP  (1U << 1)
 258#define IORING_ENTER_SQ_WAIT    (1U << 2)
 259#define IORING_ENTER_EXT_ARG    (1U << 3)
 260
 261/*
 262 * Passed in for io_uring_setup(2). Copied back with updated info on success
 263 */
 264struct io_uring_params {
 265        __u32 sq_entries;
 266        __u32 cq_entries;
 267        __u32 flags;
 268        __u32 sq_thread_cpu;
 269        __u32 sq_thread_idle;
 270        __u32 features;
 271        __u32 wq_fd;
 272        __u32 resv[3];
 273        struct io_sqring_offsets sq_off;
 274        struct io_cqring_offsets cq_off;
 275};
 276
 277/*
 278 * io_uring_params->features flags
 279 */
 280#define IORING_FEAT_SINGLE_MMAP         (1U << 0)
 281#define IORING_FEAT_NODROP              (1U << 1)
 282#define IORING_FEAT_SUBMIT_STABLE       (1U << 2)
 283#define IORING_FEAT_RW_CUR_POS          (1U << 3)
 284#define IORING_FEAT_CUR_PERSONALITY     (1U << 4)
 285#define IORING_FEAT_FAST_POLL           (1U << 5)
 286#define IORING_FEAT_POLL_32BITS         (1U << 6)
 287#define IORING_FEAT_SQPOLL_NONFIXED     (1U << 7)
 288#define IORING_FEAT_EXT_ARG             (1U << 8)
 289#define IORING_FEAT_NATIVE_WORKERS      (1U << 9)
 290#define IORING_FEAT_RSRC_TAGS           (1U << 10)
 291
 292/*
 293 * io_uring_register(2) opcodes and arguments
 294 */
 295enum {
 296        IORING_REGISTER_BUFFERS                 = 0,
 297        IORING_UNREGISTER_BUFFERS               = 1,
 298        IORING_REGISTER_FILES                   = 2,
 299        IORING_UNREGISTER_FILES                 = 3,
 300        IORING_REGISTER_EVENTFD                 = 4,
 301        IORING_UNREGISTER_EVENTFD               = 5,
 302        IORING_REGISTER_FILES_UPDATE            = 6,
 303        IORING_REGISTER_EVENTFD_ASYNC           = 7,
 304        IORING_REGISTER_PROBE                   = 8,
 305        IORING_REGISTER_PERSONALITY             = 9,
 306        IORING_UNREGISTER_PERSONALITY           = 10,
 307        IORING_REGISTER_RESTRICTIONS            = 11,
 308        IORING_REGISTER_ENABLE_RINGS            = 12,
 309
 310        /* extended with tagging */
 311        IORING_REGISTER_FILES2                  = 13,
 312        IORING_REGISTER_FILES_UPDATE2           = 14,
 313        IORING_REGISTER_BUFFERS2                = 15,
 314        IORING_REGISTER_BUFFERS_UPDATE          = 16,
 315
 316        /* set/clear io-wq thread affinities */
 317        IORING_REGISTER_IOWQ_AFF                = 17,
 318        IORING_UNREGISTER_IOWQ_AFF              = 18,
 319
 320        /* set/get max number of io-wq workers */
 321        IORING_REGISTER_IOWQ_MAX_WORKERS        = 19,
 322
 323        /* this goes last */
 324        IORING_REGISTER_LAST
 325};
 326
 327/* io-wq worker categories */
 328enum {
 329        IO_WQ_BOUND,
 330        IO_WQ_UNBOUND,
 331};
 332
 333/* deprecated, see struct io_uring_rsrc_update */
 334struct io_uring_files_update {
 335        __u32 offset;
 336        __u32 resv;
 337        __aligned_u64 /* __s32 * */ fds;
 338};
 339
 340struct io_uring_rsrc_register {
 341        __u32 nr;
 342        __u32 resv;
 343        __u64 resv2;
 344        __aligned_u64 data;
 345        __aligned_u64 tags;
 346};
 347
 348struct io_uring_rsrc_update {
 349        __u32 offset;
 350        __u32 resv;
 351        __aligned_u64 data;
 352};
 353
 354struct io_uring_rsrc_update2 {
 355        __u32 offset;
 356        __u32 resv;
 357        __aligned_u64 data;
 358        __aligned_u64 tags;
 359        __u32 nr;
 360        __u32 resv2;
 361};
 362
 363/* Skip updating fd indexes set to this value in the fd table */
 364#define IORING_REGISTER_FILES_SKIP      (-2)
 365
 366#define IO_URING_OP_SUPPORTED   (1U << 0)
 367
 368struct io_uring_probe_op {
 369        __u8 op;
 370        __u8 resv;
 371        __u16 flags;    /* IO_URING_OP_* flags */
 372        __u32 resv2;
 373};
 374
 375struct io_uring_probe {
 376        __u8 last_op;   /* last opcode supported */
 377        __u8 ops_len;   /* length of ops[] array below */
 378        __u16 resv;
 379        __u32 resv2[3];
 380        struct io_uring_probe_op ops[0];
 381};
 382
 383struct io_uring_restriction {
 384        __u16 opcode;
 385        union {
 386                __u8 register_op; /* IORING_RESTRICTION_REGISTER_OP */
 387                __u8 sqe_op;      /* IORING_RESTRICTION_SQE_OP */
 388                __u8 sqe_flags;   /* IORING_RESTRICTION_SQE_FLAGS_* */
 389        };
 390        __u8 resv;
 391        __u32 resv2[3];
 392};
 393
 394/*
 395 * io_uring_restriction->opcode values
 396 */
 397enum {
 398        /* Allow an io_uring_register(2) opcode */
 399        IORING_RESTRICTION_REGISTER_OP          = 0,
 400
 401        /* Allow an sqe opcode */
 402        IORING_RESTRICTION_SQE_OP               = 1,
 403
 404        /* Allow sqe flags */
 405        IORING_RESTRICTION_SQE_FLAGS_ALLOWED    = 2,
 406
 407        /* Require sqe flags (these flags must be set on each submission) */
 408        IORING_RESTRICTION_SQE_FLAGS_REQUIRED   = 3,
 409
 410        IORING_RESTRICTION_LAST
 411};
 412
 413struct io_uring_getevents_arg {
 414        __u64   sigmask;
 415        __u32   sigmask_sz;
 416        __u32   pad;
 417        __u64   ts;
 418};
 419
 420#endif
 421