xref: /linux-6.15/include/uapi/linux/ublk_cmd.h (revision f50fff73)
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	(1ULL << 0)
50 
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	(1ULL << 1)
56 
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 */
62 struct 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 
78 struct 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;
92 	__u64	flags_reserved;
93 
94 	/* For ublksrv internal use, invisible to ublk driver */
95 	__u64	ublksrv_flags;
96 	__u64	reserved1[9];
97 };
98 
99 #define		UBLK_IO_OP_READ		0
100 #define		UBLK_IO_OP_WRITE		1
101 #define		UBLK_IO_OP_FLUSH		2
102 #define		UBLK_IO_OP_DISCARD	3
103 #define		UBLK_IO_OP_WRITE_SAME	4
104 #define		UBLK_IO_OP_WRITE_ZEROES	5
105 
106 #define		UBLK_IO_F_FAILFAST_DEV		(1U << 8)
107 #define		UBLK_IO_F_FAILFAST_TRANSPORT	(1U << 9)
108 #define		UBLK_IO_F_FAILFAST_DRIVER	(1U << 10)
109 #define		UBLK_IO_F_META			(1U << 11)
110 #define		UBLK_IO_F_FUA			(1U << 13)
111 #define		UBLK_IO_F_NOUNMAP		(1U << 15)
112 #define		UBLK_IO_F_SWAP			(1U << 16)
113 
114 /*
115  * io cmd is described by this structure, and stored in share memory, indexed
116  * by request tag.
117  *
118  * The data is stored by ublk driver, and read by ublksrv after one fetch command
119  * returns.
120  */
121 struct ublksrv_io_desc {
122 	/* op: bit 0-7, flags: bit 8-31 */
123 	__u32		op_flags;
124 
125 	__u32		nr_sectors;
126 
127 	/* start sector for this io */
128 	__u64		start_sector;
129 
130 	/* buffer address in ublksrv daemon vm space, from ublk driver */
131 	__u64		addr;
132 };
133 
134 static inline __u8 ublksrv_get_op(const struct ublksrv_io_desc *iod)
135 {
136 	return iod->op_flags & 0xff;
137 }
138 
139 static inline __u32 ublksrv_get_flags(const struct ublksrv_io_desc *iod)
140 {
141 	return iod->op_flags >> 8;
142 }
143 
144 /* issued to ublk driver via /dev/ublkcN */
145 struct ublksrv_io_cmd {
146 	__u16	q_id;
147 
148 	/* for fetch/commit which result */
149 	__u16	tag;
150 
151 	/* io result, it is valid for COMMIT* command only */
152 	__s32	result;
153 
154 	/*
155 	 * userspace buffer address in ublksrv daemon process, valid for
156 	 * FETCH* command only
157 	 */
158 	__u64	addr;
159 };
160 
161 #endif
162