Skip to content

SPDK v20.10: NVMe-oF multipath, NVMe ZNS, iSCSI login redirection

Choose a tag to compare
@tomzawadzki tomzawadzki released this 30 Oct 19:36
· 3 commits to v20.10.x since this release


New APIs spdk_accel_batch_cancel and spdk_idxd_batch_cancel were added to allow
cancelling a batch sequence.


A new spdk_bdev_part_base_construct_ext function has been added and the
spdk_bdev_part_base_construct has been deprecated. The
spdk_bdev_part_base_construct_ext function takes bdev name as an argument instead
of bdev structure to avoid a race condition that can happen when the bdev is being
removed between a call to get its structure based on a name and actually opening it.

Removed spdk_bdev_config_text function for bdev modules to report legacy config.


A new spdk_bdev_create_bs_dev_ext function has been added and spdk_bdev_create_bs_dev_from_desc
function has been deprecated.


Updated DPDK submodule to DPDK 20.08.


A new API spdk_mem_get_fd_and_offset was added to get file descriptor and offset for
a given virtual address.


Removed spdk_subsystem_config callback for submodules as part of legacy config removal.

Removed spdk_app_get_running_config function that printed configuration in legacy format,
and removed usr1_handler from struct spdk_app_opts callback that was used to call it.

Added SPDK thread scheduler framework which is used to rebalance load among CPU cores.
The scheduler implementation is pluggable and two schedulers are added first, static scheduler
and gscheduler scheduler.

static scheduler is used by default and does not reschedule threads and keeps the initial

CPU frequency governor framework and implementation are also added.
dpdk_governor is the first implementation and is based on rte_power library of DPDK.
gscheduler scheduler utilizes the CPU frequency governor.

Scheduler and governor frameworks are experimental features.


Bdev fio_plugin no longer supports legacy configuration files. Options spdk_conf and
spdk_json_conf have to point to valid JSON configuration.


Removed option to disable GPT probing via legacy configuration. Please use generic
bdev functionality to replicate the behavior. See bdev_set_options --disable-auto-examine
and bdev_examine RPC.


Updated intel-ipsec-mb submodule to v0.54


Updated ISA-L submodule to v2.29.0.


The iSCSI target supports iSCSI login redirection feature to achieve fault tolerance
and load balancing particularly in scale out iSCSI target system, which runs multiple
SPDK iSCSI targets.


A new API spdk_json_decode_object_relaxed was added to allow parsing json values
even if decoder for a given key is not found.

A new API spdk_json_free_object was added to free memory allocated by spdk_json_decode_object.


A log flag structure, spdk_log_register_flag, spdk_log_get_first_flag,
spdk_log_get_next_flag and macro SPDK_LOG_REGISTER_COMPONENT, have been added which
enable registering and interacting with log flags. Added SPDK_INFOLOG, SPDK_DEBUGLOG
and SPDK_LOGDUMP macros to display logs for specified log flag.

The log flags in the event framework -L and several SPDK applications has been enabled on
release builds of SPDK. On debug builds this option will additionally set
log print level to SPDK_LOG_DEBUG.

A new API spdk_log_enable_timestamps and new RPC log_enable_timestamps was added to
toggle log timestamps.


The contents of the log_rpc library have been moved to the event library. The log_rpc
library now no longer exists.

The contents of the app_rpc library have been moved to the event library. The app_rpc
library now no longer exists.

The contents of the bdev_rpc library have been moved to the bdev library. The app_rpc
library now no longer exists.

The bdevperf application now disables the zcopy API by default. Prior to this change,
bdevperf enabled using the zcopy API by default which caused a performance impact of
up to 25% on bdevs that don't natively support zcopy because the API emulates zero-copy
by allocating a buffer. The bdevperf -x param was renamed to -Z and the default
value changed to false. For bdevs that support zcopy, use the -Z flag to enable
using zcopy API.


Net framework intended for use by user-space TCP stacks was removed.


