ublk-cpp v0.0
Loading...
Searching...
No Matches
raw.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
9#include "ublk/detail/raw.hpp"
10
11#ifndef IORING_URING_CMD_MULTISHOT
12#define IORING_URING_CMD_MULTISHOT (1U << 1)
13#endif
14
15namespace ublk {
20namespace raw {
21
25template <typename Fd>
26inline auto get_queue_affinity(Fd fd, uint32_t dev_id, uint16_t q_id,
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);
32}
33
42template <typename Fd>
43inline auto get_queue_affinity(Fd fd, uint32_t dev_id, uint16_t q_id,
44 cpu_set_t *cpuset) noexcept {
45 return get_queue_affinity(fd, dev_id, q_id, cpuset, sizeof(*cpuset), 0);
46}
47
51template <typename Fd>
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),
56 size, dev_path_len);
57}
58
66template <typename Fd>
67inline auto get_dev_info(Fd fd, uint32_t dev_id,
68 ublksrv_ctrl_dev_info *info) noexcept {
69 return get_dev_info(fd, dev_id, info, sizeof(*info), 0);
70}
71
79template <typename Fd>
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),
82 info->dev_id, -1, 0,
83 reinterpret_cast<uint64_t>(info), sizeof(*info), 0);
84}
85
89template <typename Fd>
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);
95}
96
103template <typename Fd> inline auto del_dev(Fd fd, uint32_t dev_id) noexcept {
104 return del_dev(fd, dev_id, nullptr, 0);
105}
106
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,
116 dev_path_len);
117}
118
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);
129}
130
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);
140}
141
148template <typename Fd> inline auto stop_dev(Fd fd, uint32_t dev_id) noexcept {
149 return stop_dev(fd, dev_id, nullptr, 0);
150}
151
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,
160 dev_path_len);
161}
162
170template <typename Fd>
171inline auto set_params(Fd fd, uint32_t dev_id,
172 const ublk_params *params) noexcept {
173 return set_params(fd, dev_id, params, sizeof(*params), 0);
174}
175
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,
184 dev_path_len);
185}
186
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);
197}
198
202template <typename Fd>
203inline auto start_user_recovery(Fd fd, uint32_t dev_id, const char *dev_path,
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);
208}
209
216template <typename Fd>
217inline auto start_user_recovery(Fd fd, uint32_t dev_id) noexcept {
218 return start_user_recovery(fd, dev_id, nullptr, 0);
219}
220
224template <typename Fd>
225inline auto end_user_recovery(Fd fd, uint32_t dev_id, int32_t daemon_pid,
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,
231 dev_path_len);
232}
233
241template <typename Fd>
242inline auto end_user_recovery(Fd fd, uint32_t dev_id,
243 int32_t daemon_pid) noexcept {
244 return end_user_recovery(fd, dev_id, daemon_pid, nullptr, 0);
245}
246
252template <typename Fd>
253inline auto get_dev_info2(Fd fd, uint32_t dev_id, void *data, uint16_t size,
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),
257 size, dev_path_len);
258}
259
266template <typename Fd>
267inline auto get_features(Fd fd, uint64_t *features) noexcept {
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);
271}
272
276template <typename Fd>
277inline auto del_dev_async(Fd fd, uint32_t dev_id, const char *dev_path,
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);
282}
283
290template <typename Fd>
291inline auto del_dev_async(Fd fd, uint32_t dev_id) noexcept {
292 return del_dev_async(fd, dev_id, nullptr, 0);
293}
294
298template <typename Fd>
299inline auto update_size(Fd fd, uint32_t dev_id, uint64_t sectors,
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);
304}
305
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);
316}
317
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);
327}
328
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);
340}
341
345template <typename Fd>
346inline auto try_stop_dev(Fd fd, uint32_t dev_id, const char *dev_path,
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);
351}
352
359template <typename Fd>
360inline auto try_stop_dev(Fd fd, uint32_t dev_id) noexcept {
361 return try_stop_dev(fd, dev_id, nullptr, 0);
362}
363
367template <typename Fd>
368inline auto register_shm_buf(Fd fd, uint32_t dev_id, const void *data,
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,
372 dev_path_len);
373}
374
385template <typename Fd>
386inline auto register_shm_buf(Fd fd, uint32_t dev_id,
387 const ublk_shmem_buf_reg *reg) noexcept {
388 return register_shm_buf(fd, dev_id, reg, sizeof(*reg), 0);
389}
390
394template <typename Fd>
395inline auto unregister_shm_buf(Fd fd, uint32_t dev_id, uint64_t buf_index,
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);
401}
402
411template <typename Fd>
412inline auto unregister_shm_buf(Fd fd, uint32_t dev_id,
413 uint64_t buf_index) noexcept {
414 return unregister_shm_buf(fd, dev_id, buf_index, nullptr, 0);
415}
416
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);
426}
427
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);
440}
441
446template <typename Fd>
447inline auto commit_and_fetch_req(Fd fd, uint16_t q_id, uint16_t tag,
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);
452}
453
465template <typename Fd>
466inline auto commit_and_fetch_req(Fd fd, uint16_t q_id, uint16_t tag,
467 int32_t result, uint64_t buf_addr) noexcept {
468 return commit_and_fetch_req(fd, q_id, tag, result, buf_addr, 0);
469}
470
480template <typename Fd>
481inline auto need_get_data(Fd fd, uint16_t q_id, uint16_t tag,
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);
485}
486
497template <typename Fd>
498inline auto register_io_buf(Fd fd, uint16_t q_id, uint16_t tag,
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);
502}
503
514template <typename Fd>
515inline auto unregister_io_buf(Fd fd, uint16_t q_id, uint16_t tag,
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);
519}
520
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);
539}
540
554template <typename Fd>
555inline auto commit_io_cmds(Fd fd, uint16_t q_id, uint16_t flags,
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);
561}
562
574template <typename Fd, typename MultiShotFunc>
575inline auto fetch_io_cmds(Fd fd, condy::ProvidedBufferQueue &buffers,
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);
581 b = {};
582 b.q_id = q_id;
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;
587 },
588 condy::SelectBufferCQEHandler<condy::ProvidedBufferQueue>{&buffers},
589 std::forward<MultiShotFunc>(func));
590}
591
592} // namespace raw
593} // namespace ublk
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.
Definition raw.hpp:20
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...
Definition raw.hpp:481
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().
Definition raw.hpp:203
auto get_features(Fd fd, uint64_t *features) noexcept
Get the feature flags supported by the ublk driver.
Definition raw.hpp:267
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().
Definition raw.hpp:299
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...
Definition raw.hpp:447
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().
Definition raw.hpp:225
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().
Definition raw.hpp:156
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).
Definition raw.hpp:575
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().
Definition raw.hpp:322
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).
Definition raw.hpp:555
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...
Definition raw.hpp:515
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().
Definition raw.hpp:111
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().
Definition raw.hpp:368
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().
Definition raw.hpp:346
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_...
Definition raw.hpp:498
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().
Definition raw.hpp:277
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().
Definition raw.hpp:395
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().
Definition raw.hpp:52
auto stop_dev(Fd fd, uint32_t dev_id, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of stop_dev().
Definition raw.hpp:135
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).
Definition raw.hpp:533
auto add_dev(Fd fd, ublksrv_ctrl_dev_info *info) noexcept
Add a new ublk device.
Definition raw.hpp:80
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...
Definition raw.hpp:422
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.
Definition raw.hpp:253
auto del_dev(Fd fd, uint32_t dev_id, const char *dev_path, uint16_t dev_path_len) noexcept
Unprivileged version of del_dev().
Definition raw.hpp:90
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().
Definition raw.hpp:180
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().
Definition raw.hpp:26
The main namespace of the ublk-cpp library.
Definition ublk.hpp:21