public inbox for linux-block@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/10] ublk: add shared memory zero-copy support
@ 2026-03-31 15:31 Ming Lei
  2026-03-31 15:31 ` [PATCH v2 01/10] ublk: add UBLK_U_CMD_REG_BUF/UNREG_BUF control commands Ming Lei
                   ` (11 more replies)
  0 siblings, 12 replies; 27+ messages in thread
From: Ming Lei @ 2026-03-31 15:31 UTC (permalink / raw)
  To: Jens Axboe, linux-block; +Cc: Caleb Sander Mateos, Ming Lei

Hello,

Add shared memory based zero-copy (UBLK_F_SHMEM_ZC) support for ublk.

The ublk server and its client share a memory region (e.g. memfd or
hugetlbfs file) via MAP_SHARED mmap. The server registers this region
with the kernel via UBLK_U_CMD_REG_BUF, which pins the pages and
builds a PFN maple tree. When I/O arrives, the driver looks up bio
pages in the maple tree — if they match registered buffer pages, the
data is used directly without copying.

Please see details on document added in patch 3.

Patches 1-4 implement the kernel side:
 - buffer register/unregister control commands with PFN coalescing,
   including read-only buffer support (UBLK_SHMEM_BUF_READ_ONLY)
 - PFN-based matching in the I/O path, with enforcement that read-only
   buffers reject non-WRITE requests
 - UBLK_F_SHMEM_ZC feature flag
 - eliminate permanent pages[] array from struct ublk_buf; the maple
   tree already stores PFN ranges, so pages[] becomes temporary

Patches 5-10 add kublk (selftest server) support and tests:
 - hugetlbfs buffer sharing (both kublk and fio mmap the same file)
 - null target and loop target tests with fio verify
 - filesystem-level test (ext4 on ublk, fio verify on a file)
 - read-only buffer registration test (--rdonly_shmem_buf)

Changes since V1:
 - rename struct ublk_buf_reg to struct ublk_shmem_buf_reg, add __u32
   flags field for extensibility, narrow __u64 len to __u32 (max 4GB
   per UBLK_SHMEM_ZC_OFF_MASK), remove __u32 reserved (patch 1)
 - add UBLK_SHMEM_BUF_READ_ONLY flag: pin pages without FOLL_WRITE,
   enabling registration of write-sealed memfd buffers (patch 1)
 - use backward-compatible struct reading: memset zero + copy
   min(header->len, sizeof(struct)) (patch 1)
 - reorder struct ublk_buf_range fields for better packing (16 bytes
   vs 24 bytes), change buf_index to unsigned short, add unsigned short
   flags to store per-range read-only state (patch 1)
 - enforce read-only buffer semantics in ublk_try_buf_match(): reject
   non-WRITE requests on read-only buffers since READ I/O needs to
   write data into the buffer (patch 2)
 - narrow struct ublk_buf::nr_pages to unsigned int, narrow struct
   ublk_buf_range::base_offset to unsigned int (patch 1)
 - add new patch 4: eliminate permanent pages[] array from struct
   ublk_buf — recover struct page pointers via pfn_to_page() from the
   maple tree during unregistration, saving 2MB per 1GB buffer
 - add UBLK_F_SHMEM_ZC to feat_map in kublk (patch 5)
 - add new patch 10: read-only buffer registration selftest with
   --rdonly_shmem_buf option on null target + hugetlbfs

