mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
ublk: document auto buffer registration(UBLK_F_AUTO_BUF_REG)
Document recently merged feature auto buffer registration(UBLK_F_AUTO_BUF_REG). Cc: Caleb Sander Mateos <csander@purestorage.com> Signed-off-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20250611085632.109719-1-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
4bb08cf974
commit
ff20c51648
1 changed files with 75 additions and 0 deletions
|
@ -352,6 +352,81 @@ For reaching best IO performance, ublk server should align its segment
|
||||||
parameter of `struct ublk_param_segment` with backend for avoiding
|
parameter of `struct ublk_param_segment` with backend for avoiding
|
||||||
unnecessary IO split, which usually hurts io_uring performance.
|
unnecessary IO split, which usually hurts io_uring performance.
|
||||||
|
|
||||||
|
Auto Buffer Registration
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The ``UBLK_F_AUTO_BUF_REG`` feature automatically handles buffer registration
|
||||||
|
and unregistration for I/O requests, which simplifies the buffer management
|
||||||
|
process and reduces overhead in the ublk server implementation.
|
||||||
|
|
||||||
|
This is another feature flag for using zero copy, and it is compatible with
|
||||||
|
``UBLK_F_SUPPORT_ZERO_COPY``.
|
||||||
|
|
||||||
|
Feature Overview
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This feature automatically registers request buffers to the io_uring context
|
||||||
|
before delivering I/O commands to the ublk server and unregisters them when
|
||||||
|
completing I/O commands. This eliminates the need for manual buffer
|
||||||
|
registration/unregistration via ``UBLK_IO_REGISTER_IO_BUF`` and
|
||||||
|
``UBLK_IO_UNREGISTER_IO_BUF`` commands, then IO handling in ublk server
|
||||||
|
can avoid dependency on the two uring_cmd operations.
|
||||||
|
|
||||||
|
IOs can't be issued concurrently to io_uring if there is any dependency
|
||||||
|
among these IOs. So this way not only simplifies ublk server implementation,
|
||||||
|
but also makes concurrent IO handling becomes possible by removing the
|
||||||
|
dependency on buffer registration & unregistration commands.
|
||||||
|
|
||||||
|
Usage Requirements
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
1. The ublk server must create a sparse buffer table on the same ``io_ring_ctx``
|
||||||
|
used for ``UBLK_IO_FETCH_REQ`` and ``UBLK_IO_COMMIT_AND_FETCH_REQ``. If
|
||||||
|
uring_cmd is issued on a different ``io_ring_ctx``, manual buffer
|
||||||
|
unregistration is required.
|
||||||
|
|
||||||
|
2. Buffer registration data must be passed via uring_cmd's ``sqe->addr`` with the
|
||||||
|
following structure::
|
||||||
|
|
||||||
|
struct ublk_auto_buf_reg {
|
||||||
|
__u16 index; /* Buffer index for registration */
|
||||||
|
__u8 flags; /* Registration flags */
|
||||||
|
__u8 reserved0; /* Reserved for future use */
|
||||||
|
__u32 reserved1; /* Reserved for future use */
|
||||||
|
};
|
||||||
|
|
||||||
|
ublk_auto_buf_reg_to_sqe_addr() is for converting the above structure into
|
||||||
|
``sqe->addr``.
|
||||||
|
|
||||||
|
3. All reserved fields in ``ublk_auto_buf_reg`` must be zeroed.
|
||||||
|
|
||||||
|
4. Optional flags can be passed via ``ublk_auto_buf_reg.flags``.
|
||||||
|
|
||||||
|
Fallback Behavior
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If auto buffer registration fails:
|
||||||
|
|
||||||
|
1. When ``UBLK_AUTO_BUF_REG_FALLBACK`` is enabled:
|
||||||
|
- The uring_cmd is completed
|
||||||
|
- ``UBLK_IO_F_NEED_REG_BUF`` is set in ``ublksrv_io_desc.op_flags``
|
||||||
|
- The ublk server must manually deal with the failure, such as, register
|
||||||
|
the buffer manually, or using user copy feature for retrieving the data
|
||||||
|
for handling ublk IO
|
||||||
|
|
||||||
|
2. If fallback is not enabled:
|
||||||
|
- The ublk I/O request fails silently
|
||||||
|
- The uring_cmd won't be completed
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
- Requires same ``io_ring_ctx`` for all operations
|
||||||
|
- May require manual buffer management in fallback cases
|
||||||
|
- io_ring_ctx buffer table has a max size of 16K, which may not be enough
|
||||||
|
in case that too many ublk devices are handled by this single io_ring_ctx
|
||||||
|
and each one has very large queue depth
|
||||||
|
|
||||||
References
|
References
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue