ublk_drv: support to complete io command via task_work_add
[linux-block.git] / include / uapi / linux / ublk_cmd.h
CommitLineData
71f28f31
ML
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef USER_BLK_DRV_CMD_INC_H
3#define USER_BLK_DRV_CMD_INC_H
4
5#include <linux/types.h>
6
7/* ublk server command definition */
8
9/*
10 * Admin commands, issued by ublk server, and handled by ublk driver.
11 */
12#define UBLK_CMD_GET_QUEUE_AFFINITY 0x01
13#define UBLK_CMD_GET_DEV_INFO 0x02
14#define UBLK_CMD_ADD_DEV 0x04
15#define UBLK_CMD_DEL_DEV 0x05
16#define UBLK_CMD_START_DEV 0x06
17#define UBLK_CMD_STOP_DEV 0x07
18
19/*
20 * IO commands, issued by ublk server, and handled by ublk driver.
21 *
22 * FETCH_REQ: issued via sqe(URING_CMD) beforehand for fetching IO request
23 * from ublk driver, should be issued only when starting device. After
24 * the associated cqe is returned, request's tag can be retrieved via
25 * cqe->userdata.
26 *
27 * COMMIT_AND_FETCH_REQ: issued via sqe(URING_CMD) after ublkserver handled
28 * this IO request, request's handling result is committed to ublk
29 * driver, meantime FETCH_REQ is piggyback, and FETCH_REQ has to be
30 * handled before completing io request.
31 */
32#define UBLK_IO_FETCH_REQ 0x20
33#define UBLK_IO_COMMIT_AND_FETCH_REQ 0x21
34
35/* only ABORT means that no re-fetch */
36#define UBLK_IO_RES_OK 0
37#define UBLK_IO_RES_ABORT (-ENODEV)
38
39#define UBLKSRV_CMD_BUF_OFFSET 0
40#define UBLKSRV_IO_BUF_OFFSET 0x80000000
41
42/* tag bit is 12bit, so at most 4096 IOs for each queue */
43#define UBLK_MAX_QUEUE_DEPTH 4096
44
45/*
46 * zero copy requires 4k block size, and can remap ublk driver's io
47 * request into ublksrv's vm space
48 */
49#define UBLK_F_SUPPORT_ZERO_COPY (1UL << 0)
50
0edb3696
ML
51/*
52 * Force to complete io cmd via io_uring_cmd_complete_in_task so that
53 * performance comparison is done easily with using task_work_add
54 */
55#define UBLK_F_URING_CMD_COMP_IN_TASK (1UL << 1)
56
71f28f31
ML
57/* device state */
58#define UBLK_S_DEV_DEAD 0
59#define UBLK_S_DEV_LIVE 1
60
61/* shipped via sqe->cmd of io_uring command */
62struct ublksrv_ctrl_cmd {
63 /* sent to which device, must be valid */
64 __u32 dev_id;
65
66 /* sent to which queue, must be -1 if the cmd isn't for queue */
67 __u16 queue_id;
68 /*
69 * cmd specific buffer, can be IN or OUT.
70 */
71 __u16 len;
72 __u64 addr;
73
74 /* inline data */
75 __u64 data[2];
76};
77
78struct ublksrv_ctrl_dev_info {
79 __u16 nr_hw_queues;
80 __u16 queue_depth;
81 __u16 block_size;
82 __u16 state;
83
84 __u32 rq_max_blocks;
85 __u32 dev_id;
86
87 __u64 dev_blocks;
88
89 __s32 ublksrv_pid;
90 __s32 reserved0;
91 __u64 flags[2];
92
93 /* For ublksrv internal use, invisible to ublk driver */
94 __u64 ublksrv_flags;
95 __u64 reserved1[9];
96};
97
98#define UBLK_IO_OP_READ 0
99#define UBLK_IO_OP_WRITE 1
100#define UBLK_IO_OP_FLUSH 2
101#define UBLK_IO_OP_DISCARD 3
102#define UBLK_IO_OP_WRITE_SAME 4
103#define UBLK_IO_OP_WRITE_ZEROES 5
104
105#define UBLK_IO_F_FAILFAST_DEV (1U << 8)
106#define UBLK_IO_F_FAILFAST_TRANSPORT (1U << 9)
107#define UBLK_IO_F_FAILFAST_DRIVER (1U << 10)
108#define UBLK_IO_F_META (1U << 11)
109#define UBLK_IO_F_INTEGRITY (1U << 12)
110#define UBLK_IO_F_FUA (1U << 13)
111#define UBLK_IO_F_PREFLUSH (1U << 14)
112#define UBLK_IO_F_NOUNMAP (1U << 15)
113#define UBLK_IO_F_SWAP (1U << 16)
114
115/*
116 * io cmd is described by this structure, and stored in share memory, indexed
117 * by request tag.
118 *
119 * The data is stored by ublk driver, and read by ublksrv after one fetch command
120 * returns.
121 */
122struct ublksrv_io_desc {
123 /* op: bit 0-7, flags: bit 8-31 */
124 __u32 op_flags;
125
126 __u32 nr_sectors;
127
128 /* start sector for this io */
129 __u64 start_sector;
130
131 /* buffer address in ublksrv daemon vm space, from ublk driver */
132 __u64 addr;
133};
134
135static inline __u8 ublksrv_get_op(const struct ublksrv_io_desc *iod)
136{
137 return iod->op_flags & 0xff;
138}
139
140static inline __u32 ublksrv_get_flags(const struct ublksrv_io_desc *iod)
141{
142 return iod->op_flags >> 8;
143}
144
145/* issued to ublk driver via /dev/ublkcN */
146struct ublksrv_io_cmd {
147 __u16 q_id;
148
149 /* for fetch/commit which result */
150 __u16 tag;
151
152 /* io result, it is valid for COMMIT* command only */
153 __s32 result;
154
155 /*
156 * userspace buffer address in ublksrv daemon process, valid for
157 * FETCH* command only
158 */
159 __u64 addr;
160};
161
162#endif