Ming Lei (10):
  ublk: add UBLK_U_CMD_REG_BUF/UNREG_BUF control commands
  ublk: add PFN-based buffer matching in I/O path
  ublk: enable UBLK_F_SHMEM_ZC feature flag
  ublk: eliminate permanent pages[] array from struct ublk_buf
  selftests/ublk: add shared memory zero-copy support in kublk
  selftests/ublk: add UBLK_F_SHMEM_ZC support for loop target
  selftests/ublk: add shared memory zero-copy test
  selftests/ublk: add hugetlbfs shmem_zc test for loop target
  selftests/ublk: add filesystem fio verify test for shmem_zc
  selftests/ublk: add read-only buffer registration test

 Documentation/block/ublk.rst                  | 117 +++++
 drivers/block/ublk_drv.c                      | 403 +++++++++++++++++-
 include/uapi/linux/ublk_cmd.h                 |  79 ++++
 tools/testing/selftests/ublk/Makefile         |   5 +
 tools/testing/selftests/ublk/file_backed.c    |  38 ++
 tools/testing/selftests/ublk/kublk.c          | 347 ++++++++++++++-
 tools/testing/selftests/ublk/kublk.h          |  15 +
 tools/testing/selftests/ublk/test_common.sh   |  15 +-
 .../testing/selftests/ublk/test_shmemzc_01.sh |  72 ++++
 .../testing/selftests/ublk/test_shmemzc_02.sh |  68 +++
 .../testing/selftests/ublk/test_shmemzc_03.sh |  69 +++
 .../testing/selftests/ublk/test_shmemzc_04.sh |  72 ++++
 12 files changed, 1292 insertions(+), 8 deletions(-)
 create mode 100755 tools/testing/selftests/ublk/test_shmemzc_01.sh
 create mode 100755 tools/testing/selftests/ublk/test_shmemzc_02.sh
 create mode 100755 tools/testing/selftests/ublk/test_shmemzc_03.sh
 create mode 100755 tools/testing/selftests/ublk/test_shmemzc_04.sh

--
2.53.0


^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2026-04-08 15:28 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-31 15:31 [PATCH v2 00/10] ublk: add shared memory zero-copy support Ming Lei
2026-03-31 15:31 ` [PATCH v2 01/10] ublk: add UBLK_U_CMD_REG_BUF/UNREG_BUF control commands Ming Lei
2026-04-07 19:35   ` Caleb Sander Mateos
2026-04-08  2:23     ` Ming Lei
2026-04-08 15:20       ` Caleb Sander Mateos
2026-03-31 15:31 ` [PATCH v2 02/10] ublk: add PFN-based buffer matching in I/O path Ming Lei
2026-04-07 19:47   ` Caleb Sander Mateos
2026-04-08  2:36     ` Ming Lei
2026-04-08 15:28       ` Caleb Sander Mateos
2026-03-31 15:31 ` [PATCH v2 03/10] ublk: enable UBLK_F_SHMEM_ZC feature flag Ming Lei
2026-04-07 19:47   ` Caleb Sander Mateos
2026-04-08  2:50     ` Ming Lei
2026-03-31 15:31 ` [PATCH v2 04/10] ublk: eliminate permanent pages[] array from struct ublk_buf Ming Lei
2026-04-07 19:50   ` Caleb Sander Mateos
2026-04-08  2:58     ` Ming Lei
2026-03-31 15:31 ` [PATCH v2 05/10] selftests/ublk: add shared memory zero-copy support in kublk Ming Lei
2026-03-31 15:31 ` [PATCH v2 06/10] selftests/ublk: add UBLK_F_SHMEM_ZC support for loop target Ming Lei
2026-03-31 15:31 ` [PATCH v2 07/10] selftests/ublk: add shared memory zero-copy test Ming Lei
2026-03-31 15:31 ` [PATCH v2 08/10] selftests/ublk: add hugetlbfs shmem_zc test for loop target Ming Lei
2026-03-31 15:32 ` [PATCH v2 09/10] selftests/ublk: add filesystem fio verify test for shmem_zc Ming Lei
2026-03-31 15:32 ` [PATCH v2 10/10] selftests/ublk: add read-only buffer registration test Ming Lei
2026-04-07  2:38 ` [PATCH v2 00/10] ublk: add shared memory zero-copy support Ming Lei
2026-04-07 13:34   ` Jens Axboe
2026-04-07 19:29   ` Caleb Sander Mateos
2026-04-08  3:03     ` Ming Lei
2026-04-08 12:52       ` Jens Axboe
2026-04-07 13:44 ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox