11#ifndef IORING_URING_CMD_MULTISHOT
12#define IORING_URING_CMD_MULTISHOT (1U << 1)
27 void *data, uint16_t size,
28 uint16_t dev_path_len)
noexcept {
29 return detail::ctrl_cmd(
30 fd,
static_cast<int>(UBLK_U_CMD_GET_QUEUE_AFFINITY), dev_id, q_id, q_id,
31 reinterpret_cast<uint64_t
>(data), size, dev_path_len);
44 cpu_set_t *cpuset)
noexcept {
52inline auto get_dev_info(Fd fd, uint32_t dev_id,
void *data, uint16_t size,
53 uint16_t dev_path_len)
noexcept {
54 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_GET_DEV_INFO),
55 dev_id, -1, 0,
reinterpret_cast<uint64_t
>(data),
68 ublksrv_ctrl_dev_info *info)
noexcept {
80inline auto add_dev(Fd fd, ublksrv_ctrl_dev_info *info)
noexcept {
81 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_ADD_DEV),
83 reinterpret_cast<uint64_t
>(info),
sizeof(*info), 0);
90inline auto del_dev(Fd fd, uint32_t dev_id,
const char *dev_path,
91 uint16_t dev_path_len)
noexcept {
92 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_DEL_DEV), dev_id,
93 -1, 0,
reinterpret_cast<uint64_t
>(dev_path),
94 dev_path_len, dev_path_len);
103template <
typename Fd>
inline auto del_dev(Fd fd, uint32_t dev_id)
noexcept {
104 return del_dev(fd, dev_id,
nullptr, 0);
110template <
typename Fd>
111inline auto start_dev(Fd fd, uint32_t dev_id, int32_t daemon_pid,
112 const char *dev_path, uint16_t dev_path_len)
noexcept {
113 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_START_DEV), dev_id,
114 -1,
static_cast<uint64_t
>(daemon_pid),
115 reinterpret_cast<uint64_t
>(dev_path), dev_path_len,
126template <
typename Fd>
127inline auto start_dev(Fd fd, uint32_t dev_id, int32_t daemon_pid)
noexcept {
128 return start_dev(fd, dev_id, daemon_pid,
nullptr, 0);
134template <
typename Fd>
135inline auto stop_dev(Fd fd, uint32_t dev_id,
const char *dev_path,
136 uint16_t dev_path_len)
noexcept {
137 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_STOP_DEV), dev_id,
138 -1, 0,
reinterpret_cast<uint64_t
>(dev_path),
139 dev_path_len, dev_path_len);
148template <
typename Fd>
inline auto stop_dev(Fd fd, uint32_t dev_id)
noexcept {
149 return stop_dev(fd, dev_id,
nullptr, 0);
155template <
typename Fd>
156inline auto set_params(Fd fd, uint32_t dev_id,
const void *data, uint16_t size,
157 uint16_t dev_path_len)
noexcept {
158 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_SET_PARAMS), dev_id,
159 -1, 0,
reinterpret_cast<uint64_t
>(data), size,
170template <
typename Fd>
172 const ublk_params *params)
noexcept {
173 return set_params(fd, dev_id, params,
sizeof(*params), 0);
179template <
typename Fd>
180inline auto get_params(Fd fd, uint32_t dev_id,
void *data, uint16_t size,
181 uint16_t dev_path_len)
noexcept {
182 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_GET_PARAMS), dev_id,
183 -1, 0,
reinterpret_cast<uint64_t
>(data), size,
194template <
typename Fd>
195inline auto get_params(Fd fd, uint32_t dev_id, ublk_params *params)
noexcept {
196 return get_params(fd, dev_id, params,
sizeof(*params), 0);
202template <
typename Fd>
204 uint16_t dev_path_len)
noexcept {
205 return detail::ctrl_cmd(
206 fd,
static_cast<int>(UBLK_U_CMD_START_USER_RECOVERY), dev_id, -1, 0,
207 reinterpret_cast<uint64_t
>(dev_path), dev_path_len, dev_path_len);
216template <
typename Fd>
224template <
typename Fd>
226 const char *dev_path,
227 uint16_t dev_path_len)
noexcept {
228 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_END_USER_RECOVERY),
229 dev_id, -1,
static_cast<uint64_t
>(daemon_pid),
230 reinterpret_cast<uint64_t
>(dev_path), dev_path_len,
241template <
typename Fd>
243 int32_t daemon_pid)
noexcept {
252template <
typename Fd>
254 uint16_t dev_path_len)
noexcept {
255 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_GET_DEV_INFO2),
256 dev_id, -1, 0,
reinterpret_cast<uint64_t
>(data),
266template <
typename Fd>
268 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_GET_FEATURES), -1,
269 -1, 0,
reinterpret_cast<uint64_t
>(features),
270 UBLK_FEATURES_LEN, 0);
276template <
typename Fd>
278 uint16_t dev_path_len)
noexcept {
279 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_DEL_DEV_ASYNC),
280 dev_id, -1, 0,
reinterpret_cast<uint64_t
>(dev_path),
281 dev_path_len, dev_path_len);
290template <
typename Fd>
298template <
typename Fd>
300 const char *dev_path, uint16_t dev_path_len)
noexcept {
301 return detail::ctrl_cmd(
302 fd,
static_cast<int>(UBLK_U_CMD_UPDATE_SIZE), dev_id, -1, sectors,
303 reinterpret_cast<uint64_t
>(dev_path), dev_path_len, dev_path_len);
313template <
typename Fd>
314inline auto update_size(Fd fd, uint32_t dev_id, uint64_t sectors)
noexcept {
315 return update_size(fd, dev_id, sectors,
nullptr, 0);
321template <
typename Fd>
322inline auto quiesce_dev(Fd fd, uint32_t dev_id, uint64_t timeout_ms,
323 const char *dev_path, uint16_t dev_path_len)
noexcept {
324 return detail::ctrl_cmd(
325 fd,
static_cast<int>(UBLK_U_CMD_QUIESCE_DEV), dev_id, -1, timeout_ms,
326 reinterpret_cast<uint64_t
>(dev_path), dev_path_len, dev_path_len);
337template <
typename Fd>
338inline auto quiesce_dev(Fd fd, uint32_t dev_id, uint64_t timeout_ms)
noexcept {
339 return quiesce_dev(fd, dev_id, timeout_ms,
nullptr, 0);
345template <
typename Fd>
347 uint16_t dev_path_len)
noexcept {
348 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_TRY_STOP_DEV),
349 dev_id, -1, 0,
reinterpret_cast<uint64_t
>(dev_path),
350 dev_path_len, dev_path_len);
359template <
typename Fd>
367template <
typename Fd>
369 uint16_t size, uint16_t dev_path_len)
noexcept {
370 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_REG_BUF), dev_id,
371 -1, 0,
reinterpret_cast<uint64_t
>(data), size,
385template <
typename Fd>
387 const ublk_shmem_buf_reg *reg)
noexcept {
394template <
typename Fd>
396 const char *dev_path,
397 uint16_t dev_path_len)
noexcept {
398 return detail::ctrl_cmd(fd,
static_cast<int>(UBLK_U_CMD_UNREG_BUF), dev_id,
399 -1, buf_index,
reinterpret_cast<uint64_t
>(dev_path),
400 dev_path_len, dev_path_len);
411template <
typename Fd>
413 uint64_t buf_index)
noexcept {
421template <
typename Fd>
422inline auto fetch_req(Fd fd, uint16_t q_id, uint16_t tag, uint64_t buf_addr,
423 uint64_t sqe_addr)
noexcept {
424 return detail::io_cmd(fd,
static_cast<int>(UBLK_U_IO_FETCH_REQ), q_id, tag,
425 0, buf_addr, sqe_addr);
436template <
typename Fd>
437inline auto fetch_req(Fd fd, uint16_t q_id, uint16_t tag,
438 uint64_t buf_addr)
noexcept {
439 return fetch_req(fd, q_id, tag, buf_addr, 0);
446template <
typename Fd>
448 int32_t result, uint64_t buf_addr,
449 uint64_t sqe_addr)
noexcept {
450 return detail::io_cmd(fd,
static_cast<int>(UBLK_U_IO_COMMIT_AND_FETCH_REQ),
451 q_id, tag, result, buf_addr, sqe_addr);
465template <
typename Fd>
467 int32_t result, uint64_t buf_addr)
noexcept {
480template <
typename Fd>
482 uint64_t buf_addr)
noexcept {
483 return detail::io_cmd(fd,
static_cast<int>(UBLK_U_IO_NEED_GET_DATA), q_id,
484 tag, 0, buf_addr, 0);
497template <
typename Fd>
499 uint64_t buf_index)
noexcept {
500 return detail::io_cmd(fd,
static_cast<int>(UBLK_U_IO_REGISTER_IO_BUF), q_id,
501 tag, 0, buf_index, 0);
514template <
typename Fd>
516 uint64_t buf_index)
noexcept {
517 return detail::io_cmd(fd,
static_cast<int>(UBLK_U_IO_UNREGISTER_IO_BUF),
518 q_id, tag, 0, buf_index, 0);
532template <
typename Fd>
533inline auto prep_io_cmds(Fd fd, uint16_t q_id, uint16_t flags, uint16_t nr_elem,
534 uint8_t elem_bytes,
const void *elems,
535 uint32_t elems_len)
noexcept {
536 return detail::batch_io_cmd(fd,
static_cast<int>(UBLK_U_IO_PREP_IO_CMDS),
537 q_id, flags, nr_elem, elem_bytes,
538 reinterpret_cast<uint64_t
>(elems), elems_len);
554template <
typename Fd>
556 uint16_t nr_elem, uint8_t elem_bytes,
557 const void *elems, uint32_t elems_len)
noexcept {
558 return detail::batch_io_cmd(fd,
static_cast<int>(UBLK_U_IO_COMMIT_IO_CMDS),
559 q_id, flags, nr_elem, elem_bytes,
560 reinterpret_cast<uint64_t
>(elems), elems_len);
574template <
typename Fd,
typename MultiShotFunc>
576 uint16_t q_id, MultiShotFunc &&func)
noexcept {
577 return condy::async_uring_cmd_multishot(
578 static_cast<int>(UBLK_U_IO_FETCH_IO_CMDS), fd,
579 [=, bgid = buffers.bgid()](io_uring_sqe *sqe)
noexcept {
580 auto &b = reinterpret_cast<ublk_batch_io &>(sqe->cmd);
583 b.elem_bytes =
sizeof(uint16_t);
584 sqe->flags |= IOSQE_BUFFER_SELECT;
585 sqe->rw_flags |= IORING_URING_CMD_MULTISHOT;
586 sqe->buf_group = bgid;
588 condy::SelectBufferCQEHandler<condy::ProvidedBufferQueue>{&buffers},
589 std::forward<MultiShotFunc>(func));
Low-level io_uring command senders for ublk control and I/O commands.
Low-level io_uring command senders for ublk control and I/O commands.
auto need_get_data(Fd fd, uint16_t q_id, uint16_t tag, uint64_t buf_addr) noexcept
Copy the data of a write request into the user buffer after the driver returns UBLK_IO_RES_NEED_GET_D...
auto start_user_recovery(Fd fd, uint32_t dev_id, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of start_user_recovery().
auto get_features(Fd fd, uint64_t *features) noexcept
Get the feature flags supported by the ublk driver.
auto update_size(Fd fd, uint32_t dev_id, uint64_t sectors, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of update_size().
auto commit_and_fetch_req(Fd fd, uint16_t q_id, uint16_t tag, int32_t result, uint64_t buf_addr, uint64_t sqe_addr) noexcept
Overload of commit_and_fetch_req() with an explicit sqe->addr, used for automatic request buffer regi...
auto end_user_recovery(Fd fd, uint32_t dev_id, int32_t daemon_pid, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of end_user_recovery().
auto set_params(Fd fd, uint32_t dev_id, const void *data, uint16_t size, uint16_t dev_path_len) noexcept
Unprivileged version of set_params().
auto fetch_io_cmds(Fd fd, condy::ProvidedBufferQueue &buffers, uint16_t q_id, MultiShotFunc &&func) noexcept
Fetch I/O commands in multishot style into a provided buffer queue (UBLK_F_BATCH_IO).
auto quiesce_dev(Fd fd, uint32_t dev_id, uint64_t timeout_ms, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of quiesce_dev().
auto commit_io_cmds(Fd fd, uint16_t q_id, uint16_t flags, uint16_t nr_elem, uint8_t elem_bytes, const void *elems, uint32_t elems_len) noexcept
Commit a batch of completed I/O commands for a queue (UBLK_F_BATCH_IO).
auto unregister_io_buf(Fd fd, uint16_t q_id, uint16_t tag, uint64_t buf_index) noexcept
Unregister the buffer of an in-flight request from the io_uring buffer table after zero-copy I/O comp...
auto start_dev(Fd fd, uint32_t dev_id, int32_t daemon_pid, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of start_dev().
auto register_shm_buf(Fd fd, uint32_t dev_id, const void *data, uint16_t size, uint16_t dev_path_len) noexcept
Unprivileged version of register_shm_buf().
auto try_stop_dev(Fd fd, uint32_t dev_id, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of try_stop_dev().
auto register_io_buf(Fd fd, uint16_t q_id, uint16_t tag, uint64_t buf_index) noexcept
Register the buffer of an in-flight request into the io_uring buffer table for zero-copy I/O (UBLK_F_...
auto del_dev_async(Fd fd, uint32_t dev_id, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of del_dev_async().
auto unregister_shm_buf(Fd fd, uint32_t dev_id, uint64_t buf_index, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of unregister_shm_buf().
auto get_dev_info(Fd fd, uint32_t dev_id, void *data, uint16_t size, uint16_t dev_path_len) noexcept
Unprivileged version of get_dev_info().
auto stop_dev(Fd fd, uint32_t dev_id, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of stop_dev().
auto prep_io_cmds(Fd fd, uint16_t q_id, uint16_t flags, uint16_t nr_elem, uint8_t elem_bytes, const void *elems, uint32_t elems_len) noexcept
Prepare a batch of I/O commands for a queue (UBLK_F_BATCH_IO).
auto add_dev(Fd fd, ublksrv_ctrl_dev_info *info) noexcept
Add a new ublk device.
auto fetch_req(Fd fd, uint16_t q_id, uint16_t tag, uint64_t buf_addr, uint64_t sqe_addr) noexcept
Overload of fetch_req() with an explicit sqe->addr, used for automatic request buffer registration (U...
auto get_dev_info2(Fd fd, uint32_t dev_id, void *data, uint16_t size, uint16_t dev_path_len) noexcept
Get the device information of a ublk device, works both for privileged and unprivileged modes.
auto del_dev(Fd fd, uint32_t dev_id, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of del_dev().
auto get_params(Fd fd, uint32_t dev_id, void *data, uint16_t size, uint16_t dev_path_len) noexcept
Unprivileged version of get_params().
auto get_queue_affinity(Fd fd, uint32_t dev_id, uint16_t q_id, void *data, uint16_t size, uint16_t dev_path_len) noexcept
Unprivileged version of get_queue_affinity().
The main namespace of the ublk-cpp library.