Releases: spdk/spdk
Release list
SPDK v26.05: NVMe KV support, JSON-RPC schema generation, JSON-RPC client batching
accel
Added spdk_accel_append_compare() API to append a compare operation to an acceleration
sequence. Block device drivers can use it to chain data integrity checks with the rest of their
accel pipeline.
bdev
Added spdk_bdev_get_nvme_csi() accessor and a matching CSI (Command Set Identifier) field on
struct spdk_bdev, so bdev modules can advertise which NVMe I/O command set a namespace uses and
upper layers like NVMe-oF can make routing decisions based on the command set without reaching
into module internals.
Added spdk_bdev_desc_hide_metadata(), spdk_bdev_io_hide_metadata() and spdk_bdev_io_get_block_size().
Together they let upper layers (NVMe-oF) make correct decisions about DIF check flag handling
and block size accounting when the bdev layer owns metadata insert/strip on a descriptor.
Added the bdev_get_histogram_borders RPC to dump histogram values into user-provided borders,
allowing callers to obtain only the ranges they care about without parsing the base64-encoded
output of the standard bdev_get_histogram RPC.
spdk_bdev_io_get_nvme_status() now translates the internal SPDK_BDEV_IO_STATUS_MISCOMPARE to
the correct NVMe Compare Failure status (SCT=0x02 Media Error, SC=0x85, 0x285) instead of a
generic Internal Error, so NVMe initiators receive the spec-defined code.
spdk_bdev_initialize(), spdk_bdev_finish(), spdk_bdev_register(), spdk_bdev_examine(),
spdk_bdev_unregister() and spdk_bdev_unregister_by_name() are now enforced on the app thread.
bdev_error
Added the error_sct and error_sc options to bdev_error_inject_error, so injected NVMe errors
can carry an exact Status Code Type and Status Code.
Added the bdev_error_resume_io RPC to release IOs queued by the pending error injection mode.
bdev_ftl
Removed the deprecated bdev_ftl_load and bdev_ftl_unload RPCs. Use bdev_ftl_create and
bdev_ftl_delete instead.
bdev_malloc
Implemented SPDK_BDEV_IO_TYPE_COMPARE for the malloc bdev. The compare itself is delegated to
the acceleration framework via spdk_accel_append_compare().
bdev_nvme
Added per-controller multipath configuration to the spdk_bdev_nvme_create() API and
bdev_nvme_attach_controller RPC via a new multipath_opts parameter exposing policy, selector
and min_io. The same fields were added to bdev_nvme_set_options so they can be configured
as global defaults that apply when an attach does not override them.
Added spdk_bdev_nvme_first_bdev_ctrlr(), spdk_bdev_nvme_next_bdev_ctrlr() and
spdk_bdev_nvme_ctrlr_get_name() APIs to iterate over the bdev_nvme controller groups, together
with spdk_bdev_nvme_ctrlr_first_ctrlr() and spdk_bdev_nvme_ctrlr_next_ctrlr() to walk the
underlying spdk_nvme_ctrlr instances within a group. The spdk_bdev_nvme_ctrlr type is now
exposed as an opaque handle in the public header.
Added spdk_bdev_nvme_ctrlr_get_opts() to retrieve the creation-time spdk_bdev_nvme_ctrlr_opts
(including the multipath options) for a controller.
spdk_bdev_nvme_set_multipath_policy() and the matching bdev_nvme_set_multipath_policy RPC are
deprecated and will be removed in v26.09. Use spdk_bdev_nvme_create() / bdev_nvme_attach_controller
with multipath options instead.
bdev_passthru
Added support for SPDK_BDEV_IO_TYPE_COMPARE, compare commands are forwarded to the underlying
base bdev via spdk_bdev_comparev_blocks().
bdev_raid
Added a clear_sb parameter to the bdev_raid_delete RPC to clear the superblock from base
bdevs when the raid bdev is deleted. The superblock is also cleared on a failed
bdev_raid_create.
build
Added --with-isal and --with-isal-crypto configure options to link against system-installed
ISA-L libraries instead of the in-tree submodules. The <isa-l/...> and <isa-l_crypto/...>
umbrella headers were promoted to the public SPDK include tree as include/spdk/isa-l.h and
include/spdk/isa-l-crypto.h.
fsdev
The current upstream fsdev library and its consumers are deprecated in preparation for a
wholesale replacement in v26.09. This includes the public APIs in include/spdk/fsdev.h and
include/spdk/fsdev_module.h, the fsdev event subsystem, the aio fsdev module
(fsdev_aio_create / fsdev_aio_delete RPCs and --with-aio-fsdev), the fuse_dispatcher
library (include/spdk/fuse_dispatcher.h), and the vfu_virtio_create_fs_endpoint RPC.
init
Promoted the subsystem registration APIs to the public header include/spdk/init.h:
struct spdk_subsystem, struct spdk_subsystem_depend, spdk_add_subsystem(),
spdk_add_subsystem_depend(), spdk_subsystem_init_next() and spdk_subsystem_fini_next(),
along with the SPDK_SUBSYSTEM_REGISTER() and SPDK_SUBSYSTEM_DEPEND() macros. Applications can
plug their own components into SPDK's initialization, teardown and config-dump system alongside
the built-in subsystems.
json
Added spdk_json_write_add_flags() to update write context flags after creation.
Added spdk_json_array_count() to count the elements of a decoded JSON array.
jsonrpc
Added a JSON-RPC client batch request API. spdk_jsonrpc_begin_batch() and
spdk_jsonrpc_end_batch() build a single batch and spdk_jsonrpc_begin_request() /
spdk_jsonrpc_end_request() may be called multiple times in batch mode to issue several
requests in a single send.
nvme
Removed the transport APIs poll_group_connect_qpair and poll_group_disconnect_qpair. None of
the transports did anything inside of these functions, and the model has been simplified such that
connections are only added or removed while disconnected.
Added spdk_nvme_nvm_ctrlr_get_data() API for NVM I/O Command Set Specific Identify Controller
Data.
Changed the NVME request timeout tracking - now the timeout includes the time the request spent
in the internal SPDK queues, before it was sent to the disk/network.
Added support for the NVMe Key Value (KV) command set. The new public header
include/spdk/nvme_kv.h exposes spdk_nvme_kv_store(), spdk_nvme_kv_retrieve(),
spdk_nvme_kv_delete(), spdk_nvme_kv_exist(), spdk_nvme_kv_list() and
spdk_nvme_kv_ns_get_data(). The KV-aware identify data structures are updated to the NVMe Key
Value Command Set Specification 1.3 and the controller initialization state machine now fetches
the KV Command Set specific identify data for both the controller and each KV namespace.
Added the _ext family of completion APIs that accept the command opcode so fabric
command-specific status codes are no longer confused with NVMe command-specific status codes:
spdk_nvme_cpl_get_status_string_ext(), spdk_nvme_print_completion_ext() and
spdk_nvme_qpair_print_completion_ext(). The non-_ext variants are deprecated and will be
removed in v26.09.
Added spdk_nvme_qpair_get_queue_depth() and spdk_nvme_qpair_is_admin_queue() helpers.
Added spdk_nvme_ctrlr_register_ns_attr_changed_callback() so consumers can react to the list of
changed namespace IDs published by the Changed Namespace List log page.
Updated spdk_nvme_cdata_ctratt bit definitions to NVMe 2.3, adding the MEM bit
("MDTS and Size Limits Exclude Metadata"). Old bit names will be removed in v26.09.
nvmf
Removed the deprecated spdk_nvmf_ctrlr_connect() API.
The behavior of spdk_nvmf_subsystem_disconnect_host has been changed. Previously, the function
could return a status before all queues were actually disconnected. In the current version, the
function will invoke the callback only after all disconnect operations have completed or the
provided timeout has been exceeded. If the function is called with the timeout set to 0, the
default timeout value equal to NVMF_CTRLR_RESET_SHN_TIMEOUT_IN_MS is used. The
nvmf_subsystem_remove_host JSON-RPC method also reflects the above behavior and now allows
configuring the timeout.
Added spdk_nvmf_subsystem_create_ext() and spdk_nvmf_subsystem_get_opts() APIs, replacing
several individual setters and getters with a single options struct. By using creation-time
options, the design makes it clear which settings are creation-time only and which can be
modified dynamically. spdk_nvmf_subsystem_create, spdk_nvmf_subsystem_set_sn,
spdk_nvmf_subsystem_set_mn, spdk_nvmf_subsystem_set_ana_reporting,
spdk_nvmf_subsystem_get_sn, spdk_nvmf_subsystem_get_mn, spdk_nvmf_subsystem_get_max_nsid,
spdk_nvmf_subsystem_get_max_namespaces, spdk_nvmf_subsystem_get_ana_reporting and
spdk_nvmf_subsystem_get_type are deprecated and will be removed in v26.09.
Added spdk_nvmf_subsystem_stop_for_destroy(), which stops a subsystem in a way that prevents it
from being started again, in preparation for destroy. Combined with the internal cleanup it allows
multiple nvmf_subsystem_delete RPCs for the same subsystem to be handled safely.
Parameters of nvmf_create_transport and the buffer caching logic have been updated. The
following parameters are deprecated and will be removed: buf-cache-size, num-shared-buffers.
New parameters to set the exact number of small or large buffers were added:
iobuf-small-cache-size and iobuf-large-cache-size. The transport now selects a buffer from a
pool based on IO size. The io_unit_size parameter is now a no-op and is also deprecated.
nvmf_create_subsystem RPC now uses the NVMe spec fields dmrsl (in logical blocks) and wzsl
(as the spec power-of-two unit) directly. The legacy max_discard_size_kib and
max_write_zeroes_size_kib parameters are deprecated and will be removed in v26.09. They are now
converted internally, which also fixes wrong limits on namespaces with non-512-byte block sizes.
Added target option Duplicate Host Policy (dup_host_policy). This introduces an enumeration
`spdk_nvmf_subsystem_dup_host_polic...
SPDK v26.01: NVMe 2.0 target support, NVMe target RDMA interrupt support
accel_ae4dma
Added a user-space driver with support for the AE4DMA (AMD EPYC 4th Generation
Direct Memory Access) offload engine. The AE4DMA user-space driver offloads memory copies to
the DMA engine in AMD Embedded EPYC processors. Added a new AE4DMA module to the Accel
Framework. To use the AE4DMA module, use the new RPC ae4dma_scan_accel_module.
accel_cuda
Added new acceleration framework module for Nvidia GPU devices allowing to offload XOR,
FILL and COPY operations. To enable the module configure --with-cuda and use the new
RPC cuda_scan_accel_module.
bdev
All aliases are now removed from the block device names list upon unregistration.
Added spdk_bdev_write_uncorrectable_blocks() API to write uncorrectable blocks to a bdev.
Added spdk_for_each_bdev_by_name() API to iterate over bdevs by their names.
Added names field to bdev_get_iostat RPC to allow obtaining statistics from multiple
bdevs at once.
Added SPDK_BDEV_RESET_STAT_ERROR mode to spdk_bdev_reset_stat_mode enum. In this mode,
only the I/O error stats are reset, leaving the rest of the stats unchanged.
Removed the deprecated spdk_bdev_io_get_aux_buf() and spdk_bdev_io_put_aux_buf() APIs.
bdev_aio
Disabled RWF_NOWAIT default flag usage - user needs to explicitly request to enable it using
--no-wait (nowait) option.
blobstore
Added spdk_bs_get_max_growable_size() API to get the maximum growable size of a blobstore.
spdk_bs_unload() now handles hot-removed devices by returning -EIO and invalidating
the blobstore pointer.
env_dpdk
Added spdk_env_dpdk_get_mem_stats() API to retrieve memory allocation statistics.
DPDK submodule was updated to DPDK 25.11.
event
Added new public API spdk_app_setup_trace() to set up SPDK tracing for applications.
nvme
Removed the spdk_nvme_qpair_get_optimal_poll_group() API. It was unused.
Removed the spdk_nvme_poll_group_get_fd() API. It was unused. An fd can still be obtained
by calling spdk_nvme_poll_group_get_fd_group() and then asking the fd_group for its fd.
nvmf
SPDK NVMe-oF target now supports all required NVMe 2.0 features.
Added oncs and fuses fields to spdk_nvmf_transport_opts structure, together with
masked_oncs and maksed_fuses in nvmf_create_transport RPC to selectively
disable Optional NVM Command Support and Fused Operation Support capabilities.
Added support for NVMe 2.0 mandatory Identify CNS 07h – Active Namespace ID list associated
with the specified I/O Command Set.
Added interrupt-driven mode support for NVMe-oF RDMA transport to reduce CPU polling overhead
and improve efficiency under low-load conditions, while preserving the existing polling model
for high-throughput workloads.
Introduced the API spdk_nvmf_set_custom_discovery_filter() to set up custom discovery filter.
Added support for preempt-and-abort mode of persistent reservations acquire command.
Added support for adding and deleting hosts from a discovery referral. New APIs include
spdk_nvmf_referral_add_host(), spdk_nvmf_referral_remove_host(),
spdk_nvmf_referral_set_allow_any_host(), spdk_nvmf_referral_get_allow_any_host(),
spdk_nvmf_referral_host_allowed(), spdk_nvmf_referral_get_first_host(),
spdk_nvmf_referral_get_next_host(), spdk_nvmf_tgt_get_first_referral(), and
spdk_nvmf_tgt_referral_get_next(), and spdk_nvmf_referral_get_trid().
python
Deprecate some boolean python cli arguments to use new modern argparse format instead.
sock
Introduced spdk_sock_initialize(), which may optionally be called before any use of the
sock APIs. It is automatically called by the SPDK app framework. spdk_sock_initialize() is
not thread safe and should be called only once. Subsequent calls with the same options will
succeed, but with different options will return -EALREADY.
Following APIs now return negative errno value on failure instead of -1 and setting errno:
spdk_sock_getaddr(), spdk_sock_close(), spdk_sock_flush(), spdk_sock_recv(),
spdk_sock_writev(), spdk_sock_readv(), spdk_sock_recv_next(),
spdk_sock_set_recvlowat(), spdk_sock_set_recvbuf(), spdk_sock_set_sendbuf(),
spdk_sock_group_add_sock(), spdk_sock_group_remove_sock(),
spdk_sock_group_provide_buf(), spdk_sock_group_poll(), spdk_sock_group_poll_count(),
spdk_sock_group_close(), spdk_sock_impl_get_opts(), spdk_sock_impl_set_opts(),
spdk_sock_set_default_impl(), spdk_sock_group_register_interrupt().
Added spdk_sock_group_get_interruptfd() API to get the interrupt file descriptor for a socket
group. This fd is suitable for use in APIs such as spdk_interrupt_register_for_events().
util
spdk_net_getaddr() returns negative errno value on failure instead of -1 and setting errno.
SPDK v25.09: NVMe 1.4 support in NVMe-oF target, NVMe-oF NSSR
bdev
spdk_bdev_get_preferred_write_alignment, spdk_bdev_get_preferred_write_granularity,
spdk_bdev_get_optimal_write_size, spdk_bdev_get_preferred_unmap_alignment and
spdk_bdev_get_preferred_unmap_granularity APIs were added.
bdev_compress
The deprecated bdev_compress module was removed.
bdev_null
Support was added to set the bdev's preferred write alignment, preferred write
granularity, optimal write size, preferred unmap alignment and preferred unmap
granularity. These can be set by users using new parameters to the bdev_null_create
RPC.
bdev_nvme
Add NVMe flush support to the bdev_nvme module. This support is optional and can be
enabled using the new enable_flush parameter to the bdev_nvme_set_options RPC.
The flush command is only sent to the namespace if the namespace reported that it
had a volatile write cache.
Support was added to set the bdev's preferred write alignment, preferred write
granularity, optimal write size, preferred unmap alignment and preferred unmap
granularity, if the NVMe namespace reports the associated values in its
IDENTIFY data.
bdev_rbd
Support was added for read-only RBD bdevs. Users can make an RBD bdev read-only
by using the -r or --readonly flag with the bdev_rbd_create RPC.
blobfs
The deprecated blobfs library was removed.
env_dpdk
The DPDK submodule was updated to DPDK 25.07.
Support was added for memory registration at a 4KB granularity.
The deprecated spdk_env_get_socket_id() and spdk_pci_device_get_socket_id()
APIs were removed. Users should use spdk_env_get_numa_id() and
spdk_pci_device_get_numa_id() instead.
nvme
Logging was significantly enhanced as part of this release. Transport address
is now shown for fabrics controllers. QP related log messages now include
information about the QP and its controller.
nvmf
(CVE-2025-57275) Fixed (8981ddb) an array-out-of-bounds access during update of registrants
for a namespace when PTPL (Persist through power loss) was enabled.
If number of registrants exceeded 16 (SPDK_NVMF_MAX_NUM_REGISTRANTS) memory after
the array ended could have been written with data provided in Reservation Register
command by the initiator. PTPL needed to be enabled explicitly, as it is disabled by default.
Affected NVMe-oF transports include TCP and RDMA NVMe-oF in SPDK NVMe-oF target.
Add NSSR support (NVMe Subsytem Reset) to NVMe-oF target. Once NSSR is issued - it is passed to all
underlying namespaces (bdevs). Currenly only bdevs with PCIe transport would handle NSSR.
See the NVMe Subsystem Reset (NSSR) section of nvmf.md for more information.
Passthrough handlers for vendor-specific admin commands were added to the NVMe-oF target.
They can be enabled using the optional vendor_specific parameter to the nvmf_set_config
RPC.
Vfio-user migration code was removed. This code was in a non-working state, and upstream
libvfio-user has moved to a new v2-style interface which is significantly different.
QEMU 10.1 has no live migration support currently, and when it does it will be v2-style
based. This allows SPDK to use latest vfio-user and its vfio-user migration support
is planned to be re-added at a later time.
A namespace's IDENTIFY data is now populated with the preferred write alignment,
preferred write granularity, optimal write size, preferred unmap alignment and
preferred unmap granularity if they were specified by the underlying bdev.
The nvmf target now reports support for NVMe version 1.4. To enable this upgrade,
improved NSID and log page offset validation was added to the target.
python
Moved all cli code inside the python package for easier generation and packaging.
Split large rpc python file into modules.
Deprecate python.spdk.rpc modules and use JSONRPCClient object directly.
reduce
The deprecated reduce library was removed.
rocksdb
The deprecated RocksDB plugin was removed.
sock
Simplified spdk_sock_[listen|connect] impl_name handling. Previously, if NULL was provided and the
connection or listen operation failed the code would continue checking other sock implementations.
This behavior is no longer necessary, as VPP sock module was removed. The remaining uring and posix
implementations both rely on network kernel stack and upcoming XLIO support shares the same
addressing. This legacy behavior complicates the implementation of asynchronous connect,
particularly when the socket object is returned immediately. Now, when NULL is provided, the default
implementation is selected and terminates on failure without iterating over other sock
implementations.
Changed the return behavior of spdk_sock_flush. The function now returns 0 on success, as relying
on the number of bytes returned was not recommended.
Added spdk_sock_connect_async to enable asynchronous connect operations.
thread
The spdk_io_channel_ref API was added to more efficiently take a reference to an
existing and known I/O channel.
util
The spdk_bit_pool_set_bit_allocated API was added to enable setting an spdk_bit_pool
to a previously known state.
SPDK v25.05.1: Maintenance LTS Release
nvmf
(CVE-2025-57275) Fixed (8981ddb) an array-out-of-bounds access during update of registrants
for a namespace when PTPL (Persist through power loss) was enabled.
If number of registrants exceeded 16 (SPDK_NVMF_MAX_NUM_REGISTRANTS) memory after
the array ended could have been written with data provided in Reservation Register
command by the initiator. PTPL needed to be enabled explicitly, as it is disabled by default.
Affected NVMe-oF transports include TCP and RDMA NVMe-oF in SPDK NVMe-oF target.
SPDK v25.05: NVMe PCIe interrupt mode, DIF insert/strip, mlx5 accel platform driver
accel_mlx5
Added mlx5 platform driver capable of executing sequences of RDMA + crypto operations in one go. It
utilizes UMR (User Memory Region) registration, which allows changing properties of memory keys,
which are then used by the NIC to perform the offload (e.g. encrypt/decrypt) while doing
RDMA_READ/RDMA_WRITE operations.
bdev
Added capability to insert/strip DIF from IOs in the bdev layer. This allows users to to rely on
the bdev layer to generate and verify the integrity of the data.
Added support for inserting or overwriting metadata buffers depending on the NVMe PRACT bits set in
spdk_bdev_ext_io_opts.
Added spdk_bdev_open_ext_v2() API allowing for more flexible additions of per-open options.
Added APIs to retrieve metadata configuration depending on the hide_metadata option.
Added option to reset stats in bdev_get_iostat RPC.
Added option to specify the granularity and min/max values when enabling histogram for a bdev. It
allows users to reduce the size of the histogram.
bdev_compress
Added support for UNMAP.
bdev_nvme
Added controller configuration consistency check, so all controllers created with the same name will
be forced to have consistent setting, either multipath or failover. No mixing of different -x
options will be allowed.
Changed default mode: if no -x option is specified in bdev_nvme_attach_controller RPC call,
the multipath mode will be assigned as a default.
Changed spdk_bdev_nvme_create API function, the multipath parameter was removed as it is
redundant to multipath field in spdk_bdev_nvme_ctrlr_opts structure passed as a parameter to
this function. To enable multipath, bdev_opts.multipath must be set to true. When
bdev_opts.multipath is set to false, failover mode is enabled.
Added public APIs spdk_bdev_nvme_get_opts and spdk_bdev_nvme_set_opts to get default bdev nvme
options and set them respectively.
Added public API spdk_bdev_nvme_delete to delete the specified NVMe controller or one of its paths.
blobstore
Added support for variable metadata page size.
env
Added 3 APIs to handle multiple interrupts for PCI device spdk_pci_device_enable_interrupts(),
spdk_pci_device_disable_interrupts(), and spdk_pci_device_get_interrupt_efd_by_index().
Added spdk_mem_get_numa_id() API returning the NUMA node ID for the specified memory buffer.
fsdev
Added spdk_fsdev_mount() and spdk_fsdev_umount() APIs, fsdev's equivalent of FUSE_INIT and
FUSE_DESTROY. Removed open_opts parameter from spdk_fsdev_open(), as these options are part
of spdk_fsdev_mount_opts.
fsdev_aio
Added option to skip read/write operations. When enabled, fsdev_aio works similarly to
bdev_null and immediately completes IOs without actually executing them. This option only changes
the behavior of READ and WRITE operations.
log
Added spdk_log_open_ext API allowing users to set custom open and close callbacks.
nvme
Added enable_interrupts option to spdk_nvme_ctrlr_opts. If set to true then interrupts may be
enabled during initialization. Make sure to check the resulting value after the attach step to
check for success. This mode is currently only supported for PCIe transport. This is only
supported within a primary SPDK process, and if enabled SPDK will not support secondary processes.
Added APIs spdk_nvme_qpair_get_fd() and spdk_nvme_ctrlr_get_admin_qp_fd() to retrieve the file
descriptor for an I/O and the admin queue pair of a given NVMe controller respectively.
These APIs accept spdk_event_handler_opts structure, and if specified the transport layer will
fill it out which can be used by the application to register interrupts on the queue pairs.
Added opts_size in spdk_nvme_io_qpair_opts structure to align it with other opts structures.
spdk_nvme_poll_group_create() now creates a fd group to manage interrupt events.
Two new APIs have been added to manage interrupt events in poll group.
spdk_nvme_poll_group_get_fd() retrieves the internal epoll file descriptor of the poll group.
spdk_nvme_poll_group_wait() waits for interrupt events on all the I/O queue pair file descriptors
in a poll group. When an interrupt event gets generated, it processes any outstanding completions on
the I/O queue pair with interrupts. These interrupt events are registered at the time of I/O queue
pair creation.
Added spdk_nvme_ctrlr_get_id function returning the ID of the NVMe controller.
Added spdk_nvme_poll_group_get_fd_group() API returning fd_group associated with an NVMe poll
group.
Added spdk_nvme_poll_group_set_interrupt_callback() API allowing users to register a callback to
be executed to handle events associated with qpair connection status.
nvmf
Added public API spdk_nvmf_send_discovery_log_notice to send discovery log page
change notice to client.
Added kas in spdk_nvmf_transport_opts struct. This field indicates the granularity of the
KATO (Keep Alive Timeout) in 100 millisecond units, and this field cannot be set to 0 to disable
the Keep Alive Timer feature.
Added min_kato in spdk_nvmf_transport_opts struct to set the minimum keep alive timeout value
in milliseconds.
Added hide_metadata option to nvmf_subsystem_add_ns RPC controlling the corresponding bdev's
hide_metadata option.
python
Renamed python binaries with - instead of _ spdk-rpc, spdk-sma and spdk-cli to be more platform
independent for Linux/Windows according to PyPI and hatch suggestions.
reduce
Added spdk_reduce_vol_get_info() to get the information for the compressed volume.
sock
A new internal field was added to spdk_sock_request, increasing its size and moving iovcnt and
user provided iov[] offsets by 8 bytes, which breaks ABI.
thread
Added spdk_interrupt_register_ext() API which can receive spdk_event_handler_opts structure.
This is to prevent any further expansion of spdk_interrupt_register() API.
Added spdk_thread_register_post_poller_handler() API to register a post poller handler. It aims
at improving doorbell management by ensuring that a doorbell is rang after submitting all requests,
without waiting for the next poll cycle.
Added support for fd_group-based interrupts. spdk_interrupt_register_fd_group() can be used to
register an interrupt listening on events from an fd_group.
util
Added spdk_fd_group_add_ext() API which can receive spdk_event_handler_opts structure. This is
to prevent any further expansion of spdk_fd_group_add() API.
Added spdk_fd_group_set_wrapper() API allowing users to set a callback to be executed when an
event is triggered prior to executing a callback associated with that event.
SPDK v24.09: fsdev, NVMe-oF TCP interrupt mode
accel
Added spdk_accel_submit_compress_ext() and spdk_accel_submit_decompress_ext() API. They differ
from the non-ext variants in that these functions allow users to specify a compression algorithm and
compression level.
Added spdk_accel_get_compress_level_range() to get the valid level range of a given compression
algorithm.
Added API to generate and verify DIX.
Added append version of dif_verify, dif_verify_copy, dif_generate, and dif_generate_copy.
Added support for lz4 compression.
bdev
spdk_bdev_io_get_aux_buf and spdk_bdev_io_put_aux_buf are deprecated and
will be removed in the 25.01 release. We do not believe these are in use currently.
bdev_compress
Added support for specifying compression algorithm and level.
bdev_nvme
Introduced new header file /module/bdev/nvme.h and added public APIs spdk_bdev_nvme_create,
spdk_bdev_nvme_set_multipath_policy and spdk_bdev_nvme_get_default_ctrlr_opts
to get connectivity and multipathing capabilities of bdev_nvme.
Added bdev_nvme_set_keys RPC to change DH-HMAC-CHAP keys and force reauthentication of all qpairs
of a controller.
dif
Each element in enum spdk_dif_pi_format was subtracted by 1 to match the definition
of the Protection Information Format in the NVMe specification. This is necessary change
but breaks ABI compatibility. Please recompile your application if you added code using
this enum of older SPDK.
dma
Added spdk_memory_domain_transfer_data() function to transfer data between two memory domains.
env
Added spdk_env_core_get_smt_cpuset() API to get the list of SMT sibling
cores for a given core ID.
Added spdk_pci_device_get_numa_id(), spdk_env_get_numa_id(), and SPDK_ENV_NUMA_ID_ANY to
replace socket_id with numa_id when referring to a NUMA node.
Added spdk_env_get_first_numa_id(), spdk_env_get_last_numa_id(), spdk_env_get_next_numa_id(),
and SPDK_ENV_FOREACH_NUMA_ID() API to iterate over available NUMA nodes in a system.
Added enforce_numa option to spdk_env_opts. This option forces all hugepage memory
allocations to allocate memory only from the specified NUMA node without trying to fallback to other
NUMA nodes if it fails.
env_dpdk
spdk_get_tid is added to get the tid of the current thread.
event
The framework_get_reactors RPC method supports getting pid and tid.
fsdev
Added the fsdev library providing a filesystem abstraction.
fuse_dispatcher
Added the fuse_dispatcher library that manages fsdevs and implements FUSE <-> fsdev API
translation.
idxd
Added spdk_idxd_submit_dix_generate() function to generate DIX using DSA.
nvme
Added spdk_nvme_ctrlr_set_keys(), spdk_nvme_ctrlr_authenticate(), and
spdk_nvme_qpair_authenticate() API to change the DH-HMAC-CHAP keys of a given controller and force
reauthentication on its qpairs.
nvmf
Added support for interrupt mode in the NVMe-of TCP transport.
Enable iobuf based queuing for nvmf requests when there is not enough free buffers available.
Perspective from the user of the spdk_nvmf_request_get_buffers() API is that whenever all iovecs
are allocated immediately then nothing changes compared to the previous implementation.
If iobuf does not have enough buffers then there are two flows now:
- if
req_get_buffers_doneis not set in thespdk_nvmf_transport_opsthen again, nothing
changes. All (if there were any) ioves are released and caller must try again later. - if callback was set then caller will be notified once all iovecs are allocated.
As requests waiting for the buffer might get aborted, another API to remove such request from
the iobuf queue is also added.
Added public API spdk_nvmf_subsystem_set_cntlid_range() to set controller ID range for a
subsystem.
Added nvmf_subsystem_set_keys RPC to change DH-HMAC-CHAP keys for a given subsystem/host pair
without having to remove and readd a host.
Added spdk_nvmf_subsystem_set_ns_ana_group() function to change ANA group ID of an active
namespace of a subsystem.
scheduler
Added framework_get_governor RPC to retrieve the power governor name,
power env and the frequencies available, frequency set to the cpu cores.
sock
New functions that allows to register interrupt for given socket group:
spdk_sock_group_register_interrupt() and spdk_sock_group_unregister_interrupt(). Both uses API
exposed by the thread.h, see below for details. Support implemented only for the POSIX and SSL
sockets.
thread
New function spdk_interrupt_register_for_events() build on top of spdk_fd_group_add_for_events().
See below for details.
util
New function spdk_fd_group_add_for_events() was added alongside the existing spdk_fd_group_add().
Difference is that new API allows for specifying a set of events to be monitored instead of default
SPDK_INTERRUPT_EVENT_IN.
Added API to calculate md5 hash.
SPDK v24.05: NVMe in-band authentication, keyring lib, blob shallow copy
accel
spdk_accel_get/set_opts() has changed to act more like spdk_bdev's variant.
bdev
Added spdk_bdev_get_nvme_ctratt() API to get controller attributes of bdev.
bdev_raid
Added support for interleaved metadata.
Added RAID1 I/O error handling.
Examining a bdev with RAID superblock now searches for other base bdevs that may be present.
Re-adding a removed base bdev with superblock will now begin rebuild on applicable RAID levels.
Base bdevs can now be added back if were removed while in configuring state.
RAID in configuring state will not be removed if the last base bdev is removed.
bdev_uring
Added bdev_uring_rescan RPC to allow rescaning the size of uring bdev.
blobstore
Added new API spdk_bs_blob_shallow_copy() to make a shallow copy from a blob to a blobstore device. Only clusters
allocated to the blob will be written on the device.
Added new APIs spdk_bs_blob_set_parent() and spdk_bs_blob_set_external_parent() to change the parent of an
existing lvol. With these new API a thin provisioned blob can become a clone of an existing snapshot
or of an existing external snapshot.
event
SPDK applications can now start with --wait-for-rpc and JSON configuration provided at the same time.
Struct spdk_app_opts was extended by json_data and json_data_size fields
allowing user to provide a buffer with JSON config as alternative to providing JSON config file path
(these fields are mutually exclusive).
init
Function spdk_subsystem_init_from_json_config() is deprecated and will be removed in 24.09 release.
Please use spdk_subsystem_load_config() instead.
iscsi
Added iscsi_get_stats RPC method to get stat information about all active connections.
Added iscsi_enable_histogram RPC method to enable or disable histogram for specified iSCSI target.
Added iscsi_get_histogram RPC method to get histogram for specified iSCSI target.
keyring
Added keyring library. Its purpose is to provide secure access to cryptographic keys from other
libraries. Prior to being used, keys need to be attached to the keyring using one of the modules,
which are responsible for retrieving keying material in a secure manner. Currently, there are two
keyring modules implemented: keyring_file (keys are stored in files on a filesystem) and
keyring_linux (based on Linux kernel keyring). The module interface is pluggable, so users can
implement their own keyring modules.
lvol
Added bdev_lvol_start_shallow_copy RPC to start a shallow copy of an lvol over a given bdev and
bdev_lvol_check_shallow_copy RPC to get the status of the operation.
These RPCs use the new API spdk_lvol_shallow_copy().
Added bdev_lvol_set_parent and bdev_lvol_set_parent_bdev RPC to change the parent of an existing lvol
with the use of the new APIs spdk_lvol_set_parent() and spdk_lvol_set_external_parent().
nvme
Added spdk_nvme_ctrlr_get_max_sges() API to retrieve maximum number of SGEs per request
for the given NVMe controller.
The NVMe driver now supports in-band authentication using the DH-HMAC-CHAP protocol. To enable it,
users need to specify keys in the bdev_nvme_attach_controller RPC. Additionally, it's possible to
limit the allowed digests and Diffie-Hellman groups via bdev_nvme_set_options.
nvmf
Added support for namespace masking using new C APIs spdk_nvmf_ns_add_host() and
spdk_nvmf_ns_remove_host() and RPCs nvmf_ns_add_host and nvmf_ns_remove_host.
Users must pass new --no-auto-visible parameter to nvmf_subsystem_add_ns RPC to allow
namespace masking to be controlled by these new RPCs.
Added spdk_nvmf_subsystem_get_ana_state() API to get current ANA state of
a particular ANA group ID.
Added support for enabling mDNS-based discovery of nvmf target for
TCP transport with the addition of nvmf_publish_mdns_prr and
nvmf_stop_mdns_prr RPCs.
The NVMe-oF target now supports in-band authentication using the DH-HMAC-CHAP protocol. The target
will request hosts to authenticate if they're configured to use DH-HMAC-CHAP keys. The keys can be
set in the nvmf_subsystem_add_host RPC. Additionally, it's possible to limit the allowed digests
and Diffie-Hellman groups via nvmf_set_config.
spdk_trace
spdk_trace has learned how to use the most recent trace file in /dev/shm when
the user has specified neither -f nor -s options. This is only available on
Linux since FreeBSD does not mount have a /dev/shm mount.
thread
Changed spdk_iobuf_get/set_opts() API to act more like spdk_bdev's variant.
trace
Merged struct spdk_trace_flags and struct spdk_trace_histories into
new struct spdk_trace_file. Also renamed spdk_get_trace_histories_size()
to spdk_get_trace_file_size().
SPDK v24.01: DIF in accel, RAID rebuild, Blobstore grow
accel
Added support for new operations for computing Data Integrity Field (DIF),
spdk_accel_submit_dif_verify(), spdk_accel_submit_dif_generate() and
spdk_accel_submit_dif_generate_copy().
Added spdk_accel_get_opcode_name() API that returns name of an operation.
Added spdk_accel_get_module() API that returns pointer to a module.
Added optional init() and fini() callbacks to spdk_accel_driver in order to allow
drivers to initialize and clean up resources by the driver.
accel_error
Added new error accel module that allows user to inject error to selected accel operations.
bdev
Added spdk_bdev_nvme_iov_passthru_md() API to allow sending larger passthru commands.
Added max_rw_size field to spdk_bdev structure allowing bdev modules to specify maximum
size of an I/O.
Added iobuf_small_cache_size and iobuf_large_cache_size parameters to
bdev_set_options RPC making iobuf use in bdev configurable.
bdev_raid
Added support for rebuild in raid1 and raid5f levels.
Added superblock argument to bdev_raid_create RPC to allow writing out raid metadata to
a superblock. It can be then re-created from examined base bdevs, without the need
to issue bdev_raid_create.
Added bdev_raid_add_base_bdev RPC to add a base bdevs to an existing raid bdev.
Added bdev_raid_set_options RPC that changes options for raid bdev module,
currently allows setting process_window_size_kb affecting background operations
like rebuild.
blobstore
Added spdk_bs_grow_live() and spdk_bdev_update_bs_blockcnt() API that can be used to
increase size of blobstore filling the underlying device without first closing the blobstore.
env
Added SPDK command line parameter --no-huge, which enables SPDK to run without hugepages.
event
Added SPDK command line parameter --interrupt-mode, which enables to run SPDK in interrupt
mode. Effective only if all components used in the application, support interrupt mode.
ftl
Added rpc_bdev_ftl_get_properties and bdev_ftl_set_property RPC with matching API calls,
to allow modification of FTL device properties.
idxd
Added spdk_idxd_submit_dif_check() and spdk_idxd_submit_dif_insert() API to support
new operations for computing Data Integrity Field (DIF).
json
Added spdk_json_write_uuid(), spdk_json_write_named_uuid() and spdk_json_decode_uuid()
to help with writing and decoding UUID.
nvme
A new transport option rdma_max_cq_size was added to limit indefinite growth of CQ size.
Added spdk_nvme_ctrlr_cmd_iov_raw_with_md() API to allow sending larger passthru commands.
nvmf
Added max_discard_size_kib and max_write_zeroes_size_kib to nvmf_create_subsystem RPC to set the
maximum discard size and maximum write zeroes size.
Added new optional --ana-state (or shortly -n) parameter to nvmf_subsystem_add_listener RPC.
Added public APIs spdk_nvmf_subsystem_get_ana_reporting() and spdk_nvmf_subsystem_set_ana_state(),
replacing the internal functions nvmf_subsystem_get_ana_reporting() and nvmf_subsystem_set_ana_state()
respectively.
Added support for NVMe-oF referrals in NVMe-oF target with addition of
spdk_nvmf_tgt_add_referral() and spdk_nvmf_tgt_remove_referral() API and nvmf_discovery_add_referral,
nvmf_discovery_remove_referral and nvmf_discovery_get_referrals RPC.
Added spdk_nvmf_set_custom_ns_reservation_ops() API allowing to register custom handlers for reservation
operations.
scsi
Added support for SPDK_SBC_WRITE_SAME_10 and SPDK_SBC_WRITE_SAME_16.
thread
Added iobuf_get_stats RPC and spdk_iobuf_get_stats() API to track iobuf use across components.
trace
Added spdk_trace_register_user_thread() to initialize trace environment and
spdk_trace_unregister_user_thread() to de-initialize trace environment
for a user created thread.
Modified spdk_trace_init() to take number of user created threads as a parameter.
ublk
Added ublk_recover_disk RPC to support recovering after restarting ublk target.
vhost
Added caw_iov field to struct spdk_scsi_task to support SBC-3 compare_and_write IO.
Added parameter delay to vhost_create_scsi_controller RPC which allows user to defer starting
the vhost-scsi controller until adding the scsi target is completed.
Added vhost_start_scsi_controller RPC to start vhost-scsi controller, it could be used to support
live recovery feature of vhost-scsi target.
SPDK v23.09: NVMe-oF TCP data digest chaining, JSON-RPC Go client, DIF/DIX CRC32/64
accel
Added spdk_accel_get_buf_align() API to get minimum buffer alignment to execute a given operation.
Added get_operation_info() callback for accel_modules to return constraints for a given operation.
bdev
Added spdk_bdev_open_async() API to allow asynchronous bdev open that waits for specified time
until the block device appears.
bdev_nvme
Added bdev_nvme_enable_controller and bdev_nvme_disable_controller RPC to enable and disable
NVMe controller. For NVMe multipath cntlid is used to select only one NVMe-oF controller.
Added cntlid field to bdev_nvme_reset_controller RPC to support resetting only one NVMe-oF
controller in multipath configuration.
bdev_raid
Added bdev_raid_remove_base_bdev RPC to remove a base bdev from existing raid bdev.
dpdk
Updated DPDK submodule to DPDK 23.07.
env
The phys_addr parameter in spdk_*_malloc() functions is now invalid. Passing non-NULL value
will return NULL from the functions. The parameter was deprecated in SPDK 19.04.
For retrieving physical addresses, spdk_vtophys() should be used instead.
go
Added JSON-RPC 2.0 client written in Go to ease communication with SPDK.
Please see the documentation at go/rpc/ and example at examples/go/.
init
Options for the JSON-RPC server initialization were added. The options are defined via the
spdk_rpc_opts structure and is passed to the existing API spdk_rpc_initialize() as a new
argument. The options include log_file and log_level.
intel-ipsec-mb
Updated intel-ipsec-mb submodule to v1.4.
jsonrpc
New APIs, spdk_jsonrpc_set_log_level and spdk_jsonrpc_set_log_file, were added to enable
logging JSON RPC calls history.
log
New APIs, spdk_flog and spdk_vflog, were added to write messages to the specified log file.
nvme
The spdk_nvme_accel_fn_table interface has been extended with callbacks allowing users to chain
multiple accel operations. Users can now send requests with an existing accel sequence by setting
the accel_sequence field in spdk_nvme_ns_cmd_ext_io_opts if the controller supports it (i.e.
sets the SPDK_NVME_CTRLR_ACCEL_SEQUENCE_SUPPORTED flag) and the user implements the necessary
spdk_nvme_accel_fn_table callbacks.
The NVMe bdev will now advertise support for accel sequences if the allow_accel_sequence flag is
set in bdev_nvme_set_options and the underlying controller also supports them.
The TCP transport will now calculate data digest using the accel sequence APIs if they're available.
Added spdk_nvme_qpair_is_connected() API to check the connection status.
nvmf
The spdk_nvmf_request::data field has been removed: instead, clients should set
->iov and ->iovcnt appropriately, as nvmf request APIs now expect any data
buffers to be described there. spdk_nvmf_request_get_data() has been removed.
transport field in listen_addresses of nvmf_get_subsystems RPC is deprecated.
trtype field should be used instead. transport field will be removed in 24.01 release.
Added spdk_nvmf_subsystem_add_listener_ext() API for accepting new connections on the provided
address, now allowing to specify additional options for the listener.
Deprecated spdk_nvmf_subsytem_any_listener_allowed() API (to be removed in 24.01) and replaced
with spdk_nvmf_subsystem_any_listener_allowed() API fixing the typo.
Added spdk_nvmf_subsystem_is_discovery() API to check whether a given susbystem is discovery
subsystem.
scripts
setup.sh now supports interactive mode for device selection and hugepage reservation.
Added backport.sh script that formalizes process of backporting commits from latest SPDK,
to specific release branches. Please see documentation.
thread
Added spdk_thread_is_app_thread() API to check if specified spdk_thread is the app thread.
util
Extended DIF support to CRC-32 and CRC-64 format of the Protection Information.
Added spdk_crc64_nvme() and spdk_crc32c_nvme(), CRC-64 and CRC-32C checksums compatible with
NVMe Protection Information.
SPDK v23.05: NVMe-oF/TCP TLS, Logical Volume External Snapshots
accel
Added API spdk_accel_submit_xor to perform XOR.
Configuration of mlx5_pci driver of accel_dpdk_cryptodev module was changed. Now key and key2
should have equal length and key size in hexlified form can be either 32 bytes for 128b XTS key or
64 bytes for 256b XTS key. Support of the wrapped crypto credentials mode for this driver is
dropped, only plain text mode is supported.
The accel library will now collect statistics on the number of executed operations and processed
bytes. These statistics can be retreived using the accel_get_stats RPC.
Added support for appending a crc32 calculation to an accel sequence.
bdev
A new API spdk_bdev_module_claim_bdev_desc was added. Unlike spdk_bdev_module_claim_bdev, this
function requires a bdev descriptor to be passed and the claim is automatically released when the
descriptor is closed. It allows bdev modules to claim bdevs as a single writer, multiple writers, or
multiple readers.
New APIs spdk_bdev_quiesce, spdk_bdev_unquiesce, spdk_bdev_quiesce_range and
spdk_bdev_unquiesce_range were added. These allow I/O to be quiesced on an entire bdev or
a specified LBA range.
Removed spdk_bdev_ext_io_opts from spdk_bdev_io and replaced it with fields that were missing in
spdk_bdev_io.
It is now possible to submit an I/O with an associated accel sequence. All operations in such
sequence will be executed prior to sending the I/O (writes) or after its completion (reads).
env
New functions spdk_env_get_main_core and spdk_env_get_cpuset were added.
It is now possible to run applications on cores with IDs greater than 128 by passing a core map
using the --lcores parameter.
examples
examples/nvme/perf application now accepts --use-every-core parameter that changes
the existing worker and namespace association logic to access every namespace from each worker.
This replicates behavior of bdevperf application when -C option is provided.
gpt
GPT bdevs now use the GPT Unique Partition ID as the bdev's UUID.
idxd
Removed the SPDK_IDXD_FLAG_PERSISTENT flag.
lvol
New API spdk_lvol_iter_immediate_clones was added to iterate the clones of an lvol.
New APIs spdk_lvol_get_by_uuid and spdk_lvol_get_by_names to get lvols by the lvol's UUID or
lvstore and lvol names.
New bdev_lvol_get_lvols RPC to list logical volumes. This provides information about logical
volumes without providing information about the bdevs. It is useful for listing the lvols
associated with specific lvol stores and for listing lvols that are degraded and have no
associated bdev.
Added support for external snapshots making it possible to create clones of any (including non-lvol)
bdev. Users can create such clones using the bdev_lvol_clone_bdev RPC.
nvme
New API spdk_nvme_ns_get_format_index was added to calculate the exact format index, that
was used to format the namespace.
Added two new APIs spdk_nvme_ns_cmd_io_mgmt_recv and spdk_nvme_ns_cmd_io_mgmt_send to
receive and send the I/O management commands.
nvmf
New spdk_nvmf_request_copy_to/from_buf() APIs have been added, which support
iovecs, unlike the deprecated spdk_nvmf_request_get_data().
Two functions related to Asynchronous Event and error handling have been made public:
spdk_nvmf_ctrlr_async_event_error_event,spdk_nvmf_ctrlr_abort_aer.
New spdk_nvmf_transport_create_async was added, it accepts a callback and callback argument.
spdk_nvmf_transport_create is marked deprecated.
Parameters cb_fn and ctx of spdk_nvmf_qpair_disconnect API are deprecated. These parameters
will be removed in 23.09 release.
Added a secure_channel parameter to the nvmf_subsystem_add_listener RPC. When true, all
connections established via this listener will immediately attempt to establish a secure channel,
prior to any authentication. Only valid for the TCP transport.
Added two optional transport module callbacks: subsystem_add_host() and subsystem_remove_host().
These functions will notify a transport about adding/removing hosts' access.
TLS PSK identity is now generated from subsystem NQN and host NQN. PSK interchange format is now
expected as input, when configuring TLS in SPDK. TLS feature is considered experimental.
part
New API spdk_bdev_part_construct_ext is added and allows the bdev's UUID to be specified.
sock
Added a zero copy receive interface allowing users to provide buffers to a socket group (via
spdk_sock_group_provide_buf()), which will then get filled with the next portions of the stream on
each socket. After that, pointer to the buffer holding the next part of the data can be obtained
using spdk_sock_recv_next().
Added a callback get_key() to spdk_sock_impl_opts structure.
New function spdk_sock_get_impl_name() was added to retrieve current socket implementation name.
thread
Added two new APIs spdk_thread_bind and spdk_thread_is_bound to bind or unbind spdk_thread
to its current CPU core, and check bound status.
ublk
Enabled support for UBLK_F_NEED_GET_DATA. The buffers are no longer pre-allocated during
initialization, but are allocated on-demand. Additionally, they're now allocated from the iobuf
buffer pools.
util
New APIs spdk_uuid_is_null and spdk_uuid_set_null were added to compare and
set UUID to NULL value.
Added new functions, spdk_fd_group_{nest,unnest}, providing efficient way of adding one
fd_group's file descriptors to another fd_group.