Zoned Namespace Command Set support has been added to NVMe driver, see nvme_zns.h for details.

New APIs, spdk_nvme_detach_async and spdk_nvme_detach_poll_async, have been added to
detach multiple controllers in parallel to mitigate lengthy shutdown notification of
a few NVMe SSDs.

New APIs, spdk_nvme_ns_get_ana_group_id and spdk_nvme_ns_get_ana_state, have been
added to get ANA group ID and ANA state of the given namespace, respectively.

If no specific command set is requested (by setting the command_set member in the
spdk_nvme_ctrlr_opts structure), SPDK will automatically select the most appropriate
command set based on what the controller supports.


A new API spdk_nvmf_subsystem_add_ns_ext has been added and the API spdk_nvmf_subsystem_add_ns
has been deprecated.

The NVMe-oF target now supports Asymmetric Namespace Access (ANA) Reporting to provide
multipath to NVMe-oF initiator.

Add no_wr_batching parameter to spdk_nvmf_transport_opts struct to disable
Work Requests batching in RDMA transport.

NVMf Target transports can now parse any additional JSON params in the nvmf_create_transport RPC
through the JSON context provided via spdk_nvmf_target_opts->transport_specific.

A new RPC nvmf_subsystem_set_options was added to allow transport specific options within subsystem.

A new API spdk_nvmf_transport_stop_listen_async was added to stop accepting new connections
at the provided address. nvmf_subsystem_remove_listener RPC now uses this function.

A new API spdk_nvmf_subsystem_disconnect_host was added to disconnect all connections
originating from the provided hostnqn. nvmf_subsystem_remove_host RPC now uses this function.


Updated OCF submodule to v20.03.1


New optional parameters, enable_placement_id and enable_quickack were added to the
sock_impl_set_options RPC.

A new RPC bdev_examine_bdev was added to allow users to examine a bdev explicitly.
It can be used only if bdev_auto_examine is set to false by the RPC bdev_set_options.

Add optional 'no_wr_batching' parameter to 'nvmf_create_transport' RPC method.

New RPCs, iscsi_target_node_set_redirect and iscsi_target_node_request_logout, have
been added, and a new optional parameter private has been added to the RPC
iscsi_create_portal_group to support iSCSI login redirection feature.

A new optional parameter ana_reporting was added to the RPC nvmf_create_subsystem, and
a new RPC nvmf_subsystem_listner_set_ana_state was added for ANA reporting.

New RPCs, nvmf_subsystem_get_listeners and nvmf_subsystem_get_qpairs, were added to
retrieve configuration of the NVMe-oF subsystem.


Two new APIs have been added spdk_scsi_dev_construct_ext and
spdk_scsi_dev_add_lun_ext that allow the upper layer(e.g. vhost-scsi) to
receive the notification when the scsi bdev has been resized.

The spdk_scsi_dev_construct and spdk_scsi_dev_add_lun eventually may be
deprecated and removed.


The enable_placement_id field was added in the struct spdk_sock_impl_opts to
make the placement_id feature configurable by users. The default setting is
not enabled.

The enable_quick_ack field was added in the struct spdk_sock_impl_opts to enable
or disable quick ack for the POSIX sock module. The default setting is not enabled.


fd_group is applied to support interrupt mode.
New APIs were added to support an experimental interrupt mode. This allows modules or
libraries to selectively register file descriptors that the spdk_thread can wait on,
as an alternative to polling. In v20.10, this functionality is enabled in a very small
subset of SPDK libraries and modules.


A new utility named fd_group was add. It is now
implemented by epoll on Linux platform. It can be used by
spdk_thread and reactor to implement interrupt mode.

Added spdk_bit_pool utility, see bit_pool.h for details.


SPDK has switched to DPDK's rte_vhost library since 19.07 release, removed the internal
rte_vhost library which is used for DPDK older than 19.05, removed the experimental vhost
nvme target which depends on the internal rte_vhost library.


Removed socket abstraction for VPP.