[PATCH v2 0/8] ublk: io_desc optimizations

Caleb Sander Mateos posted 8 patches 1 month, 4 weeks ago
drivers/block/ublk_drv.c                     | 261 ++++++++++---------
include/uapi/linux/ublk_cmd.h                |   5 +-
tools/testing/selftests/ublk/Makefile        |   1 +
tools/testing/selftests/ublk/kublk.c         |  30 ++-
tools/testing/selftests/ublk/kublk.h         |   6 +-
tools/testing/selftests/ublk/test_loop_08.sh |  25 ++
6 files changed, 188 insertions(+), 140 deletions(-)
create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh
[PATCH v2 0/8] ublk: io_desc optimizations
Posted by Caleb Sander Mateos 1 month, 4 weeks ago
This series is based on the "ublk: harden user buffer handling" series.

ublk passes the parameters of incoming I/O in memory shared between the
kernel ublk driver and userspace ublk server in struct ublksrv_io_desc.

The thread submitting the ublk I/O writes to the io_desc, while the ublk
server thread handling the I/O reads the io_desc. This basically
guarantees a cache miss on both threads for each ublk I/O. Avoid the
cache misses by writing the io_desc on the server thread in the kernel
before dispatching the I/O to userspace.

The size of each io_desc is currently fixed to 24 bytes, which has been
an obstacle to extending it with additional fields [1]. Additionally,
with multiple ublk server threads handling I/Os from the same ublk queue
(possible with UBLK_F_PER_IO_DAEMON or UBLK_F_BATCH_IO), false sharing
results from adjacent io_descs sharing the same cache line. Add a
UBLK_F_IO_DESC_SIZE feature allowing the ublk server to increase the
size of the io_descs for its ublk devices.

[1]: https://lore.kernel.org/linux-block/aV8QfvaNO5P6vOs6@fedora/

v2:
- Cap io_desc_size arbitrarily at 256 (Ming)
- Add kublk list support, selftest (Ming)
- Add Reviewed-by tags, Suggested-by tag (Ming)

v1: https://lore.kernel.org/linux-block/20260729012951.3744582-1-csander@purestorage.com/

Caleb Sander Mateos (8):
  ublk: consistently use u16 for queue and tag numbers
  ublk: remove struct ublk_zoned_report_desc's operation field
  ublk: split request validation from io_desc init
  ublk: initialize io_desc on daemon task
  ublk: add UBLK_F_IO_DESC_SIZE
  selftests: ublk: add support for --io_desc_size
  selftests: ublk: add UBLK_F_IO_DESC_SIZE test
  ublk: lift checks out of ublk_{,un}map_io()

 drivers/block/ublk_drv.c                     | 261 ++++++++++---------
 include/uapi/linux/ublk_cmd.h                |   5 +-
 tools/testing/selftests/ublk/Makefile        |   1 +
 tools/testing/selftests/ublk/kublk.c         |  30 ++-
 tools/testing/selftests/ublk/kublk.h         |   6 +-
 tools/testing/selftests/ublk/test_loop_08.sh |  25 ++
 6 files changed, 188 insertions(+), 140 deletions(-)
 create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh

-- 
2.54.0
Re: [PATCH v2 0/8] ublk: io_desc optimizations
Posted by Jens Axboe 1 month, 4 weeks ago
On Mon, 03 Aug 2026 15:14:32 -0600, Caleb Sander Mateos wrote:
> This series is based on the "ublk: harden user buffer handling" series.
> 
> ublk passes the parameters of incoming I/O in memory shared between the
> kernel ublk driver and userspace ublk server in struct ublksrv_io_desc.
> 
> The thread submitting the ublk I/O writes to the io_desc, while the ublk
> server thread handling the I/O reads the io_desc. This basically
> guarantees a cache miss on both threads for each ublk I/O. Avoid the
> cache misses by writing the io_desc on the server thread in the kernel
> before dispatching the I/O to userspace.
> 
> [...]

Applied, thanks!

[1/8] ublk: consistently use u16 for queue and tag numbers
      commit: f510198855b6ddac0ffe62684dc407c56d3e0f24
[2/8] ublk: remove struct ublk_zoned_report_desc's operation field
      commit: 3a00b782a7b63b1876261ab883e1d8e1aa0e09fb
[3/8] ublk: split request validation from io_desc init
      commit: 8c76625ff9360cbe9ce0c47a624877aea14b3499
[4/8] ublk: initialize io_desc on daemon task
      commit: 735409f58b3da45094f2dfd7c18fb9e1937431f1
[5/8] ublk: add UBLK_F_IO_DESC_SIZE
      commit: 5c0958d80190822c4614ca00478d9acd9671bba6
[6/8] selftests: ublk: add support for --io_desc_size
      commit: fc01b96d74b3a9eec2b558d49ec9f5176473766a
[7/8] selftests: ublk: add UBLK_F_IO_DESC_SIZE test
      commit: d61d0f95e686be015cfaf193c0ae15156d1a0cc4
[8/8] ublk: lift checks out of ublk_{,un}map_io()
      commit: a8a79eba22dc4c11f2877bcf9e8557f6d95541ac

Best regards,
-- 
Jens Axboe