2019-01-08 06:51:07 -07:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
|
|
|
/*
|
|
|
|
|
* Header file for the io_uring interface.
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) 2019 Jens Axboe
|
|
|
|
|
* Copyright (C) 2019 Christoph Hellwig
|
|
|
|
|
*/
|
|
|
|
|
#ifndef LINUX_IO_URING_H
|
|
|
|
|
#define LINUX_IO_URING_H
|
|
|
|
|
|
|
|
|
|
#include <linux/fs.h>
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
|
|
|
|
|
|
/*
|
2019-01-09 15:26:20 -07:00
|
|
|
* IO submission data structure (Submission Queue Entry)
|
2019-01-08 06:51:07 -07:00
|
|
|
*/
|
2019-01-09 15:26:20 -07:00
|
|
|
struct io_uring_sqe {
|
2019-01-08 06:51:07 -07:00
|
|
|
__u8 opcode;
|
|
|
|
|
__u8 flags;
|
|
|
|
|
__u16 ioprio;
|
|
|
|
|
__s32 fd;
|
|
|
|
|
__u64 off;
|
|
|
|
|
union {
|
|
|
|
|
void *addr;
|
|
|
|
|
__u64 __pad;
|
|
|
|
|
};
|
|
|
|
|
__u32 len;
|
|
|
|
|
union {
|
|
|
|
|
__kernel_rwf_t rw_flags;
|
|
|
|
|
__u32 __resv;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* io_uring_setup() flags
|
|
|
|
|
*/
|
|
|
|
|
#define IORING_SETUP_IOPOLL (1 << 0) /* io_context is polled */
|
2019-01-09 15:26:20 -07:00
|
|
|
#define IORING_SETUP_SQTHREAD (1 << 1) /* Use SQ thread */
|
|
|
|
|
#define IORING_SETUP_SQWQ (1 << 2) /* Use SQ workqueue */
|
|
|
|
|
#define IORING_SETUP_SQPOLL (1 << 3) /* SQ thread polls */
|
2019-01-08 06:51:07 -07:00
|
|
|
|
2019-01-09 15:26:20 -07:00
|
|
|
#define IORING_OP_READV 1
|
|
|
|
|
#define IORING_OP_WRITEV 2
|
2019-01-08 06:51:07 -07:00
|
|
|
#define IORING_OP_FSYNC 3
|
|
|
|
|
#define IORING_OP_FDSYNC 4
|
|
|
|
|
#define IORING_OP_READ_FIXED 5
|
|
|
|
|
#define IORING_OP_WRITE_FIXED 6
|
|
|
|
|
|
|
|
|
|
/*
|
2019-01-09 15:26:20 -07:00
|
|
|
* IO completion data structure (Completion Queue Entry)
|
2019-01-08 06:51:07 -07:00
|
|
|
*/
|
2019-01-09 15:26:20 -07:00
|
|
|
struct io_uring_cqe {
|
|
|
|
|
__u64 index; /* what sqe this event came from */
|
2019-01-08 06:51:07 -07:00
|
|
|
__s32 res; /* result code for this event */
|
|
|
|
|
__u32 flags;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* io_uring_event->flags
|
|
|
|
|
*/
|
2019-01-09 15:26:20 -07:00
|
|
|
#define IOCQE_FLAG_CACHEHIT (1 << 0) /* IO did not hit media */
|
2019-01-08 06:51:07 -07:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Magic offsets for the application to mmap the data it needs
|
|
|
|
|
*/
|
|
|
|
|
#define IORING_OFF_SQ_RING 0ULL
|
|
|
|
|
#define IORING_OFF_CQ_RING 0x8000000ULL
|
2019-01-09 15:26:20 -07:00
|
|
|
#define IORING_OFF_SQES 0x10000000ULL
|
2019-01-08 06:51:07 -07:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Filled with the offset for mmap(2)
|
|
|
|
|
*/
|
|
|
|
|
struct io_sqring_offsets {
|
|
|
|
|
__u32 head;
|
|
|
|
|
__u32 tail;
|
|
|
|
|
__u32 ring_mask;
|
|
|
|
|
__u32 ring_entries;
|
|
|
|
|
__u32 flags;
|
|
|
|
|
__u32 dropped;
|
|
|
|
|
__u32 array;
|
|
|
|
|
__u32 resv[3];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#define IORING_SQ_NEED_WAKEUP (1 << 0) /* needs io_uring_enter wakeup */
|
|
|
|
|
|
|
|
|
|
struct io_cqring_offsets {
|
|
|
|
|
__u32 head;
|
|
|
|
|
__u32 tail;
|
|
|
|
|
__u32 ring_mask;
|
|
|
|
|
__u32 ring_entries;
|
|
|
|
|
__u32 overflow;
|
2019-01-09 15:26:20 -07:00
|
|
|
__u32 cqes;
|
2019-01-08 06:51:07 -07:00
|
|
|
__u32 resv[4];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* io_uring_enter(2) flags
|
|
|
|
|
*/
|
|
|
|
|
#define IORING_ENTER_GETEVENTS (1 << 0)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Passed in for io_uring_setup(2). Copied back with updated info on success
|
|
|
|
|
*/
|
|
|
|
|
struct io_uring_params {
|
|
|
|
|
__u32 sq_entries;
|
|
|
|
|
__u32 cq_entries;
|
|
|
|
|
__u32 flags;
|
|
|
|
|
__u16 sq_thread_cpu;
|
|
|
|
|
__u16 resv[9];
|
|
|
|
|
struct io_sqring_offsets sq_off;
|
|
|
|
|
struct io_cqring_offsets cq_off;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|