History

ublk: register buffer to local io_uring with provided buf index via UBLK_F_AUTO_BUF_REG

Add UBLK_F_AUTO_BUF_REG for supporting to register buffer automatically to local io_uring context with provided buffer index. Add UAPI structure `struct ublk_auto_buf_reg` for holding user parameter to register request buffer automatically, one 'flags' field is defined, and there is still 32bit available for future extension, such as, adding one io_ring FD field for registering buffer to external io_uring. `struct ublk_auto_buf_reg` is populated from ublk uring_cmd's sqe->addr, and all existing ublk commands are data-less, so it is just fine to reuse sqe->addr for this purpose.

Ming Lei committed 1 year ago

Commit 99c1e4e1 parent 9e6b4752 files · +113 −7Browse files

Showing the changes to include/uapi/linux (1 of 2 files). Show all

Unified · Split

include/uapi/linux/ublk_cmd.h+64−0
@@ -219,6 +219,29 @@ · 218 unmodified lines
219219 */
220220 #define UBLK_F_UPDATE_SIZE (1ULL << 10)
221221
222+/*
223+ * request buffer is registered automatically to uring_cmd's io_uring
224+ * context before delivering this io command to ublk server, meantime
225+ * it is un-registered automatically when completing this io command.
226+ *
227+ * For using this feature:
228+ *
229+ * - ublk server has to create sparse buffer table
230+ *
231+ * - ublk server passes auto buf register data via uring_cmd's sqe->addr,
232+ * `struct ublk_auto_buf_reg` is populated from sqe->addr, please see
233+ * the definition of ublk_sqe_addr_to_auto_buf_reg()
234+ *
235+ * - pass buffer index from `ublk_auto_buf_reg.index`
236+ *
237+ * - all reserved fields in `ublk_auto_buf_reg` need to be zeroed
238+ *
239+ * This way avoids extra cost from two uring_cmd, but also simplifies backend
240+ * implementation, such as, the dependency on IO_REGISTER_IO_BUF and
241+ * IO_UNREGISTER_IO_BUF becomes not necessary.
242+ */
243+#define UBLK_F_AUTO_BUF_REG (1ULL << 11)
244+
222245 /* device state */
223246 #define UBLK_S_DEV_DEAD 0
224247 #define UBLK_S_DEV_LIVE 1
@@ -339,6 +362,47 @@ static inline __u32 ublksrv_get_flags(const struct ublksrv_io_desc *iod) · 114 unmodified lines
339362 return iod->op_flags >> 8;
340363 }
341364
365+struct ublk_auto_buf_reg {
366+ /* index for registering the delivered request buffer */
367+ __u16 index;
368+ __u16 reserved0;
369+
370+ /*
371+ * io_ring FD can be passed via the reserve field in future for
372+ * supporting to register io buffer to external io_uring
373+ */
374+ __u32 reserved1;
375+};
376+
377+/*
378+ * For UBLK_F_AUTO_BUF_REG, auto buffer register data is carried via
379+ * uring_cmd's sqe->addr:
380+ *
381+ * - bit0 ~ bit15: buffer index
382+ * - bit24 ~ bit31: reserved0
383+ * - bit32 ~ bit63: reserved1
384+ */
385+static inline struct ublk_auto_buf_reg ublk_sqe_addr_to_auto_buf_reg(
386+ __u64 sqe_addr)
387+{
388+ struct ublk_auto_buf_reg reg = {
389+ .index = sqe_addr & 0xffff,
390+ .reserved0 = (sqe_addr >> 16) & 0xffff,
391+ .reserved1 = sqe_addr >> 32,
392+ };
393+
394+ return reg;
395+}
396+
397+static inline __u64
398+ublk_auto_buf_reg_to_sqe_addr(const struct ublk_auto_buf_reg *buf)
399+{
400+ __u64 addr = buf->index | (__u64)buf->reserved0 << 16 |
401+ (__u64)buf->reserved1 << 32;
402+
403+ return addr;
404+}
405+
342406 /* issued to ublk driver via /dev/ublkcN */
343407 struct ublksrv_io_cmd {
344408 __u16 q_id;