Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
6480201
ublk: define ublk_ch_batch_io_fops for the coming feature F_BATCH_IO
Jan 16, 2026
1bdbfee
ublk: prepare for not tracking task context for command batch
Jan 16, 2026
d310779
ublk: add new batch command UBLK_U_IO_PREP_IO_CMDS & UBLK_U_IO_COMMIT…
Jan 16, 2026
7f19ce1
ublk: handle UBLK_U_IO_PREP_IO_CMDS
Jan 16, 2026
f5a7b1f
ublk: handle UBLK_U_IO_COMMIT_IO_CMDS
Jan 16, 2026
11b573d
ublk: add io events fifo structure
Jan 16, 2026
94337b0
ublk: add batch I/O dispatch infrastructure
Jan 16, 2026
288f66c
ublk: add UBLK_U_IO_FETCH_IO_CMDS for batch I/O processing
Jan 16, 2026
6551690
ublk: refactor ublk_queue_rq() and add ublk_batch_queue_rq()
Jan 16, 2026
93ea470
ublk: abort requests filled in event kfifo
Jan 16, 2026
b82c90d
ublk: add new feature UBLK_F_BATCH_IO
Jan 16, 2026
15ef467
ublk: document feature UBLK_F_BATCH_IO
Jan 16, 2026
129acba
ublk: implement batch request completion via blk_mq_end_request_batch()
Jan 16, 2026
32be7d6
ublk: fix batch I/O recovery -ENODEV error
Jan 16, 2026
4ed97e2
selftests: ublk: fix user_data truncation for tgt_data >= 256
Jan 16, 2026
9376323
selftests: ublk: replace assert() with ublk_assert()
Jan 16, 2026
9a17c4f
selftests: ublk: add ublk_io_buf_idx() for returning io buffer index
Jan 16, 2026
4bed314
selftests: ublk: add batch buffer management infrastructure
Jan 16, 2026
beeceb3
selftests: ublk: handle UBLK_U_IO_PREP_IO_CMDS
Jan 16, 2026
da6f227
selftests: ublk: handle UBLK_U_IO_COMMIT_IO_CMDS
Jan 16, 2026
b0233ba
selftests: ublk: handle UBLK_U_IO_FETCH_IO_CMDS
Jan 16, 2026
6b021b8
selftests: ublk: increase timeout to 150 seconds
Jan 16, 2026
0b6f68a
selftests: ublk: add --batch/-b for enabling F_BATCH_IO
Jan 16, 2026
f5375ae
selftests: ublk: support arbitrary threads/queues combination
Jan 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 60 additions & 4 deletions Documentation/block/ublk.rst
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,12 @@ The following IO commands are communicated via io_uring passthrough command,
and each command is only for forwarding the IO and committing the result
with specified IO tag in the command data:

- ``UBLK_IO_FETCH_REQ``
Traditional Per-I/O Commands
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sent from the server IO pthread for fetching future incoming IO requests
- ``UBLK_U_IO_FETCH_REQ``

Sent from the server I/O pthread for fetching future incoming I/O requests
destined to ``/dev/ublkb*``. This command is sent only once from the server
IO pthread for ublk driver to setup IO forward environment.

Expand All @@ -278,7 +281,7 @@ with specified IO tag in the command data:
supported by the driver, daemons must be per-queue instead - i.e. all I/Os
associated to a single qid must be handled by the same task.

- ``UBLK_IO_COMMIT_AND_FETCH_REQ``
- ``UBLK_U_IO_COMMIT_AND_FETCH_REQ``

When an IO request is destined to ``/dev/ublkb*``, the driver stores
the IO's ``ublksrv_io_desc`` to the specified mapped area; then the
Expand All @@ -293,7 +296,7 @@ with specified IO tag in the command data:
requests with the same IO tag. That is, ``UBLK_IO_COMMIT_AND_FETCH_REQ``
is reused for both fetching request and committing back IO result.

- ``UBLK_IO_NEED_GET_DATA``
- ``UBLK_U_IO_NEED_GET_DATA``

With ``UBLK_F_NEED_GET_DATA`` enabled, the WRITE request will be firstly
issued to ublk server without data copy. Then, IO backend of ublk server
Expand Down Expand Up @@ -322,6 +325,59 @@ with specified IO tag in the command data:
``UBLK_IO_COMMIT_AND_FETCH_REQ`` to the server, ublkdrv needs to copy
the server buffer (pages) read to the IO request pages.

Batch I/O Commands (UBLK_F_BATCH_IO)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``UBLK_F_BATCH_IO`` feature provides an alternative high-performance
I/O handling model that replaces the traditional per-I/O commands with
per-queue batch commands. This significantly reduces communication overhead
and enables better load balancing across multiple server tasks.

Key differences from traditional mode:

- **Per-queue vs Per-I/O**: Commands operate on queues rather than individual I/Os
- **Batch processing**: Multiple I/Os are handled in single operations
- **Multishot commands**: Use io_uring multishot for reduced submission overhead
- **Flexible task assignment**: Any task can handle any I/O (no per-I/O daemons)
- **Better load balancing**: Tasks can adjust their workload dynamically

Batch I/O Commands:

- ``UBLK_U_IO_PREP_IO_CMDS``

Prepares multiple I/O commands in batch. The server provides a buffer
containing multiple I/O descriptors that will be processed together.
This reduces the number of individual command submissions required.

- ``UBLK_U_IO_COMMIT_IO_CMDS``

Commits results for multiple I/O operations in batch, and prepares the
I/O descriptors to accept new requests. The server provides a buffer
containing the results of multiple completed I/Os, allowing efficient
bulk completion of requests.

- ``UBLK_U_IO_FETCH_IO_CMDS``

**Multishot command** for fetching I/O commands in batch. This is the key
command that enables high-performance batch processing:

* Uses io_uring multishot capability for reduced submission overhead
* Single command can fetch multiple I/O requests over time
* Buffer size determines maximum batch size per operation
* Multiple fetch commands can be submitted for load balancing
* Only one fetch command is active at any time per queue
* Supports dynamic load balancing across multiple server tasks

It is one typical multishot io_uring request with provided buffer, and it
won't be completed until any failure is triggered.

Each task can submit ``UBLK_U_IO_FETCH_IO_CMDS`` with different buffer
sizes to control how much work it handles. This enables sophisticated
load balancing strategies in multi-threaded servers.

Migration: Applications using traditional commands (``UBLK_U_IO_FETCH_REQ``,
``UBLK_U_IO_COMMIT_AND_FETCH_REQ``) cannot use batch mode simultaneously.

Zero copy
---------

Expand Down
Loading
Loading