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        };
  46        __u64   user_data;      /* data to be passed back at completion time */
  47        union {
  48                struct {
  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));
  56                        /* personality to use, if used */
  57                        __u16   personality;
  58                        __s32   splice_fd_in;
  59                };
  60                __u64   __pad2[3];
  61        };
  62};
  63
  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,
  70        IOSQE_BUFFER_SELECT_BIT,
  71};
  72
  73/*
  74 * sqe->flags
  75 */
  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)
  86/* select buffer from sqe->buf_group */
  87#define IOSQE_BUFFER_SELECT     (1U << IOSQE_BUFFER_SELECT_BIT)
  88
  89/*
  90 * io_uring_setup() flags
  91 */
  92#define IORING_SETUP_IOPOLL     (1U << 0)       /* io_context is polled */
  93#define IORING_SETUP_SQPOLL     (1U << 1)       /* SQ poll thread */
  94#define IORING_SETUP_SQ_AFF     (1U << 2)       /* sq_thread_cpu is valid */
  95#define IORING_SETUP_CQSIZE     (1U << 3)       /* app defines CQ size */
  96#define IORING_SETUP_CLAMP      (1U << 4)       /* clamp SQ/CQ ring sizes */
  97#define IORING_SETUP_ATTACH_WQ  (1U << 5)       /* attach to existing wq */
  98#define IORING_SETUP_R_DISABLED (1U << 6)       /* start with ring disabled */
  99
 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,
 118        IORING_OP_FALLOCATE,
 119        IORING_OP_OPENAT,
 120        IORING_OP_CLOSE,
 121        IORING_OP_FILES_UPDATE,
 122        IORING_OP_STATX,
 123        IORING_OP_READ,
 124        IORING_OP_WRITE,
 125        IORING_OP_FADVISE,
 126        IORING_OP_MADVISE,
 127        IORING_OP_SEND,
 128        IORING_OP_RECV,
 129        IORING_OP_OPENAT2,
 130        IORING_OP_EPOLL_CTL,
 131        IORING_OP_SPLICE,
 132        IORING_OP_PROVIDE_BUFFERS,
 133        IORING_OP_REMOVE_BUFFERS,
 134        IORING_OP_TEE,
 135
 136        /* this goes last, obviously */
 137        IORING_OP_LAST,
 138};
 139
 140/*
 141 * sqe->fsync_flags
 142 */
 143#define IORING_FSYNC_DATASYNC   (1U << 0)
 144
 145/*
 146 * sqe->timeout_flags
 147 */
 148#define IORING_TIMEOUT_ABS      (1U << 0)
 149
 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
 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
 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
 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
 198/*
 199 * sq_ring->flags
 200 */
 201#define IORING_SQ_NEED_WAKEUP   (1U << 0) /* needs io_uring_enter wakeup */
 202#define IORING_SQ_CQ_OVERFLOW   (1U << 1) /* CQ ring is overflown */
 203
 204struct io_cqring_offsets {
 205        __u32 head;
 206        __u32 tail;
 207        __u32 ring_mask;
 208        __u32 ring_entries;
 209        __u32 overflow;
 210        __u32 cqes;
 211        __u32 flags;
 212        __u32 resv1;
 213        __u64 resv2;
 214};
 215
 216/*
 217 * cq_ring->flags
 218 */
 219
 220/* disable eventfd notifications */
 221#define IORING_CQ_EVENTFD_DISABLED      (1U << 0)
 222
 223/*
 224 * io_uring_enter(2) flags
 225 */
 226#define IORING_ENTER_GETEVENTS  (1U << 0)
 227#define IORING_ENTER_SQ_WAKEUP  (1U << 1)
 228#define IORING_ENTER_SQ_WAIT    (1U << 2)
 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;
 237        __u32 sq_thread_cpu;
 238        __u32 sq_thread_idle;
 239        __u32 features;
 240        __u32 wq_fd;
 241        __u32 resv[3];
 242        struct io_sqring_offsets sq_off;
 243        struct io_cqring_offsets cq_off;
 244};
 245
 246/*
 247 * io_uring_params->features flags
 248 */
 249#define IORING_FEAT_SINGLE_MMAP         (1U << 0)
 250#define IORING_FEAT_NODROP              (1U << 1)
 251#define IORING_FEAT_SUBMIT_STABLE       (1U << 2)
 252#define IORING_FEAT_RW_CUR_POS          (1U << 3)
 253#define IORING_FEAT_CUR_PERSONALITY     (1U << 4)
 254#define IORING_FEAT_FAST_POLL           (1U << 5)
 255#define IORING_FEAT_POLL_32BITS         (1U << 6)
 256
 257/*
 258 * io_uring_register(2) opcodes and arguments
 259 */
 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,
 272        IORING_REGISTER_RESTRICTIONS            = 11,
 273        IORING_REGISTER_ENABLE_RINGS            = 12,
 274
 275        /* this goes last */
 276        IORING_REGISTER_LAST
 277};
 278
 279struct io_uring_files_update {
 280        __u32 offset;
 281        __u32 resv;
 282        __aligned_u64 /* __s32 * */ fds;
 283};
 284
 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
 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
 332#endif
 333