From: Ming Lei <ming.lei@redhat.com>
To: Jens Axboe <axboe@kernel.dk>, linux-block@vger.kernel.org
Cc: Caleb Sander Mateos <csander@purestorage.com>,
Ming Lei <ming.lei@redhat.com>
Subject: [PATCH v2 00/10] ublk: add shared memory zero-copy support
Date: Tue, 31 Mar 2026 23:31:51 +0800 [thread overview]
Message-ID: <20260331153207.3635125-1-ming.lei@redhat.com> (raw)
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
next reply other threads:[~2026-03-31 15:32 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-31 15:31 Ming Lei [this message]
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-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-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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260331153207.3635125-1-ming.lei@redhat.com \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=csander@purestorage.com \
--cc=linux-block@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox