SPDK v26.05: NVMe KV support, JSON-RPC schema generation, JSON-RPC client batching
On behalf of the SPDK community, I’m proud to announce the release of SPDK v26.05!
This release brings several major features and improvements:
- NVMe Key-Value (KV) command set: NVMe driver gained support for the KV command set.
- JSON-RPC schema generation: JSON schema is now the source of truth for most RPC parameter decoders, helpers and Python CLI help text.
- JSON-RPC client batching: Clients can now issue multiple requests in a single send.
- NVMe-oF Duplicate Host Policy: New target option provides a basic IO fencing mechanism by restricting hostid reuse across controllers.
- Global default multipath configuration: bdev_nvme now accepts global multipath defaults (with optional per-controller overrides at attach time), so users no longer have to set multipath policy after every attach.
- Trace shared-memory layout refactor:
spdk_trace_fileis now a sequence of typed sections with a section table, external readers that depend on the old layout must be rebuilt. - Per-IO-size buffer pool selection: The NVMe-oF transport now selects a buffer from a pool based on IO size, letting a large IO use one large buffer instead of many small ones, improving bandwidth and latency for large IOs.
- NVMe spec compliance for DSM and Write Zeroes limits: bdev_nvme now respects controller-advertised DMRSL/DMRL/WZSL and transparently splits oversized I/O, the NVMe-oF target reports DMRL/DMRSL/DMSL as a coherent triple and stops rejecting Write Zeroes above WZSL with INVALID_FIELD.
- NUMA-aware vfio-user transport: The transport now assigns a NUMA node ID to each endpoint, requires subsystem listeners and namespaces to match it, and steers new qpairs to poll groups on the same NUMA node.
- Continued bdev and bdev_nvme thread synchronization cleanup: Removed another dozen locks and formalized an app-thread contract, building on the synchronization work from v26.01.
- Smarter namespace hotplug: Namespace Attribute Changed AERs now drive re-identification from the Changed Namespace List log page instead of a full Identify Active Namespace enumeration.
You can view the full changelog here. Deprecation notices for users upgrading from previous releases are available here.
New Contributors
This release includes 658 commits from 59 authors, with over 37k lines of code changed.
We’d especially like to recognize our first-time contributors:
- Alexey Alyaev
- Arsenii Ermilov
- Denys Hlushkov
- Pengpeng Hou
- Lukasz Kornicki
- Pablo de Lara
- Ligj Linn
- Max Makarov
- Sri Nishanth Molleti
- Scott Morris
- Rui Oliveira
- Jeff Olivier
- Prakhar Pandey
- Puspak Sahu
- Rafal Szczepaniak
- Yuan Xin
Many thanks to everyone for your contributions, participation, and effort!