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