ublk_cmd.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. #include <linux/types.h>
  5. /* ublk server command definition */
  6. /*
  7. * Admin commands, issued by ublk server, and handled by ublk driver.
  8. */
  9. #define UBLK_CMD_GET_QUEUE_AFFINITY 0x01
  10. #define UBLK_CMD_GET_DEV_INFO 0x02
  11. #define UBLK_CMD_ADD_DEV 0x04
  12. #define UBLK_CMD_DEL_DEV 0x05
  13. #define UBLK_CMD_START_DEV 0x06
  14. #define UBLK_CMD_STOP_DEV 0x07
  15. #define UBLK_CMD_SET_PARAMS 0x08
  16. #define UBLK_CMD_GET_PARAMS 0x09
  17. #define UBLK_CMD_START_USER_RECOVERY 0x10
  18. #define UBLK_CMD_END_USER_RECOVERY 0x11
  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. * NEED_GET_DATA: only used for write requests to set io addr and copy data
  33. * When NEED_GET_DATA is set, ublksrv has to issue UBLK_IO_NEED_GET_DATA
  34. * command after ublk driver returns UBLK_IO_RES_NEED_GET_DATA.
  35. *
  36. * It is only used if ublksrv set UBLK_F_NEED_GET_DATA flag
  37. * while starting a ublk device.
  38. */
  39. #define UBLK_IO_FETCH_REQ 0x20
  40. #define UBLK_IO_COMMIT_AND_FETCH_REQ 0x21
  41. #define UBLK_IO_NEED_GET_DATA 0x22
  42. /* only ABORT means that no re-fetch */
  43. #define UBLK_IO_RES_OK 0
  44. #define UBLK_IO_RES_NEED_GET_DATA 1
  45. #define UBLK_IO_RES_ABORT (-ENODEV)
  46. #define UBLKSRV_CMD_BUF_OFFSET 0
  47. #define UBLKSRV_IO_BUF_OFFSET 0x80000000
  48. /* tag bit is 12bit, so at most 4096 IOs for each queue */
  49. #define UBLK_MAX_QUEUE_DEPTH 4096
  50. /*
  51. * zero copy requires 4k block size, and can remap ublk driver's io
  52. * request into ublksrv's vm space
  53. */
  54. #define UBLK_F_SUPPORT_ZERO_COPY (1ULL << 0)
  55. /*
  56. * Force to complete io cmd via io_uring_cmd_complete_in_task so that
  57. * performance comparison is done easily with using task_work_add
  58. */
  59. #define UBLK_F_URING_CMD_COMP_IN_TASK (1ULL << 1)
  60. /*
  61. * User should issue io cmd again for write requests to
  62. * set io buffer address and copy data from bio vectors
  63. * to the userspace io buffer.
  64. *
  65. * In this mode, task_work is not used.
  66. */
  67. #define UBLK_F_NEED_GET_DATA (1UL << 2)
  68. #define UBLK_F_USER_RECOVERY (1UL << 3)
  69. #define UBLK_F_USER_RECOVERY_REISSUE (1UL << 4)
  70. /* device state */
  71. #define UBLK_S_DEV_DEAD 0
  72. #define UBLK_S_DEV_LIVE 1
  73. #define UBLK_S_DEV_QUIESCED 2
  74. /* shipped via sqe->cmd of io_uring command */
  75. struct ublksrv_ctrl_cmd {
  76. /* sent to which device, must be valid */
  77. __u32 dev_id;
  78. /* sent to which queue, must be -1 if the cmd isn't for queue */
  79. __u16 queue_id;
  80. /*
  81. * cmd specific buffer, can be IN or OUT.
  82. */
  83. __u16 len;
  84. __u64 addr;
  85. /* inline data */
  86. __u64 data[2];
  87. };
  88. struct ublksrv_ctrl_dev_info {
  89. __u16 nr_hw_queues;
  90. __u16 queue_depth;
  91. __u16 state;
  92. __u16 pad0;
  93. __u32 max_io_buf_bytes;
  94. __u32 dev_id;
  95. __s32 ublksrv_pid;
  96. __u32 pad1;
  97. __u64 flags;
  98. /* For ublksrv internal use, invisible to ublk driver */
  99. __u64 ublksrv_flags;
  100. __u64 reserved0;
  101. __u64 reserved1;
  102. __u64 reserved2;
  103. };
  104. #define UBLK_IO_OP_READ 0
  105. #define UBLK_IO_OP_WRITE 1
  106. #define UBLK_IO_OP_FLUSH 2
  107. #define UBLK_IO_OP_DISCARD 3
  108. #define UBLK_IO_OP_WRITE_SAME 4
  109. #define UBLK_IO_OP_WRITE_ZEROES 5
  110. #define UBLK_IO_F_FAILFAST_DEV (1U << 8)
  111. #define UBLK_IO_F_FAILFAST_TRANSPORT (1U << 9)
  112. #define UBLK_IO_F_FAILFAST_DRIVER (1U << 10)
  113. #define UBLK_IO_F_META (1U << 11)
  114. #define UBLK_IO_F_FUA (1U << 13)
  115. #define UBLK_IO_F_NOUNMAP (1U << 15)
  116. #define UBLK_IO_F_SWAP (1U << 16)
  117. /*
  118. * io cmd is described by this structure, and stored in share memory, indexed
  119. * by request tag.
  120. *
  121. * The data is stored by ublk driver, and read by ublksrv after one fetch command
  122. * returns.
  123. */
  124. struct ublksrv_io_desc {
  125. /* op: bit 0-7, flags: bit 8-31 */
  126. __u32 op_flags;
  127. __u32 nr_sectors;
  128. /* start sector for this io */
  129. __u64 start_sector;
  130. /* buffer address in ublksrv daemon vm space, from ublk driver */
  131. __u64 addr;
  132. };
  133. static inline __u8 ublksrv_get_op(const struct ublksrv_io_desc *iod)
  134. {
  135. return iod->op_flags & 0xff;
  136. }
  137. static inline __u32 ublksrv_get_flags(const struct ublksrv_io_desc *iod)
  138. {
  139. return iod->op_flags >> 8;
  140. }
  141. /* issued to ublk driver via /dev/ublkcN */
  142. struct ublksrv_io_cmd {
  143. __u16 q_id;
  144. /* for fetch/commit which result */
  145. __u16 tag;
  146. /* io result, it is valid for COMMIT* command only */
  147. __s32 result;
  148. /*
  149. * userspace buffer address in ublksrv daemon process, valid for
  150. * FETCH* command only
  151. */
  152. __u64 addr;
  153. };
  154. struct ublk_param_basic {
  155. #define UBLK_ATTR_READ_ONLY (1 << 0)
  156. #define UBLK_ATTR_ROTATIONAL (1 << 1)
  157. #define UBLK_ATTR_VOLATILE_CACHE (1 << 2)
  158. #define UBLK_ATTR_FUA (1 << 3)
  159. __u32 attrs;
  160. __u8 logical_bs_shift;
  161. __u8 physical_bs_shift;
  162. __u8 io_opt_shift;
  163. __u8 io_min_shift;
  164. __u32 max_sectors;
  165. __u32 chunk_sectors;
  166. __u64 dev_sectors;
  167. __u64 virt_boundary_mask;
  168. };
  169. struct ublk_param_discard {
  170. __u32 discard_alignment;
  171. __u32 discard_granularity;
  172. __u32 max_discard_sectors;
  173. __u32 max_write_zeroes_sectors;
  174. __u16 max_discard_segments;
  175. __u16 reserved0;
  176. };
  177. struct ublk_params {
  178. /*
  179. * Total length of parameters, userspace has to set 'len' for both
  180. * SET_PARAMS and GET_PARAMS command, and driver may update len
  181. * if two sides use different version of 'ublk_params', same with
  182. * 'types' fields.
  183. */
  184. __u32 len;
  185. #define UBLK_PARAM_TYPE_BASIC (1 << 0)
  186. #define UBLK_PARAM_TYPE_DISCARD (1 << 1)
  187. __u32 types; /* types of parameter included */
  188. struct ublk_param_basic basic;
  189. struct ublk_param_discard discard;
  190. };
  191. #endif