1# Changelog 2 3## v23.01: (Upcoming Release) 4 5### accel 6 7New library isa-l-crypto has been added, it is used by accel library in crypto operations. 8 9New functions `spdk_accel_submit_encrypt` and `spdk_accel_submit_decrypt` were added. 10 11New accel module `dpdk_cryptodev` has been added. It uses DPDK crypto PMD and support encrypt and 12decrypt operations. New RPC `dpdk_cryptodev_scan_accel_module` has been added to enable this accel module. 13 14New accel module `mlx5` was added. It implements crypto operations, enabled when SPDK is configured with 15RDMA provider is mlx5_dv and crypto support. 16 17### bdev 18 19Added RPCs bdev_nvme_start_mdns_discovery, bdev_nvme_get_mdns_discovery_info and 20bdev_nvme_stop_mdns_discovery to perform Avahi based mDNS discovery service, 21as per NVMe TP 8009 - Automated Discovery of Ethernet Discovery Controllers. 22 23Both of interleaved and separated metadata are now supported by the malloc bdev module. 24 25Protection information is now supported by the malloc bdev module. 26 27A new API `spkd_bdev_part_submit_request_ext` was added to specify a custom completion callback. 28 29vbdev_crypto is updated to use accel framework instead of DPDK PMDs. 30 31### scheduler 32 33Changing scheduler from dynamic back to static is no longer possible, 34as there is no way of saving original SPDK thread distribution on reactors. 35 36### bdev 37 38New APIs `spdk_bdev_for_each_channel` and `spdk_bdev_for_each_channel_continue` and 39associated function pointers were added to iterate each channel of the required bdev. 40 41The RPC `bdev_get_iostat` now allows a user to query the per channel IO statistics for 42required bdev, and displays maximum and minimum latencies and I/O error counts. 43 44New `spdk_bdev_copy_blocks` and `spdk_bdev_get_max_copy` APIs to support copy commands. 45 46A new API `spdk_bdev_io_get_submit_tsc` was added to get the submit_tsc of the bdev I/O. 47 48Bdevs will no longer have UUIDs generated based on timestamp and are responsible for 49setting this field themselves. Generation of UUIDs for NVMe bdevs may be enabled by 50running `bdev_nvme_set_options` RPC with `--generate-uuids` option. These identifiers 51are based on serial number and namespace ID and will always be the same for a given 52device. 53 54A new API `spdk_bdev_channel_get_histogram` was added to get the histogram of a specified 55channel for a bdev. 56 57Converted internal use of `pthread_mutex_t` to `struct spdk_spinlock`. Consumers of bdev 58API functions must be on an SPDK thread or the program will abort. It is now enforced 59that no internal bdev locks can be held when a poller or message goes off CPU. 60 61A new RPC `bdev_reset_iostat` was added to reset I/O statistics of bdevs. Note that if one 62consumer reset I/O statistics, it affects all other consumers. 63 64Add function pointers, `dump_device_stat_json` and `reset_device_stat` to the bdev module 65function table to display and reset I/O statistics specific for the module specific bdev 66context. 67 68A new option `nvme_error_stat` was added to the `bdev_nvme_set_options` RPC to enable 69collecting NVMe error counts. 70 71New APIs `spdk_bdev_reset_io_stat`, `spdk_bdev_add_io_stat` and `spdk_bdev_dump_io_stat_json` 72were added to process I/O statistics outside the generic bdev layer, especially in bdev modules. 73 74Added I/O statistics per I/O path to the NVMe bdev module for NVMe bdev multipath. It can be 75enabled by a new option io_path_stat of RPC bdev_nvme_set_options. 76 77Added RPC bdev_nvme_get_path_iostat to get I/O statistics for IO paths of the NVMe bdev. 78 79### event 80 81Added core lock file mechanism to prevent the same CPU cores from being used by multiple 82SPDK application instances. 83 84Added a command line switch to disable CPU locks on SPDK startup. 85 86Added RPCs framework_enable_cpumask_locks and framework_disable_cpumask_locks to enable 87and disable CPU core locks in runtime. 88 89Added --rpcs-allowed command line option. Users can specify a comma-separated list of RPC 90names with this option to restrict allowed RPCs to only that list. 91 92### nvme 93 94NVMe transport options were newly introduced. The NVMe transport options are defined via 95the `spdk_nvme_transport_opts` structure and configured via `spdk_nvme_transport_get_opts` 96and `spdk_nvme_transport_get_opts` functions. 97 98Shared receive queue was supported by the RDMA transport. It can be configured by 99a new NVMe transport option `rdma_srq_size`. 100 101### rpc 102 103Added spdk_rpc_set_allowlist to restrict allowed RPCs to the specified list. 104 105Changed `bdev_raid_get_bdevs` RPC output format to include raid_bdev details. 106 107Added `selector` parameter to bdev_nvme_set_multipath_policy RPC to set path selector for multipath. 108Option `round_robin` and `queue_depth` are available. 109 110Added `rr_min_io` option to RPC bdev_nvme_set_multipath_policy. It switches I/O to 111another path after rr_min_io I/Os are routed to current io path for the round-robin 112path selector. 113 114Added option `--io-path-stat` for RPC bdev_nvme_set_option to enable collecting io path stat. 115 116### bdevperf 117 118Promoted the application to example to match similar programs: fio_plugin and perf. 119It can now be found inside `examples/bdev/bdevperf`. 120 121### trace 122 123New `trace_get_info` RPC was added to get name of shared memory file, list of the 124available trace point groups and mask of the available trace points for each group. 125 126### util 127 128New API `spdk_fd_group_get_epoll_event` that returns the epoll(7) event that 129caused a function callback in file descriptor group to execute. 130 131A new API `spdk_strcpy_replace` was added to replace all occurrences of the search string 132with the replacement string. 133 134New API `spdk_iov_memset()` was added to memset an iovec. 135 136New API `spdk_iov_one()` was added to initialize an iovec for a single buffer. 137 138### json 139 140Added API `spdk_json_write_double` and `spdk_json_write_named_double` to allow 141for writing and decoding of the the double data type. 142 143### thread 144 145Added `spdk_thread_get_app_thread` which returns the first thread that was created using 146`spdk_thread_create`. 147 148Added `spdk_thread_is_running`. This returns `true` for a running thread, or `false` if 149its exit process has started using `spdk_thread_exit`. 150 151Added API `spdk_spin_init`, `spdk_spin_destroy`, `spdk_spin_lock`, `spdk_spin_unlock`, and 152`spdk_spin_held` to support spinlocks that are aware of the SPDK concurrency model. 153 154### log 155 156Added consistent tracking of use of deprecated behavior. Deprecations continue to be 157listed in deprecation.md and now are in subsections with headers matching a tag 158used in `SPDK_LOG_DEPRECATED()` calls. When deprecated behavior is used, these 159tags will appear in SPDK's log at the warn level. As the SPDK application exits, it 160will log a summary of how many times `SPDK_LOG_DEPRECATED()` was called for each 161tag that was logged at least once. 162 163### nvme 164 165Added `transport_tos` to `spdk_nvme_ctrlr_opts` to support setting of the "type of service" 166value in the IPv4 header. Only RDMA is supported at this time. 167 168Added API spdk_nvme_qpair_get_num_outstanding_reqs to get the number of outstanding reqs of 169a specified qpair. 170 171### bdev_nvme 172 173Updated `bdev_nvme_set_options` RPC (and rpc.py) to support the new `transport_tos` parameter. 174 175For the active-active policy of the multipath mode, in addition to the default round-robin path 176selector, the minimum queue depth path selector was added. The minimum queue depth path selector 177selects an I/O path according to the number of outstanding requests of each nvme qpair. 178 179### ublk device 180 181The ublk application supports the ublk kernel driver. It's implemented as a ublk backend 182in spdk_tgt and could be started with specifying configuration. See the 183[ublk](https://www.kernel.org/doc/html/latest/block/ublk.html) documentation for more details. 184 185ublk bdev could export a block device via Linux ublk. It will move this backend device into userspace 186as `/dev/ublkb*`. Before to adding ublk device, need to create ublk target by rpc methond. 187 188## v22.09 189 190### accel 191 192Many names were changed in the accel framework to make them consistent both with themselves and 193the rest of SPDK. The primary public header file is now named `include/spdk/accel.h`. 194 195Added a new runtime RPC `accel_get_opc_assignments` to get a list of current opcode to engine 196assignments. 197 198Added a new startup RPC `accel_assign_opc` to assign/override a specific opcode to 199an engine. 200 201### bdev 202 203New RPCs `bdev_xnvme_create` and `bdev_xnvme_delete` were added to support the xNVMe bdev. 204 205A new API `spdk_bdev_for_each_bdev_io` was added to execute the function on the appropriate 206thread for each bdev_io submitted to the bdev. 207 208A new API `spdk_bdev_get_current_qd` was added to measure and return the queue depth from a 209bdev. This API is available even when queue depth sampling is disabled. 210 211Added `spdk_bdev_seek_data`, `spdk_bdev_seek_hole` and `spdk_bdev_io_get_seek_offset` functions 212that start from a given offset and seek for next data or for next hole. At this time only 213supported by lvol bdev module. 214 215A new parameter `io_drain_timeout` has been added to `spdk_bdev` structure. It controls how long 216a bdev reset must wait for IO to complete prior to issuing a reset to the underlying device. 217If there is no outstanding IO at the end of that period, the reset is skipped. 218Best defined for bdevs that share an underlying bdev, such as multiple lvol bdevs sharing 219an nvme device, to avoid unnecessarily resetting the underlying bdev and affecting other 220bdevs that are sharing it. 221Modifying this field is optional. Setting the value to 0 keeps the original behavior 222to always send resets immediately, even if there is no I/O outstanding. 223 224### blobstore 225 226Reserve space for `used_clusters` bitmap. The reserved space could be used for blobstore growing 227in the future. 228 229Added `is_zeroes` operation to `spdk_bs_dev`. It allows to detect if logical blocks are backed 230by zeroes device and do a shortcut in copy-on-write flow by excluding copy part from zeroes device. 231 232Added `spdk_blob_get_next_allocated_io_unit` and `spdk_blob_get_next_unallocated_io_unit` functions 233that start from a given offset and seek for first io_unit belonging to an allocated cluster 234or first io_unit belonging to an unallocated cluster. 235 236Added `spdk_bs_grow` function to grow blobstore size if the underlying bdev size is increased. 237This is used by lvol bdev via `bdev_lvol_grow_lvstore` RPC. 238 239### daos 240 241Added new DAOS bdev module, that creates SPDK block device on top of DAOS DFS. 242Please see [documentation](https://spdk.io/doc/bdev.html#bdev_config_daos) for more details. 243 244### env 245 246Added `spdk_pci_register_device_provider` and matching `SPDK_PCI_REGISTER_DEVICE_PROVIDER` 247functions for registering PCI device providers. That allow the VMD driver to be notified 248when users want to attach a device under a given BDF and when a device is detached. 249 250### init 251 252`spdk_subsystem_init_from_json_config` now fails if the JSON configuration file is not 253an object with an array named "subsystems". 254 255### iscsi 256 257Added `bdev_iscsi_set_options` RPC to modify options of the iSCSI bdev module. 258 259### json 260 261Added `spdk_json_find` API return errcode: EPROTOTYPE - json not enclosed in {}. 262`spdk_json_find` now returns -EPROTOTYPE instead of -ENOENT if the object parameter 263does not point to a JSON object (i.e. is not enclosed with {}). 264 265### lvol 266 267Add `num_md_pages_per_cluster_ratio` parameter to the `bdev_lvol_create_lvstore` RPC. 268Calculate `num_md_pages` from `num_md_pages_per_cluster_ratio`, and pass it to `spdk_bs_opts`. 269 270### nvme 271 272Added SPDK_NVME_TRANSPORT_CUSTOM_FABRICS to enum `spdk_nvme_transport_type` to support custom 273fabric transport. SPDK_NVME_TRANSPORT_CUSTOM was intended to be non-fabric custom transport. 274 275Added a new function `spdk_nvme_ns_cmd_verify` to submit a Verify Command to a Namespace. 276 277Added `spdk_nvme_ctrlr_disable_read_changed_ns_list_log_page` to allow an application to 278tell the driver to not read the CHANGED_NS_LIST log page in response to a NS_ATTR_CHANGED 279AEN. When called the application is required to read this log page instead to clear the 280AEN. 281 282Added `psk` field to `spdk_nvme_ctrlr_opts` struct in order to enable SSL socket implementation 283of TCP connection and set the PSK. Applicable for TCP transport only. 284 285### raid 286 287Renamed the `raid5` module to `raid5f` to reflect that it is not a traditional 288RAID5 implementation - only full stripe writes are supported, partial stripe 289writes (read-modify-write) are not. 290 291### rpc 292 293Added `psk` parameter to `bdev_nvme_attach_controller` RPC in order to enable SSL socket implementation 294of TCP connection and set the PSK. Applicable for TCP transport only. 295 296New options `enable_ktls` and `tls_version` were added to the `sock_impl_set_options` structure. 297New options `psk_key` and `psk_identity` were added to the `sock_impl_set_options` structure. 298 299Added warning message for `bdev_rbd_create`, if it is used without -c. 300`bdev_rbd_create()` API without specifying -c is deprecated and will be removed in future release. 301 302Renamed `enable_vmd` RPC to `vmd_enable` to make it consistent with our naming scheme of 303`<subsystem>_<action>`. For now, the old name is still available, but is marked as deprecated. 304 305New function `spdk_rpc_get_method_state_mask` was added to RPC library. 306 307### sma 308 309Extended `VolumeParameters` with crypto parameters allowing the user to configure crypto when 310attaching a volume to a device. This interface is now supported by all upstream device types 311(nvmf-tcp, virtio-blk, vfio-user) using `bdev_crypto`. Users must specify the crypto engine to use 312under `crypto` section in config. It is also possible to register out-of-tree crypto engines by 313inheriting from the `CryptoEngine` class. 314 315Added two new methods: `SetQos` and `GetQosCapabilities` allowing the user to configure QoS on a 316per-device or per-volume level. Not all QoS settings have to be supported by each device, so users 317can use `GetQosCapabilities` to query them for that. All upstream device types support QoS on a 318per-volume level using bdev layer's QoS mechanism. 319 320### sock 321 322Added new `ssl` based socket implementation, the code is located in `module/sock/posix`. 323For now we are using hard-coded PSK and only support TLS 1.3. 324 325### util 326 327Added new functions: `spdk_hexlify` and `spdk_unhexlify`. 328 329A new API `spdk_xor_gen` was added to generate XOR from multiple source buffers. It is going to be 330used by `raid5f` for calculating parity. 331 332### vfu_tgt 333 334Added vfu_tgt library abstraction based on libvfio-user for PCI device emulation. 335Besides the NVMe device emulation, its now possible to emulate virtio-blk and virtio-scsi 336devices. 337 338### virtio 339 340virtio-vhost-user no longer tries to support dynamic memory allocation. The vhost target does 341not support the high rate of SET_MEM_TABLE vhost messages that result from dynamic memory 342allocation, so a virtio-vhost-user device will now present an ERRLOG, assert, and skip the 343SET_MEM_TABLE vhost message if a memory notification is received outside of the normal device 344start/stop. Applications using the virtio library in vhost-user mode should now pre-allocate 345the application's memory using the -s/--mem-size option and use single shared memory file 346segments using the -g/--single-file-segments option. 347 348Added `vfio-user` transport type for virtio-blk and virtio-scsi devices. 349 350### vmd 351 352Fixed hotplug when a device is inserted in a slot in which a disk was already enumerated previously. 353Added two new RPCs: `vmd_remove_device` simulating a hotremove, and `vmd_rescan`, which rescans all 354buses managed by the VMD driver and hotplugs all newfound devices. 355 356## v22.05 357 358### sock 359 360A new option `ack_timeout` was added to the `spdk_sock_opts` structure. 361 362### util 363 364A new parameter `bounce_iovcnt` was added to `spdk_dif_generate_copy` and `spdk_dif_verify_copy`. 365The `bounce_iovcnt` is used to specify the number of bounce_iov to support multiple block-aligned 366fragment copies. 367 368A new API `spdk_copy_iovs_to_buf` and `spdk_copy_buf_to_iovs` were added to copy iovs to buf or 369copy buf to iovs. There're many cases need to use these two APIs. 370 371### bdev 372 373Removed deprecated spdk_bdev_module_finish_done(). Use spdk_bdev_module_fini_done() instead. 374 375A new API `spdk_bdev_unregister_by_name` was added to handle race conditions correctly. 376 377New APIs, `spdk_for_each_bdev` and `spdk_for_each_bdev_leaf`, were added to provide iteration 378safe for race conditions. 379 380A new RPC `bdev_nvme_get_io_paths` was added to get all active I/O paths. 381 382A new RPC `bdev_nvme_set_preferred_path` was added to set preferred I/O path for an NVMe bdev 383when in multipath mode. This RPC does not support NVMe bdevs in failover mode. 384 385A new RPC `bdev_nvme_set_multipath_policy` was added to set multipath policy of a NVMe bdev 386in multipath mode. 387 388A new option `disable_auto_failback` was added to the `bdev_nvme_set_options` RPC to disable 389automatic failback. 390 391### idxd / dsa 392 393A new parameter `flags` was added to all low level submission and preparation 394APIs to enable the caller to pass operation flags per the DSA specification. 395 396A new flag 'SPDK_IDXD_FLAG_PERSISTENT' was added to let DSA know that 397the destination is persistent. 398 399The RPC `idxd_scan_accel_engine` has been renamed to `dsa_scan_accel_engine` 400 401The RPC `iaa_scan_accel_engine` has been added. 402 403Many HW related structs/functions with the name `idxd` have been renamed `dsa` 404to more accurately represent the HW they are associated with. 405 406Two new functions were added to the library `spdk_idxd_submit_compress` and 407`spdk_idxd_submit_decompress` 408 409### accel_fw 410 411A new parameter `flags` was added to accel API. 412The APIs include: 413`spdk_accel_submit_copy` 414`spdk_accel_submit_dualcast` 415`spdk_accel_submit_fill` 416`spdk_accel_submit_copy_crc32c` 417`spdk_accel_submit_copy_crc32cv` 418`spdk_accel_submit_compress` 419`spdk_accel_submit_decompress` 420 421A new flag `ACCEL_FLAG_PERSISTENT` was added to indicate the target memory is PMEM. 422 423The API `spdk_accel_get_capabilities` has been removed. 424 425### crypto 426 427Support for AES_XTS was added for MLX5 polled mode driver (pmd). 428 429bdev_crypto_create RPC now requires hexlified 'key' and 'key2' params for all pmd drivers. 430Unhexlifying is performed during RPC command processing and the vbdev crypto module runs on 431binary keys as before. 432 433### bdev 434 435Added a timeout option to the `bdev_get_bdevs` RPC. It allows the user to specify the amount of 436time to wait until a bdev with a given name appears in the system. 437 438### bdev_nvme 439 440Added `bdev_nvme_add_error_injection` and `bdev_nvme_remove_error_injection` RPCs to add and 441remove NVMe error injections. 442 443New parameters, `ctrlr_loss_timeout_sec`, `reconnect_delay_sec`, and `fast_io_fail_timeout_sec`, are 444added to the RPC `bdev_nvme_set_options`. They can be overridden if they are given by the RPC 445`bdev_nvme_attach_controller`. 446 447### blobstore 448 449New functions `spdk_blob_io_writev_ext` and `spdk_blob_io_readv_ext` are added. The new functions accept 450`spdk_blob_ext_io_opts` structure with extended IO request options. 451 452### event 453 454Added `msg_mempool_size` parameter to `spdk_reactors_init` and `spdk_thread_lib_init_ext`. 455The size of `g_spdk_msg_mempool` can now be controlled through the same-named 456user option of `spdk_app_opts` structure. 457 458### nvme 459 460The API `spdk_nvme_ctrlr_prepare_for_reset()` was deprecated. The functionality provided by the 461`spdk_nvme_ctrlr_prepare_for_reset()` was merged into the API `spdk_nvme_ctrlr_disconnect()`. 462 463### nvmf 464 465Removed deprecated max_qpairs_per_ctrlr parameter from nvmf_create_transport RPC. Use 466max_io_qpairs_per_ctrlr instead. 467 468Deprecated the ability for hosts to connect to the discovery subsystem automatically on any 469existing listener. Users should now explicitly add listeners for the discovery subsystem. 470Host can still connect to the discovery subsystem as before, but a warning message will be 471emitted if no listener was configured for the transport ID of the incoming connection. 472 473Added adaptive interrupt feature for vfio-user transport. New parameter `disable_adaptive_irq` 474is added to the RPC `nvmf_create_transport`. 475 476### thread 477 478Added `spdk_thread_exec_msg()` API. 479 480### scheduler 481 482`framework_set_scheduler` can now be called after application initialization. 483Added callbacks to set custom parameters specific for each scheduler implementation 484and `framework_get_scheduler` to retrieve them. 485 486Added `dynamic` scheduler options: load_limit, core_limit, core_busy. Their descriptions 487are available in JSON-RPC document, in section 488[framework_set_scheduler](jsonrpc.html#rpc_framework_set_scheduler). 489 490### raid 491 492Add concat as a special raid module. The concat module could create a virtual bdev. The 493virtual bdev combines multiple underlying bdevs together. The layout of the underlying 494bdevs is one after another. The concat bdev is extendable. When the free space of the 495concat bdev is not enough, the user can deconstruct the concat bdev, then reconstruct it 496with an additional underlying bdev. 497 498### sock 499 500Allow MSG_ZEROCOPY flag to be set or not according to data size, which can be enabled and 501set by setting "zerocopy_threshold". zerocopy_threshold = 0 means disable this function; 502zerocopy_threshold > 0 means enable it and use this value as the threshold. 503 504### rpc 505 506Introduced `zerocopy_threshold` to enable zerocopy on send for server sockets according to 507data size to be flushed. 508 509## v22.01 510 511### accel 512 513The batching capability was removed. Batching is now considered an implementation 514detail of the low level drivers. 515 516### bdev 517 518The NVMe bdev module supports multipath and improved I/O error resiliency. 519 520The parameter `retry_count` of the RPC `bdev_nvme_set_options` was deprecated and will be 521removed in SPDK 22.04, and the parameter `transport_retry_count` is added and used instead. 522 523An new parameter `bdev_retry_count` is added to the RPC `bdev_nvme_set_options`. 524 525New parameters, `ctrlr_loss_timeout_sec`, `reconnect_delay_sec`, and `fast_io_fail_timeout_sec`, are 526added to the RPC `bdev_nvme_attach_controller`. 527 528An new parameter `num_io_queues` is added to `bdev_nvme_attach_controller` RPC to allow specifying amount 529of requested IO queues. 530 531Added `key_file` parameter to the `rbd_register_cluster` RPC. It is an optional parameter to 532specify a keyring file to connect to a RADOS cluster. 533 534Added `spdk_bdev_get_zone_id` API to retrieve zone_id for a certain LBA. 535 536### bdev_aio 537 538Added `bdev_aio_rescan` RPC to allow rescanning the size of aio bdev. 539 540### bdev_nvme 541 542Added discovery service to bdev_nvme module, which now can connect to a discovery controller. 543bdev_nvme will connect to all current and future subsystems in the discovery controller. 544Added `bdev_nvme_start_discovery` and `bdev_nvme_stop_discovery` RPC. 545 546### dpdk 547 548Updated DPDK submodule to DPDK 21.11. 549 550### env 551 552Added `spdk_pci_for_each_device`. 553 554Removed `spdk_pci_get_first_device` and `spdk_pci_get_next_device`. These APIs were unsafe, because 555they did not account for PCI devices being inserted or removed while the caller was using handles 556returned from these APIs. Existing users of these APIs should switch to `spdk_pci_for_each_device` 557instead. 558 559Added 3 experimental APIs to handle PCI device interrupts (`spdk_pci_device_enable_interrupt`, 560`spdk_pci_device_disable_interrupt`, `spdk_pci_device_get_interrupt_efd`). 561 562Added `framework_get_pci_devices` RPC to list PCIe devices attached to an SPDK application. 563 564### idxd 565 566Many APIs are now vectored rather than scalar, meaning they take iovecs instead of individual pointers. 567 568### json 569 570Added `spdk_json_write_bytearray` API to serialize a buffer as a hex string. 571 572### nvme 573 574API `spdk_nvme_trtype_is_fabrics` was added to return existing transport type 575is fabric or not. 576 577API `spdk_nvme_poll_group_remove` was limited to be available only for a 578disconnected qpair in the group. 579 580New APIs, `spdk_nvme_ctrlr_disconnect`, `spdk_nvme_ctrlr_reconnect_async`, and 581`spdk_nvme_ctrlr_reconnect_poll_async`, have been added to improve error recovery, and 582the existing APIs,`spdk_nvme_ctrlr_reset_async` and `spdk_nvme_ctrlr_reset_poll_async` 583were deprecated. 584 585Added `spdk_nvme_ctrlr_get_discovery_log_page` API for getting the full discovery log page 586from a discovery controller. 587 588### nvmf 589 590Added support for zero-copy operations in the NVMe-oF TCP target. It can be enabled via 591the `zcopy` parameter when creating a transport. The zero-copy operations are only used 592for requests not using in-capsule data. 593 594Added a `subsystem` parameter to `spdk_nvmf_transport_stop_listen_async`. When not NULL, 595it will only disconnect qpairs for controllers associated with the specified subsystem. 596 597Removed accept poller from transport layer. Each transport can have its own policy of 598handling new connections. To notify transport layer `spdk_nvmf_poll_group_add` and 599`spdk_nvmf_tgt_new_qpair` can be used. 600 601### scsi 602 603Structure `spdk_scsi_lun` has been extended with new member `resizing` so that SCSI layer now reports 604unit attention for disk resize. 605 606### trace 607 608Added `spdk_trace_create_tpoint_group_mask` to return tracepoint group mask from 609a tracepoint group name. 610 611Added `trace_set_tpoint_mask` and `trace_clear_tpoint_mask` RPC to allow enabling 612individual traces. 613 614### util 615 616Added `spdk_ioviter_first` and `spdk_ioviter_next` to iterate over two iovecs and 617yield pointers to common length segments. 618 619### sock 620 621A new parameter `hint` is added to `spdk_sock_get_optimal_sock_group`. It allows to suggest 622a poll group when no optimal poll group is found. 623 624## v21.10 625 626Structure `spdk_nvmf_target_opts` has been extended with new member `discovery_filter` which allows to specify 627filtering rules applied during discovery log generation. Refer to `enum spdk_nvmf_tgt_discovery_filter` for more info. 628 629### bdev 630 631New API `spdk_bdev_get_memory_domains` has been added, it allows to get SPDK memory domains used by bdev. 632 633New API functions `spdk_bdev_readv_blocks_ext` and `spdk_bdev_writev_blocks_ext` have been added. 634These functions accept `spdk_bdev_ext_io_opts` structure with extended IO request 635options, e.g. DMA memory domain which describes data that may belong to another memory domain and 636can't be accessed directly. 637 638Added `async_fini_start` to allow bdev modules to complete the `fini_start` asynchronously, 639with new `spdk_bdev_module_fini_start_done` API. 640 641Deprecated `spdk_bdev_module_finish_done()` API, which will be removed in SPDK 22.01. 642Bdev modules should use `spdk_bdev_module_fini_done()` instead. 643 644The `ocssd` bdev has been removed. The Open Channel specification has been largely superseded by 645zoned namespaces, few if any devices have been brought to market, and there is little reason to 646continue to support this. OCSSD support in the nvme driver will remain for now. 647 648### dma 649 650A new library, lib/dma, has been added. This library provides the necessary infrastructure for 651handling systems and devices with multiple memory domains. For example, a PCIe add-in card with an 652SoC may be running SPDK on the SoC. That SoC has its own local memory, but SPDK may be controlling 653devices that can also access the host system memory. This library provides infrastructure to enumerate 654the memory domains and request hardware perform DMA transfers between them. 655 656### dpdk 657 658Updated DPDK submodule to DPDK 21.08. 659 660### event 661 662Added the `disable_signal_handlers` flag to the `spdk_app_opts` struct. 663 664### idxd 665 666Added `spdk_idxd_get_socket` to query the socket that the idxd device 667is on. 668 669### json 670 671Added API to allow for writing and decoding of new types: 672 673- `spdk_json_write_named_uint16` 674- `spdk_json_write_named_uint8` 675- `spdk_json_write_uint16` 676- `spdk_json_write_uint8` 677- `spdk_json_number_to_uint8` 678- `spdk_json_decode_uint8` 679 680### log 681 682Added API `spdk_log_to_syslog_level` to return syslog level based on SPDK's 683log level. 684 685### nvme 686 687Added new functions `spdk_nvme_zns_set_zone_desc_ext` and `spdk_nvme_zns_ext_report_zones` 688to set zone descriptor extension and to get extended zone report respectively. 689 690New API `spdk_nvme_ctrlr_get_memory_domains` has been added, it allows to get SPDK memory domains used by nvme controller. 691 692New API functions `spdk_nvme_ns_cmd_readv_ext` and `spdk_nvme_ns_cmd_writev_ext` 693have been added. These functions accept `spdk_nvme_ns_cmd_ext_io_opts` structure with extended IO request 694options, e.g. DMA memory domain which describes data that may belong to another memory domain and 695can't be accessed directly. 696 697Added a new function `spdk_nvme_ctrlr_get_regs_bpinfo` to get boot partition info of a controller. 698Added new functions `spdk_nvme_ctrlr_write_boot_partition`, 699`spdk_nvme_ctrlr_read_boot_partition_start` and `spdk_nvme_ctrlr_read_boot_partition_poll` 700to write and read the boot partitions of a controller. 701 702Added `spdk_nvme_ctrlr_get_opts` to retrieve the current controller options. 703 704Added `async_mode` to `spdk_nvme_io_qpair_opts` to enable creation of submission and completion 705queues asynchronously. This mode is currently supported at PCIe layer, 706which tracks the qpair creation with state machine and returns to the user immediately. 707Default mode is set to false to create io qpairs synchronously. 708 709Added `spdk_nvme_ctrlr_get_regs_cc` to retrieve NVMe controller CC (Configuration) register. 710 711Added `spdk_nvme_ctrlr_prepare_for_reset` to inform the driver that the application is preparing 712to reset the specified NVMe controller. This function allows the driver to make decisions 713knowing that a reset is about to happen. 714 715### nvmf 716 717Added `oncs` to `struct spdk_nvmf_ctrlr_data` so that the transport layer 718can decide support RESERVATION feature or not. 719 720An `opts_size` element was added in the `spdk_nvmf_ns_opts` structure to solve the 721ABI compatibility issue between different SPDK version. An new option `anagrpid` was 722added in the `spdk_nvmf_ns_opts` structure. 723 724An new parameter `anagrpid` was added to the RPC `nvmf_subsystem_add_ns`. 725 726An new parameter `anagrpid` was added to the RPC `nvmf_subsystem_listener_set_ana_state`. 727 728`spdk_nvmf_subsystem_destroy` is now can be asynchronous, it accepts a callback and callback argument. 729 730A new parameter, `poll_groups_mask` was added to the `nvmf_set_config` RPC that allows specifying 731a subset of cores for the nvmf poll groups. This helps to avoid imbalances when some cores are 732busy with periodic timer tasks that run very frequently. 733 734A new parameter, `commit` was added to `nvmf_bdev_ctrlr_end_zcopy` that allows indicating whether 735the buffers should be committed. 736 737Added `listen_dump_opts` to `spdk_nvmf_transport_ops` so that the transport layer can display 738listen opts. 739 740Added `fabrics_connect_timeout_us` to `bdev_nvme_attach_controller` RPC to allow specifying 741timeout for connect operation. 742 743Added `multipath` to `bdev_nvme_attach_controller` RPC to allow specifying multipath behavior. 744 745### scheduler 746 747New API for implementing schedulers and governors. Please see `include/spdk/scheduler.h` for details. 748 749### scsi 750 751New functions, `spdk_scsi_dev_get_first_lun` and `spdk_scsi_dev_get_next_lun` 752have been added to iterate LUNs of a SCSI device. 753 754Each SCSI device supports 256 LUNs at the maximum now and the macro constant 755`SPDK_SCSI_DEV_MAX_LUN` was removed. 756 757### trace_parser 758 759A new library, lib/trace_parser, has been added. This library provides functions that parse traces 760recorded by an SPDK application. That includes merging traces from multiple cores, 761sorting them by their timestamp and constructing trace entries spanning across multiple buffers. 762 763### util 764 765The `spdk_fd_group_add` API now takes a `name` parameter. 766 767## v21.07 768 769### accel_fw 770 771Added API `spdk_accel_submit_copy_crc32c` to perform a CRC32C while copying data. 772 773Added API `spdk_accel_batch_prep_copy_crc32c` to batch CRC32C + copy commands. 774 775Added API `spdk_accel_submit_copy_crc32cv` to submit chained CRC32C + copy commands. 776 777### bdev 778 779Change `spdk_bdev_read_blocks_with_md` arg offset definition from int64_t to uint64_t. 780 781Red-black tree has been used to organize the bdev names and aliases uniformly 782to provide faster lookup. 783 784Removed ZCOPY emulation: The bdev module can be checked to see if it supports ZCOPY 785and if not supported then use existing READ/WRITE commands. 786 787Added iov to spdk_bdev_zcopy_start. 788 789### dpdk 790 791Updated DPDK submodule to DPDK 21.05. 792 793### idxd 794 795Remove the `probe_cb` parameter in `spdk_idxd_probe` function. And remove the definition 796of `spdk_idxd_probe_cb` function pointer. It should be implemented in idxd_user.c. 797 798Added API `spdk_idxd_submit_copy_crc32c` to perform a CRC32C while copying data. 799 800Added API `spdk_idxd_batch_prep_copy_crc32c` to prepare a batch operation to perform 801a CRC32C while copying data. 802 803We have userspace idxd driver under accel_engine library (module/accel/idxd/accel_engine). 804And kernel idxd driver usage is also added under the accel_engine library. This approach 805implemented a wrapper library to use IDXD device by leveraging the kernel DSA driver in 806SPDK idxd library (lib/idxd). Then users can leverage the RPC later to configure how to 807use the DSA device by user space driver or kernel driver. 808 809### init 810 811Added new `init` library that initializes the SPDK subsystems, which previously was 812internal to application framework. That functionality has been made public and for 813use by applications which don't leverage SPDK's application framework. 814 815### iscsi 816 817New parameters, `pdu_pool_size`, `immediate_data_pool_size`, and `data_out_pool_size`, 818were added to the RPC `iscsi_set_options` to run iSCSI target with varying amount of 819available memory. 820 821### json 822 823Added API `spdk_json_write_named_uint128` and `spdk_json_write_uint128` to perform 824the uint128 related data. 825 826### net 827 828Removed deprecated `net` library. 829 830Added support for ZCOPY. ZCOPY is used in preference to READ and WRITE if the 831bdev module supports ZCOPY and the bdev module has ZCOPY enabled. 832 833### nvme 834 835`spdk_nvme_map_prps` and `spdk_nvme_map_cmd` were moved to nvmf/vfio-user as internal APIs 836as vfio-user is the only user for the above two APIs. 837 838Added a new function `spdk_nvme_ns_cmd_copy` to submit a Simple Copy Command to a Namespace. 839 840Update the `spdk_nvme_generic_command_status_code` structure with new status code 841according to the definition in NVMe 1.4 spec. 842 843`spdk_nvme_ctrlr_get_default_ctrlr_opts` now sets `use_cmb_sqs` to false. This means 844that if a controller has a CMB and supports SQs in the CMB, SPDK will not use 845the CMB for SQs by default - the user must set `use_cmb_sqs` to true in 846the `spdk_nvme_ctrlr_opts` structure prior to controller attach. 847 848Add a new function `spdk_nvme_detach_poll` to simplify a common use case to continue 849polling until all detachments complete. 850 851Added new argument `timeout_admin_us` to `spdk_nvme_ctrlr_register_timeout_callback` so callers 852can specify a different timeout for admin commands vs. io commands. 853 854An existing function `spdk_nvme_detach_async` was updated to add one or more detachments 855to an active context while it is being polled. 856 857Rename a variable in the member `cmic` of the struct `spdk_nvme_ctrlr_data` from 858`multi_host` to `multi_ctrlr`. The variable means that the NVM subsystem may have two or 859more controllers if set to 1. However `multi_host` had indicated a particular use case 860such that the NVM subsystem is used by multiple hosts. 861 862A new option `disable_read_ana_log_page` was added to struct `spdk_nvme_ctrlr_opts` to disable 863reading ANA log page. The upper layer is expected to read ANA log page instead if `true`. 864The default value is `false`. 865 866New APIs, `spdk_nvme_ctrlr_reset_async` and `spdk_nvme_ctrlr_reset_poll_async`, have been added to 867reset a controller asynchronously. 868 869New RPC `bdev_nvme_reset_controller` was added, to reset an NVMe controller. 870 871Added `spdk_nvme_ns_get_nguid` function to get NGUID for the given namespace. 872 873Added `spdk_nvme_ctrlr_is_fabrics` function to indicate whether a ctrlr handle 874is associated with a fabrics controller. 875 876### nvmf 877 878Added `min_cntlid` and `max_cntlid` to `nvmf_create_subsystem` to limit the controller ID range. 879Added `spdk_nvmf_subsystem_get_min_cntlid` and `spdk_nvmf_subsystem_get_max_cntlid` to request those values. 880 881`spdk_nvmf_request_get_buffers_multi` API is removed. 882 883Added the `nvmf_set_crdt` RPC for setting command retry delay times. 884 885Expanded `spdk_nvmf_poll_group_stat` with current qpair count statistics. 886 887Removed following deprecated APIs: 888 889- `spdk_nvmf_poll_group_get_stat` (function in `nvmf.h`), 890- `spdk_nvmf_transport_poll_group_get_stat` (function in `nvmf.h`), 891- `spdk_nvmf_transport_poll_group_free_stat`(function in `nvmf.h`), 892- `spdk_nvmf_rdma_device_stat` (struct in `nvmf.h`), 893- `spdk_nvmf_transport_poll_group_stat` (struct in `nvmf.h`), 894- `poll_group_get_stat` (transport op in `nvmf_transport.h`), 895- `poll_group_free_stat` (transport op in `nvmf_transport.h`). 896 897### rpc 898 899New RPC `bdev_rbd_register_cluster` and `bdev_rbd_unregister_cluster` was added, it allows to create 900and delete the rados object cluster, then users can choose the cluster to create related rbd 901device. 902 903Revised `bdev_rbd_create` parameter, it allows to use an optional parameter `--cluster-name` 904to create a rbd bdev with an already registered Rados Cluster Object. 905 906New RPC `bdev_rbd_get_clusters_info` was added, it allows to get the info of the registered 907Rados Cluster names. 908 909New optional parameter, `timeout_admin_us`, added to the bdev_nvme_set_options RPC. 910 911Revised a parameter `--stripe-size_kb` to `--stripe-size-kb` of `bdev_raid_create` method 912provided in `scripts/rpc.py` for consistency. 913 914An new optional parameter `config_kernel_mode` was added to the RPC `idxd_scan_accel_engine`, 915and this is used to enable using the kernel mode IDXD driver. 916 917Removed deprecated parameter `enable-zerocopy-send` of RPC `sock_impl_set_options`, 918use `enable-zerocopy-send-server` or `enable-zerocopy-send-client` instead. 919Removed deprecated parameter `disable-zerocopy-send` of RPC `sock_impl_set_options`, 920use `disable-zerocopy-send-server` or `disable-zerocopy-send-client` instead. 921 922### rpm 923 924Removed deprecated `pkg/spdk.spec`, please use `rpmbuild/spdk.spec` instead. 925See [RPM documentation](https://spdk.io/doc/rpm.html) for more details. 926 927### thread 928 929Red-black tree has been used for timed pollers to provide faster insertion and deletion 930and for io_devices to provide faster lookup. 931 932Removed `spdk_io_channel` structure from public header and moved it to thread_internal.h. 933 934### trace 935 936Added `spdk_trace_register_description_ext` function to register variable number of tracepoint arguments. 937 938Added ability to chain multiple trace entries together to extend the size of the argument buffer. 939 940### util 941 942Red-black tree macros has been added by using the macros provided by the FreeBSD operating system 943under the same BSD license. 944 945Add an new macro `SPDK_SIZEOF_MEMBER` to get the size of a member of a struct. 946 947`spdk_crc32c_iov_update` function was added to support calculating the crc32c of the iovs. 948 949Added zipf random number generator with power law probability distribution. 950When applied to performance testing of block devices, it will select blocks over 951the full range of LBAs, but will more frequently select lower-numbered LBAs. 952 953## v21.04 954 955### accel 956 957Two new accelerated crc32 functions `spdk_accel_submit_crc32cv` and 958`spdk_accel_batch_prep_crc32cv` are added in order to provide the 959chained accelerated CRC32 computation support. 960 961### bdev 962 963For `bdev_ocssd_create` RPC, the optional parameter `range` was removed. 964Only one OCSSD bdev can be created for one OCSSD namespace. 965 966Removed the `spdk_bdev_open` from bdev library API. 967Removed the `spdk_vbdev_register` and `spdk_bdev_part_base_construct` from bdev module API. 968Removed the `config_text` function for bdev modules to report legacy config. 969 970Added `spdk_bdev_get_max_active_zones` API to display maximum number active zones of a given bdev. 971 972Added `spdk_bdev_get_max_zone_append_size` API to display maximum zone append data transfer size. 973 974### bdev_nvme 975 976Added support for zoned namespaces. 977 978### blobstore 979 980Removed the `spdk_bdev_create_bs_dev_from_desc` and `spdk_bdev_create_bs_dev` API. 981 982### env 983 984Added `spdk_pci_device_allow` API to allow applications to add PCI addresses to 985the allowed list after the application has started. 986 987Removed the `pci_whitelist`, `pci_blacklist` and `master_core` members of struct `spdk_env_opts`. 988 989Added hotplug support based on uevent in `pci_event.c`. Added usage of this functionality in 990nvme, virtio-scsi and virtio_blk libraries. Please see the new API `spdk_pci_event_listen`, 991`spdk_pci_get_event`, `spdk_pci_register_error_handler` and `spdk_pci_unregister_error_handler`. 992 993### event 994 995Removed the `config_file`, `max_delay_us`, `pci_whitelist` 996and `pci_blacklist` members of struct `spdk_app_opts`. 997 998### idxd 999 1000A new API `spdk_idxd_device_needs_rebalance` was added so that users of the library 1001can know whether they need to rebalance the flow control for the channel 1002that was just added/removed. This is based on how the low level library 1003shares devices amongst channels. 1004 1005The API `spdk_idxd_reconfigure_chan` had the `num_channels` removed as this 1006is now tracked in the library. The app makes use the new API above to 1007determine whether to rebalance or not. This applies to `spdk_idxd_configure_chan` 1008as well. 1009 1010The API `spdk_idxd_put_channel` now returns the rebalance state for the 1011underlying device. 1012 1013### iscsi 1014 1015A security vulnerability has been identified and fixed in the SPDK iSCSI target. 1016A TEXT PDU with no data, but CONTINUE flag set, would result in a NULL pointer dereference 1017and crash the SPDK iSCSI target process. All users of the SPDK iSCSI target 1018are recommended to update. All SPDK versions <= v21.01 are affected. 1019 1020### net 1021 1022The net library is deprecated and will be removed in the 21.07 release. 1023 1024### nvme 1025 1026Added a new function `spdk_nvme_ctrlr_get_regs_pmrcap` to get the PMR capabilities. 1027 1028Added an accelerated table pointer in `spdk_nvme_poll_group` 1029which can be used to provide the accelerated functions by users with 1030hardware engine, such as crc32c accelerated function. 1031 1032Added new functions `spdk_nvme_ctrlr_get_pmrsz`, `spdk_nvme_ctrlr_enable_pmr`, 1033`spdk_nvme_ctrlr_disable_pmr`, `spdk_nvme_ctrlr_map_pmr` and `spdk_nvme_ctrlr_unmap_pmr`. 1034 1035Added NVMe transport operations to enable, disable, map and unmap the PMR. 1036 1037Added `spdk_nvme_qpair_get_optimal_poll_group` function and `qpair_get_optimal_poll_group` 1038function pointer in spdk_nvmf_transport_ops structure in order to add the qpair to the most 1039suitable polling group. 1040 1041Added OPTPERF and namespace optimal performance fields to nvme_spec.h. 1042 1043Added `spdk_nvme_set_hotplug_filter` API to allow applications to choose which 1044hot-inserted SSDs should be probed. This is useful for use cases where multiple 1045independent SPDK processes are running on one node. The filter function can 1046then be implemented in these processes to decide which SSDs to probe based on 1047the new SSD's PCI address. 1048 1049New functions `spdk_nvme_poll_group_get_stats` and `spdk_nvme_poll_group_free_stats` 1050were added. These functions allow to get transport statistics per NVME poll group. 1051 1052Added `spdk_nvme_map_cmd` API to map the NVMe command with SGL cases. 1053 1054Added support for vector variant of ZNS zone append commands with new API 1055`spdk_nvme_zns_zone_appendv` and `spdk_nvme_zns_zone_appendv_with_md`. 1056 1057Added `spdk_nvme_zns_ns_get_max_open_zones` and `spdk_nvme_zns_ns_get_max_active_zones` API, 1058to display maximum number of open and active zones of the given namespace. 1059 1060Added `spdk_nvme_zns_ns_get_zone_size_sectors` API to provide size of zone in number of 1061sectors. 1062 1063Added `spdk_nvme_qpair_get_id` API to display the ID of the specified qpair. 1064 1065### nvmf 1066 1067Removed the `spdk_nvmf_tgt_listen` and `spdk_nvmf_subsystem_add_ns` API. 1068 1069Added new APIs: 1070 1071- `spdk_nvmf_poll_group_dump_stat` (function in `nvmf.h`). 1072- `poll_group_dump_stat` (transport op in `nvmf_transport.h`). 1073 1074The following APIs have been deprecated and will be removed in SPDK 21.07: 1075 1076- `spdk_nvmf_poll_group_get_stat` (function in `nvmf.h`), 1077- `spdk_nvmf_transport_poll_group_get_stat` (function in `nvmf.h`), 1078- `spdk_nvmf_transport_poll_group_free_stat`(function in `nvmf.h`), 1079- `spdk_nvmf_rdma_device_stat` (struct in `nvmf.h`), 1080- `spdk_nvmf_transport_poll_group_stat` (struct in `nvmf.h`), 1081- `poll_group_get_stat` (transport op in `nvmf_transport.h`), 1082- `poll_group_free_stat` (transport op in `nvmf_transport.h`). 1083 1084See header files for details. 1085 1086The `trtype` field in JSON returned by `nvmf_get_stats` RPC contains now the name of the transport, 1087which is the same as the type for defined transports and more informative for a custom transport. 1088 1089Added `hdgst` and `ddgst` parameters to `bdev_nvme_attach_controller` RPC in order change 1090state of TCP header and data digest. 1091 1092Added `num_cqe` parameter to `nvmf_create_transport` RPC to set number of completion queues (CQ) 1093for RDMA transport. Useful when CQ resize operation is not supported, for example iWARP. 1094 1095### ocf 1096 1097Updated OCF submodule to v20.12.2 1098 1099Added `bdev_ocf_set_cache_mode` RPC to dynamically switch cache mode of OCF bdev. 1100 1101### opal 1102 1103Removed the `spdk_opal_supported` API. 1104 1105### raid 1106 1107For `bdev_raid_create` RPC, the deprecated parameter `strip_size` was removed. 1108 1109### rpc 1110 1111New RPC `bdev_nvme_get_transport_statistics` was added, it allows to get transport statistics 1112of nvme poll groups. 1113 1114Parameter `enable-zerocopy-send` of RPC `sock_impl_set_options` is deprecated and will be removed in SPDK 21.07, 1115use `enable-zerocopy-send-server` or `enable-zerocopy-send-client` instead. 1116Parameter `disable-zerocopy-send` of RPC `sock_impl_set_options` is deprecated and will be removed in SPDK 21.07, 1117use `disable-zerocopy-send-server` or `disable-zerocopy-send-client` instead. 1118 1119Added cmd_parser.py used to parse the args from argparse. There are 1120two benefit to use command parser: 1121 1122- Simplify the definition of rpc method. It will reduce the rpc method code. 1123- Make the rpc call more versatile. User can add private args into rpc method. 1124 1125### rpm 1126 1127Added support for new RPM spec, rpmbuild/spdk.spec, which can be used for packaging the 1128SPDK. The pkg/spdk.spec is considered to be deprecated and scheduled for removal in SPDK 21.07. 1129See [RPM documentation](https://spdk.io/doc/rpm.html) for more details. 1130 1131### sock 1132 1133The type of `enable_placement_id` in struct `spdk_sock_impl_opts` is changed from 1134bool to int. We can use RPC to configure different value of `enable_placement_id`. 1135Then we can leverage SO_INCOMING_CPU to get placement_id, which aims to utilize 1136CPU cache locality, enabled by setting enable_placement_id=2. 1137 1138A new socket placement mode called PLACEMENT_MARK has been added. Some NICs allow 1139sockets to be marked using the SO_MARK socket option as a hint for which hardware 1140queue they should be associated with. This mode leverages that by setting the same 1141value for all sockets within a poll group. 1142 1143New parameters `enable_zerocopy_send_server` and `enable_zerocopy_send_client` were added 1144to struct spdk_sock_impl_opts, these parameters enable or disable zero copy send for server 1145and client sockets which are created using `spdk_sock_listen` and `spdk_sock_listen_ext` (server); 1146`spdk_sock_connect` and `spdk_sock_connect_ext` (client) functions. Existing parameter 1147`enable_zerocopy_send` enables or disables zero copy send for both server and client sockets. 1148 1149### thread 1150 1151A new API `spdk_io_channel_get_io_device` was added to get the io_device for the specified 1152I/O channel. 1153 1154Added `spdk_thread_set_interrupt_mode` function in order to set present spdk_thread into 1155interrupt mode or back to poll mode. It is valid only when thread interrupt facility is 1156enabled by `spdk_interrupt_mode_enable`. 1157 1158Added `spdk_poller_register_interrupt` function to mark that the poller is capable of 1159entering interrupt mode. Callback function will be called when the poller must transition 1160into or out of interrupt mode. 1161 1162### virtio 1163 1164Added the `bdev_virtio_blk_set_hotplug` RPC for the virtio blk pci device. 1165 1166## v21.01 1167 1168### bdev 1169 1170An `opts_size` element was added in the `spdk_bdev_opts` structure to solve the 1171ABI compatibility issue between different SPDK version. And also add `opts_size` 1172parameter in spdk_bdev_get_opts function. Two fields `small_buf_pool_size` and 1173`large_buf_pool_size` were added into spdk_bdev_opts, which were used to determine 1174the small and large buffer pool size of the whole bdev module. 1175 1176A new API `spdk_bdev_wait_for_examine` was added to allow for checking state of 1177examine process. Along with corresponding `bdev_wait_for_examine` RPC, which 1178is now always called during `spdk_bdev_subsystem_config_json` making sure 1179every bdev is ready to be used. 1180 1181A new API `spdk_bdev_io_get_aio_status` was added for getting the status of 1182bdev_io as Linux AIO errno. Also `spdk_bdev_io_complete_aio_status` function 1183and `SPDK_BDEV_IO_STATUS_AIO_ERROR` were added for bdev module to complete 1184a bdev_io with Linux AIO errno. 1185 1186A new API `spdk_bdev_get_module_name` was added for getting block device module name. 1187Also `spdk_bdev_get_module_ctx` was added to obtain a bdev module context for 1188the block device opened by the specified descriptor. 1189 1190Added `max_segment_size` and `max_num_segments` to `spdk_bdev` structure for 1191bdev modules to specify splitting requirements. 1192 1193### blob 1194 1195An `opts_size` element was added in the `spdk_bs_opts` structure to solve the 1196ABI compatibility issue between different SPDK version. And also add `opts_size` 1197parameter in `spdk_bs_opts_init` function. 1198 1199An `opts_size` element was added in the `spdk_blob_opts` structure to solve the 1200ABI compatibility issue between different SPDK version. And also add `opts_size` 1201parameter in `spdk_blob_opts_init` function. 1202 1203An `opts_size` element was added in the `spdk_blob_open_opts` structure to solve the 1204ABI compatibility issue between different SPDK version. And also add `opts_size` 1205parameter in `spdk_blob_open_opts_init` function. 1206 1207### build 1208 1209SPDK now generates pkg-config files to simplify the process of determining which 1210libraries must be linked into an SPDK application. 1211 1212### dpdk 1213 1214Updated DPDK submodule to DPDK 20.11. 1215 1216Removed `--with-igb-uio-driver` configure option. Since DPDK 20.11 igb_uio driver 1217was moved to separate dpdk-kmods repository. If required, users need to refer to 1218dpdk-kmods repository to build the driver. 1219 1220### env 1221 1222The `pci_whitelist`, `pci_blacklist` and `master_core` members of struct `spdk_env_opts` 1223have been deprecated. The new members are named `pci_allowed`, `pci_blocked` and 1224`main_core` respectively. 1225 1226An `opts_size` element was added in the `spdk_app_opts` structure 1227to solve the ABI compatibility issue between different SPDK version. An `opts_size` 1228parameter is added into `spdk_app_opts_init` function. 1229 1230### event 1231 1232The `pci_whitelist` and `pci_blacklist` members of struct `spdk_app_opts` have been 1233deprecated. The new members are named `pci_allowed` and `pci_blocked` respectively. 1234 1235The `--pci-blacklist` command line option has been deprecated, replaced with 1236`--pci-blocked`. 1237 1238The `--pci-whitelist/-W` command line options have been deprecated, replaced with 1239`--pci-allowed/-A`. 1240 1241Added new experimental `dynamic` scheduler that rebalances idle threads, adjusts CPU frequency 1242using dpdk_governor and turns idle reactor cores to interrupt mode. Please see 1243[scheduler documentation](https://www.spdk.io/doc/scheduler.html) for details. 1244 1245## ioat 1246 1247The PCI BDF whitelist option has been removed from the `ioat_scan_accel_engine` RPC. 1248IOAT PCI functions can still be allowed or denied using SPDK application command 1249line options. 1250 1251### isa-l 1252 1253Updated ISA-L submodule to v2.30.0. 1254 1255### json 1256 1257A new API `spdk_jsonrpc_send_bool_response` was added to allow sending response for 1258writing json bool results into one function. 1259Update API `bdev_nvme_set_options` and add a `keep_alive_timeout_ms` parameter. Now you 1260can specify the `keep_alive_timeout` before creating NVMe bdev. 1261 1262### nbd 1263 1264Change the return type of function `spdk_nbd_stop` from void to int. And update the 1265`spdk_nbd_fini` with two parameters to make its behavior from sync to async. 1266 1267### nvme 1268 1269Directives support was added to the NVMe driver. 1270 1271Two async APIs `spdk_nvme_ctrlr_cmd_directive_receive` and `spdk_nvme_ctrlr_cmd_directive_send` 1272are added for Directive Send and Directive Receive command, respectively. 1273 1274Added a new function `spdk_nvme_ctrlr_reset_subsystem` to perform a NVMe 1275subsystem reset. Note: The NVMe-oF target does not support the subsystem reset yet. 1276 1277Add a new function `spdk_nvme_bytes_to_numd` to transfer bytes to number of 1278dwords. 1279 1280Added a new custom transport `SPDK_NVME_TRANSPORT_VFIOUSER` to enable NVMe 1281driver running with NVMe over vfio-user target. 1282 1283Added the vfio-user custom transport implementation in NVMe driver which can connect 1284to NVMe over vfio-user target via vfio-user transport. 1285 1286Added a new function `spdk_nvme_ctrlr_set_remove_cb` to remove or override 1287`remove_cb` and `remove_ctx` specified when the controller was probed. 1288 1289Added support for ZNS zone append command with new API `spdk_nvme_zns_zone_append` and 1290`spdk_nvme_zns_zone_append_with_md`. 1291 1292### nvmf 1293 1294`nvmf_fc_lld_fini` now takes callback and hence updating FC Broadcom LLD driver 1295to the latest is required. 1296 1297FC transport supported primary tagging and VMID. 1298 1299Broadcom FC LLD driver and SPDK NVMe-oF FC transport consolidated one LLD API, 1300`nvmf_fc_init_poller_queues` into another LLD API `nvmf_fc_init_q`. 1301Hence updating Broadcom FC LLD driver to the latest is required. 1302 1303The functions `destroy` and `qpair_fini` in the transport interface now accept a 1304`cb_fn` and `cb_arg` to call upon completion, and their execution can be asynchronous. 1305 1306The SPDK NVMe-oF target now supports async event notification for discovery log changes. 1307This allows the initiator to create persistent connection to discovery controller and 1308be notified of any discovery log changes. 1309 1310An `opts_size` element was added in the `spdk_nvmf_transport_opts` structure 1311to solve the ABI compatibility issue between different SPDK version. And also add 1312`opts_size` parameter in `spdk_nvmf_transport_opts_init` function. 1313 1314Added a new custom vfio-user transport implementation in NVMe-oF which can provide 1315emulated NVMe devices to QEMU and SPDK NVMe driver. 1316 1317Added new API `spdk_nvmf_tgt_listen_ext` that uses `spdk_nvmf_listen_opts` to allow 1318passing generic options to specific transport. This functionality replaces one provided 1319with `nvmf_subsystem_set_options`. Also removed `nvmf_subsystem_set_options` RPC 1320that allowed transport specific options within subsystem. 1321 1322The `trsvcid` in `nvmf_subsystem_add_listener` RPC is now optional. 1323 1324Pausing a subsystem now only pauses all admin queues. This allows for the 1325management of hosts and listeners, plus the addition of namespaces without a 1326full subsystem pause. Additionally, the target now allows for pausing 1327individual namespaces within a subsystem. To remove a namespace from a 1328subsystem, only the specific namespace must be paused. I/O will continue to 1329other namespaces while these operations execute. 1330 1331### rpc 1332 1333An new optional parameter `wait` was added to the RPC `iscsi_create_portal_group`, 1334and an new RPC `iscsi_start_portal_group` was added. They will be used not to start 1335listening on portals for a portal group until all associated target nodes are created 1336at startup, otherwise some iSCSI initiators may fail to re-login when SPDK iSCSI 1337target application restarts. 1338 1339Two optional parameter `--small-buf-pool-size` and `--large-buf-pool-size` were added 1340into `bdev_set_options` function. 1341 1342### vhost 1343 1344Added optional `packed_ring_recovery` parameter to `vhost_create_blk_controller` RPC 1345enabling packed ring live recovery. 1346 1347## v20.10 1348 1349### accel 1350 1351New APIs `spdk_accel_batch_cancel` and `spdk_idxd_batch_cancel` were added to allow 1352cancelling a batch sequence. 1353 1354### bdev 1355 1356A new `spdk_bdev_part_base_construct_ext` function has been added and the 1357`spdk_bdev_part_base_construct` has been deprecated. The 1358`spdk_bdev_part_base_construct_ext` function takes bdev name as an argument instead 1359of bdev structure to avoid a race condition that can happen when the bdev is being 1360removed between a call to get its structure based on a name and actually opening it. 1361 1362Removed `spdk_bdev_config_text` function for bdev modules to report legacy config. 1363 1364### blobstore 1365 1366A new `spdk_bdev_create_bs_dev_ext` function has been added and `spdk_bdev_create_bs_dev_from_desc` 1367function has been deprecated. 1368 1369### dpdk 1370 1371Updated DPDK submodule to DPDK 20.08. 1372 1373### env 1374 1375A new API `spdk_mem_get_fd_and_offset` was added to get file descriptor and offset for 1376a given virtual address. 1377 1378### event 1379 1380Removed `spdk_subsystem_config` callback for submodules as part of legacy config removal. 1381 1382Removed `spdk_app_get_running_config` function that printed configuration in legacy format, 1383and removed `usr1_handler` from `struct spdk_app_opts` callback that was used to call it. 1384 1385Added SPDK thread scheduler framework which is used to rebalance load among CPU cores. 1386The scheduler implementation is pluggable and two schedulers are added first, `static` scheduler 1387and `gscheduler` scheduler. 1388 1389`static` scheduler is used by default and does not reschedule threads and keeps the initial 1390assignments. 1391 1392CPU frequency governor framework and implementation are also added. 1393`dpdk_governor` is the first implementation and is based on rte_power library of DPDK. 1394`gscheduler` scheduler utilizes the CPU frequency governor. 1395 1396Scheduler and governor frameworks are experimental features. 1397 1398### fio 1399 1400Bdev fio_plugin no longer supports legacy configuration files. Options `spdk_conf` and 1401`spdk_json_conf` have to point to valid JSON configuration. 1402 1403### gpt 1404 1405Removed option to disable GPT probing via legacy configuration. Please use generic 1406bdev functionality to replicate the behavior. See `bdev_set_options --disable-auto-examine` 1407and `bdev_examine` RPC. 1408 1409### intel-ipsec-mb 1410 1411Updated intel-ipsec-mb submodule to v0.54 1412 1413### isa-l 1414 1415Updated ISA-L submodule to v2.29.0. 1416 1417### iscsi 1418 1419The iSCSI target supports iSCSI login redirection feature to achieve fault tolerance 1420and load balancing particularly in scale out iSCSI target system, which runs multiple 1421SPDK iSCSI targets. 1422 1423### json 1424 1425A new API `spdk_json_decode_object_relaxed` was added to allow parsing json values 1426even if decoder for a given key is not found. 1427 1428A new API `spdk_json_free_object` was added to free memory allocated by `spdk_json_decode_object`. 1429 1430### log 1431 1432A log flag structure, `spdk_log_register_flag`, `spdk_log_get_first_flag`, 1433`spdk_log_get_next_flag` and macro `SPDK_LOG_REGISTER_COMPONENT`, have been added which 1434enable registering and interacting with log flags. Added `SPDK_INFOLOG`, `SPDK_DEBUGLOG` 1435and `SPDK_LOGDUMP` macros to display logs for specified log flag. 1436 1437The log flags in the event framework `-L` and several SPDK applications has been enabled on 1438release builds of SPDK. On debug builds this option will additionally set 1439log print level to `SPDK_LOG_DEBUG`. 1440 1441A new API `spdk_log_enable_timestamps` and new RPC `log_enable_timestamps` was added to 1442toggle log timestamps. 1443 1444### miscellaneous 1445 1446The contents of the log_rpc library have been moved to the event library. The log_rpc 1447library now no longer exists. 1448 1449The contents of the app_rpc library have been moved to the event library. The app_rpc 1450library now no longer exists. 1451 1452The contents of the bdev_rpc library have been moved to the bdev library. The app_rpc 1453library now no longer exists. 1454 1455The bdevperf application now disables the zcopy API by default. Prior to this change, 1456bdevperf enabled using the zcopy API by default which caused a performance impact of 1457up to 25% on bdevs that don't natively support zcopy because the API emulates zero-copy 1458by allocating a buffer. The bdevperf `-x` param was renamed to `-Z` and the default 1459value changed to false. For bdevs that support zcopy, use the -Z flag to enable 1460using zcopy API. 1461 1462### net 1463 1464Net framework intended for use by user-space TCP stacks was removed. 1465 1466### nvme 1467 1468Zoned Namespace Command Set support has been added to NVMe driver, see `nvme_zns.h` for details. 1469 1470New APIs, `spdk_nvme_detach_async` and `spdk_nvme_detach_poll_async`, have been added to 1471detach multiple controllers in parallel to mitigate lengthy shutdown notification of 1472a few NVMe SSDs. 1473 1474New APIs, `spdk_nvme_ns_get_ana_group_id` and `spdk_nvme_ns_get_ana_state`, have been 1475added to get ANA group ID and ANA state of the given namespace, respectively. 1476 1477If no specific command set is requested (by setting the command_set member in the 1478`spdk_nvme_ctrlr_opts` structure), SPDK will automatically select the most appropriate 1479command set based on what the controller supports. 1480 1481### nvmf 1482 1483A new API `spdk_nvmf_subsystem_add_ns_ext` has been added and the API `spdk_nvmf_subsystem_add_ns` 1484has been deprecated. 1485 1486The NVMe-oF target now supports Asymmetric Namespace Access (ANA) Reporting to provide 1487multipath to NVMe-oF initiator. 1488 1489Add `no_wr_batching` parameter to `spdk_nvmf_transport_opts` struct to disable 1490Work Requests batching in RDMA transport. 1491 1492NVMf Target transports can now parse any additional JSON params in the nvmf_create_transport RPC 1493through the JSON context provided via spdk_nvmf_target_opts->transport_specific. 1494 1495A new RPC `nvmf_subsystem_set_options` was added to allow transport specific options within subsystem. 1496 1497A new API `spdk_nvmf_transport_stop_listen_async` was added to stop accepting new connections 1498at the provided address. `nvmf_subsystem_remove_listener` RPC now uses this function. 1499 1500A new API `spdk_nvmf_subsystem_disconnect_host` was added to disconnect all connections 1501originating from the provided hostnqn. `nvmf_subsystem_remove_host` RPC now uses this function. 1502 1503### ocf 1504 1505Updated OCF submodule to v20.03.1 1506 1507### rpc 1508 1509New optional parameters, `enable_placement_id` and `enable_quickack` were added to the 1510`sock_impl_set_options` RPC. 1511 1512A new RPC `bdev_examine_bdev` was added to allow users to examine a bdev explicitly. 1513It can be used only if bdev_auto_examine is set to false by the RPC `bdev_set_options`. 1514 1515New optional parameters `no_wr_batching` and `control_msg_num` were added to the RPC 1516'nvmf_create_transport'. 1517 1518New RPCs, `iscsi_target_node_set_redirect` and `iscsi_target_node_request_logout`, have 1519been added, and a new optional parameter `private` has been added to the RPC 1520`iscsi_create_portal_group` to support iSCSI login redirection feature. 1521 1522A new optional parameter `ana_reporting` was added to the RPC `nvmf_create_subsystem`, and 1523a new RPC `nvmf_subsystem_listener_set_ana_state` was added for ANA reporting. 1524 1525New RPCs, `nvmf_subsystem_get_listeners` and `nvmf_subsystem_get_qpairs`, were added to 1526retrieve configuration of the NVMe-oF subsystem. 1527 1528### scsi 1529 1530Two new APIs have been added `spdk_scsi_dev_construct_ext` and 1531`spdk_scsi_dev_add_lun_ext` that allow the upper layer(e.g. vhost-scsi) to 1532receive the notification when the scsi bdev has been resized. 1533 1534The `spdk_scsi_dev_construct` and `spdk_scsi_dev_add_lun` eventually may be 1535deprecated and removed. 1536 1537### sock 1538 1539The `enable_placement_id` field was added in the `struct spdk_sock_impl_opts` to 1540make the placement_id feature configurable by users. The default setting is 1541not enabled. 1542 1543The `enable_quick_ack` field was added in the `struct spdk_sock_impl_opts` to enable 1544or disable quick ack for the POSIX sock module. The default setting is not enabled. 1545 1546### thread 1547 1548`fd_group` is applied to support interrupt mode. 1549New APIs were added to support an experimental interrupt mode. This allows modules or 1550libraries to selectively register file descriptors that the spdk_thread can wait on, 1551as an alternative to polling. In v20.10, this functionality is enabled in a very small 1552subset of SPDK libraries and modules. 1553 1554### util 1555 1556A new utility named `fd_group` was add. It is now 1557implemented by epoll on Linux platform. It can be used by 1558spdk_thread and reactor to implement interrupt mode. 1559 1560Added `spdk_bit_pool` utility, see `bit_pool.h` for details. 1561 1562### vhost 1563 1564SPDK has switched to DPDK's rte_vhost library since 19.07 release, removed the internal 1565rte_vhost library which is used for DPDK older than 19.05, removed the experimental vhost 1566nvme target which depends on the internal rte_vhost library. 1567 1568### vpp 1569 1570Removed socket abstraction for VPP. 1571 1572## v20.07: SPDK CSI driver, new accel_fw commands, I/O abort support 1573 1574spdk_json_free_object() was added to free memory allocated by spdk_json_decode_object(). 1575 1576### accel 1577 1578A new API was added `spdk_accel_get_capabilities` that allows applications to 1579query the capabilities of the currently enabled accel engine back-end. 1580 1581A new capability, CRC-32C, was added via `spdk_accel_submit_crc32c`. 1582 1583The software accel engine implementation has added support for CRC-32C. 1584 1585A new capability, compare, was added via `spdk_accel_submit_compare`. 1586 1587The software accel engine implementation has added support for compare. 1588 1589Several APIs were added to `accel_engine.h` to support batched submission 1590of operations. 1591 1592Several APIs were added to `accel_engine.h` to support dualcast operations. 1593 1594### accel_fw 1595 1596The accel_fw was updated to no longer require the app to allocate an 1597accel_task on its behalf. All public APIs now take a callback arg as 1598the parameter that used to be the accel_task. 1599 1600The accel_fw API `spdk_accel_task_size` was removed as it is no longer 1601required. 1602 1603The accel_fw was updated to support compare, dualcast, crc32c. 1604 1605The accel_fw introduced batching support for all commands in all plug-ins. 1606See docs for detailed information. 1607 1608### bdev 1609 1610A new API `spdk_bdev_abort` has been added to submit abort requests to abort all I/Os 1611whose callback context match to the bdev on the given channel. 1612 1613### build 1614 1615The fio plugins now compile to `build/fio` and are named `spdk_bdev` and `spdk_nvme`. 1616Existing fio configuration files will need to be updated. 1617 1618### dpdk 1619 1620Updated DPDK submodule to DPDK 20.05. 1621 1622### env 1623 1624Several new APIs have been added to provide greater flexibility in registering and 1625accessing polled mode PCI drivers. See `env.h` for more details. 1626 1627### idxd 1628 1629The idxd library and plug-in module for the accel_fw were updated to support 1630all accel_fw commands as well as batching. Batching is supported both 1631through the library and the plug-in module. 1632 1633IDXD engine support for CRC-32C has been added. 1634 1635### ioat 1636 1637A new API `spdk_ioat_get_max_descriptors` was added. 1638 1639### nvme 1640 1641An `opts_size`element was added in the `spdk_nvme_ctrlr_opts` structure 1642to solve the ABI compatibility issue between different SPDK version. 1643 1644A new API `spdk_nvme_ctrlr_cmd_abort_ext` has been added to abort previously submitted 1645commands whose callback argument match. 1646 1647Convenience functions, `spdk_nvme_print_command` and `spdk_nvme-print_completion` were added 1648to the public API. 1649 1650A new function, `spdk_nvmf_cuse_update_namespaces`, updates the cuse representation of an NVMe 1651controller. 1652 1653A new function `qpair_iterate_requests` has been added to the nvme transport interface. ALl 1654implementations of the transport interface will have to implement that function. 1655 1656### nvmf 1657 1658The NVMe-oF target no longer supports connecting scheduling configuration and instead 1659always uses what was previously called "transport" scheduling. 1660 1661`spdk_nvmf_tgt_accept` no longer exists. The accept process now occurs automatically after 1662the creation of an nvmf target and queue pairs are assigned to poll groups by the underlying 1663transport. Further, `spdk_nvmf_transport_ops` has changed such that the accept function 1664pointer no longer takes a function pointer as an argument. Instead, transports should call 1665`spdk_nvmf_tgt_new_qpair` whenever they previously would have called that callback. 1666 1667The NVMe-oF target now supports aborting any submitted NVM or Admin command. Previously, 1668the NVMe-oF target could abort only Asynchronous Event Request commands. 1669 1670### rdma 1671 1672A new `rdma` library has been added. It is an abstraction layer over different RDMA providers. 1673Two providers are available - verbs (used by default when RDMA is enabled or enabled explicitly 1674using --with-rdma=verbs) and mlx5 Direct Verbs aka DV (enabled by --with-rdma=mlx5_dv). 1675Using mlx5_dv requires libmlx5 installed on the system. 1676 1677### rpc 1678 1679Parameter `-p` or `--max-qpairs-per-ctrlr` of `nvmf_create_transport` RPC command accepted by the 1680rpc.py script is deprecated, new parameter `-m` or `--max-io-qpairs-per-ctrlr` was added. 1681 1682Added `sock_impl_get_options` and `sock_impl_set_options` RPC methods. 1683 1684Command line parameters `-r` and `--rpc-socket` will longer accept TCP ports. RPC server 1685must now be started on a Unix domain socket. Exposing RPC on the network, as well as providing 1686proper authentication (if needed) is now a responsibility of the user. 1687 1688The `bdev_set_options` RPC has a new option, `bdev_auto_examine` to control the auto examine function 1689of bdev modules. 1690 1691New RPCs `sock_impl_get_options` and `sock_impl_set_options` been added to expose new socket features. 1692See `sock` section for more details. 1693 1694### sock 1695 1696Added `spdk_sock_impl_get_opts` and `spdk_sock_impl_set_opts` functions to set/get socket layer configuration 1697options. Options can be set independently for each implementation. 1698 1699Added `recv_buf_size` and 'send_buf_size' socket layer options. They are used only in posix implementation. 1700 1701Added `uring` based socket implementation, the code is located in module/sock/uring. This feature is only 1702available in Linux which requires kernel version is greater than 5.4.3. Currently, our CI pool added the uring 1703based socket tests for iSCSI target and also the tests for SPDK NVMe-oF tcp transport. 1704 1705Added `enable_recv_pipe` socket layer option to allow disabling of double buffering on receive. 1706New option is used only in posix implementation. 1707 1708Added `enable_zerocopy_send` socket layer option to allow disabling of zero copy flow on send. 1709New option is used only in posix implementation. 1710 1711### util 1712 1713Some previously exposed CRC32 functions have been removed from the public API - 1714`spdk_crc32_update`, `spdk_crc32_table_init`, and the `spdk_crc32_table` struct. 1715 1716### vhost 1717 1718The function `spdk_vhost_blk_get_dev` has been removed. 1719 1720## v20.04: SPDK Top, IDXD, NVMe qpair groups 1721 1722IDXD engine support for compare has been added. 1723 1724### configuration 1725 1726Legacy INI style configuration for SPDK applications has been deprecated and will be 1727removed in future release. 1728Please switch to JSON-RPC configuration files and/or RPC driven run-time configuration. 1729 1730### copy 1731 1732The copy engine library, modules and public APIs have been renamed. Use of the word `copy` 1733has been replaced with the word `accel` short for accelerator in preparation for adding new 1734capabilities in the future. Additionally, APIs for what was previously called the `memcpy` 1735engine have been renamed to identify the engine as a software accelerator. 1736 1737### crypto 1738 1739Support for AES_XTS was added for the QAT polled mode driver (pmd). The create RPC 1740`bdev_crypto_create` has 2 new optional parameters: cipher and key2. Cipher can be either 1741AES_CBC (default) or AES_XTS. AES_XTS is only valid when using the QAT polled mode driver. 1742The key2 parameter is the second key required for AES_XTS. 1743 1744### event 1745 1746Reactors now accumulate CPU stats and they are retrieved by the RPC `framework_get_reactors`. 1747 1748### idxd 1749 1750IDXD support was added in the form of a low level library that can directly 1751utilize the IDXD offload engine as well as an accel plug-in module allowing for use 1752with the generic accel framework API. IDXD is the first in a family of offload 1753engines that share the same interface, specifically DSA is added here. More info 1754can be found here: https://01.org/blogs/2019/introducing-intel-data-streaming-accelerator 1755 1756Much of the implementation models IOAT, however the low level interfaces are very 1757different. The RPC to enable IDXD requires a configuration number as well. The 1758code includes two pre-defined configurations of IDXD groups/work queues/engines. A future 1759version will provide an interface to allow for setting of individual configuration 1760parameters. 1761 1762IDXD is not yet available so this feature should be considered experimental. It will 1763be built up with additional documentation as an ongoing activity. 1764 1765### iscsi 1766 1767The iSCSI target now creates a lightweight thread per poll group instead of assuming a pool 1768of lightweight threads already exist at start up time. A poll group is a collection of 1769unrelated iSCSI connections. Each poll group is only accessed from the associated 1770lightweight thread. 1771 1772### ftl 1773 1774Several changes have been made to the `spdk_ftl_conf`, `spdk_ftl_dev_init_ops`, and 1775`spdk_ftl_attrs` structs. Please see `include/spdk/ftl.h` for more details. 1776 1777### miscellaneous 1778 1779The `--json-ignore-init-errors` command line parameter has been added to ignore 1780initialization errors on JSON config load. 1781 1782The public header file io_channel.h has been removed. Please use thread.h which has the 1783exact same API. 1784 1785### nvme 1786 1787Exported internal nvme_ctrlr_cmd_security_receive/send() APIs as public APIs with "the spdk_" 1788prefix. 1789 1790Added `priority` field in `spdk_nvme_transport_id`, this field is used to specify the priority 1791of the NVMe-oF connection, and currently it is used for NVMe-oF tcp connection. 1792 1793A new poll group API has been added to allow for pooling of nvme qpairs across a single 1794entity which can be polled for completions. This new API consists of the `spdk_nvme_poll_group` 1795family of functions. As a result of this new API, all NVMe transports are expected to implement 1796several poll group related functions. 1797 1798A new flag, `create_only`, has been added to the `spdk_nvme_io_qpair_opts` structure. This flag 1799allows a user to call `spdk_nvme_ctrlr_get_default_io_qpair` without also connecting the qpair 1800within the context of that call. 1801 1802As a result of the `create_only` flag, two new API functions, `spdk_nvme_ctrlr_connect_io_qpair` 1803and `spdk_nvme_ctrlr_disconnect_io_qpair`, have been added to facilitate connecting newly created 1804qpairs (for example, after they have been added to a poll group) and disconnecting qpairs without 1805destroying them (for example to disconnect a qpair before migrating it to a new poll group and 1806reconnecting it). 1807 1808The functions `spdk_nvme_ctrlr_alloc_cmb_io_buffer` and `spdk_nvme_ctrlr_free_cmb_io_buffer` 1809have been changed to `spdk_nvme_ctrlr_map_cmb` and `spdk_nvme_ctrlr_unmap_cmb` respectively. 1810 1811An additional function, `spdk_nvme_ctrlr_reserve_cmb`, has been added to facilitate reserving 1812the entire size of the controller memory buffer for data transfer. 1813 1814### nvme_cuse 1815 1816`spdk_nvme_cuse_get_ctrlr_name` now takes two additional parameters, `char *name` which 1817stores the pointer to the controller name, and `size_t *size` which stores the length of 1818the name. The return type has also been changed from char * to int. 1819 1820`spdk_nvme_cuse_get_ns_name` now takes two additional parameters, `char *name` which 1821stores the pointer to the namespace name, and `size_t *size` which stores the length of 1822the name. The return type has also been changed from char * to int. 1823 1824### nvme_opal 1825 1826Several public OPAL structure definitions have been changed since the last release. 1827 1828### nvmf 1829 1830`spdk_nvmf_poll_group_destroy()` is now asynchronous and accepts a completion callback. 1831 1832The NVMe-oF target now creates a lightweight thread per poll group instead of assuming a pool 1833of lightweight threads already exist at start up time. A poll group is a collection of 1834unrelated NVMe-oF connections. Each poll group is only accessed from the associated 1835lightweight thread. 1836 1837A new struct, `spdk_nvmf_subsystem_listener`, has been added to encapsulate the subsystem specific 1838nature of a listener object. 1839 1840`spdk_nvmf_tgt_listen` no longer accepts a callback function or argument. It also returns an 1841int to indicate the status of the listen call. 1842 1843The execution of `spdk_nvme_poll_group_destroy` is now asynchronous and the function accepts 1844a cb_fn and cb_arg to call upon completion. 1845 1846The execution of `spdk_nvmf_subsystem_add_listener` is now asynchronous and the function accepts 1847a cb_fn and cb_arg to call upon completion. 1848 1849The `nvmf_transport.h` header has been made public to allow custom NVMe-oF transports to integrate 1850with NVMe-oF libraries without using internal APIs. 1851 1852### ocf 1853 1854Updated the OCF submodule to OCF v20.03 1855 1856New version of OCF comes with API changes and bug fixes 1857 1858### rpc 1859 1860A new RPC `thread_set_cpumask` has been added to set the cpumask of the thread 1861to the specified value. 1862 1863A new RPC `thread_get_pollers` has been added to retrieve pollers from SPDK threads. 1864 1865A new RPC `thread_get_io_channels` has been added to retrieve I/O channels from SPDK threads. 1866 1867A new RPC `bdev_rbd_resize` has been added to resize Ceph RBD bdevs. 1868 1869### sock 1870 1871The `spdk_sock_set_priority` function has been removed since the feature to set the sock priority 1872will be contained in two new functions, i.e., `spdk_sock_listen_ext` and `spdk_sock_connect_ext`. 1873Users may now specify the priority of the socket in the opts that they want to use. 1874 1875### spdk_top 1876 1877A new application, `spdk_top`, has been added which allows users to monitor resource consumption 1878by a running SPDK application. More information on this application can be found in 1879`app/spdk_top/README`. 1880 1881### thread 1882 1883A new function `spdk_thread_lib_init_ext` has been added, and the function 1884`spdk_thread_lib_init` has been deprecated. The user of `spdk_thread_lib_init_ext` is 1885expected to implement both functions `spdk_thread_op_fn` and `spdk_thread_op_supported_fn`. 1886`spdk_thread_op_supported_fn` is called to check whether the SPDK thread operation 1887is supported. `spdk_thread_op_fn` is called to execute the SPDK thread operation. 1888Current SPDK operation types are `SPDK_THREAD_OP_NEW` and `SPDK_THREAD_OP_RESCHED`. 1889The operation `SPDK_THREAD_OP_NEW` is called each time a new thread is created. 1890The operation `SPDK_THREAD_OP_RESCHED` is called when SPDK thread needs to be rescheduled. 1891 1892A unique ID has been added for each created SPDK thread, it is retrieved by a new function 1893`spdk_thread_get_id`, and the SPDK thread which has the specific ID is got by 1894a new function `spdk_thread_get_by_id`. 1895 1896A new function `spdk_thread_cpumask` has been added to set the current thread's cpumask 1897to the specified value. The function requires the operation `SPDK_THREAD_OP_RESCHED` 1898is supported. 1899 1900A new function `spdk_poller_register_named` has been added to set arbitrary name to the 1901created poller. If NULL, the name is set to the pointer of the poller function. 1902 1903The function `spdk_thread_poll` now measures run time per call correctly on multiple SPDK 1904threads configuration, and a new function `spdk_thread_get_last_tsc` has been added to use together. 1905 1906Voluntary termination of SPDK thread has been supported by refining the functions `spdk_thread_exit` 1907and `spdk_thread_poll`. 1908 1909### util 1910 1911New functions `spdk_sn32_lt` and `spdk_sn32_gt` have been added. They compare two sequence 1912numbers based on serial number arithmetic. 1913 1914### vhost 1915 1916Poll groups per session have been replaced by SPDK threads per vhost controller. 1917 1918### vmd 1919 1920A new function, `spdk_vmd_fini`, has been added. It releases all resources acquired by the VMD 1921library through the `spdk_vmd_init` call. 1922 1923## v20.01: Optimized thin provisioning, FTL bdev, VMD hot plug, FUSED support 1924 1925### bdev 1926 1927A new function, `spdk_bdev_set_timeout`, has been added to set per descriptor I/O timeouts. 1928 1929A new class of functions `spdk_bdev_compare*`, have been added to allow native bdev support 1930of block comparisons and compare-and-write. 1931 1932A new class of bdev events, `SPDK_BDEV_EVENT_MEDIA_MANAGEMENT`, has been added to allow bdevs 1933which expose raw media to alert all I/O channels of pending media management events. 1934 1935A new API was added `spdk_bdev_io_get_aux_buf` allowing the caller to request 1936an auxiliary buffer for its own private use. The API is used in the same manner that 1937`spdk_bdev_io_get_buf` is used and the length of the buffer is always the same as the 1938bdev_io primary buffer. 'spdk_bdev_io_put_aux_buf' frees the allocated auxiliary 1939buffer. 1940 1941### blobfs 1942 1943Added boolean return value for function spdk_fs_set_cache_size to indicate its operation result. 1944 1945Added `blobfs_set_cache_size` RPC method to set cache size for blobstore filesystem. 1946 1947### blobstore 1948 1949Added new `use_extent_table` option to `spdk_blob_opts` for creating blobs with Extent Table descriptor. 1950Using this metadata format, dramatically decreases number of writes required to persist each cluster allocation 1951for thin provisioned blobs. Extent Table descriptor is enabled by default. 1952See the [Blobstore Programmer's Guide](https://spdk.io/doc/blob.html#blob_pg_cluster_layout) for more details. 1953 1954### dpdk 1955 1956Updated DPDK submodule to DPDK 19.11. 1957 1958### env_dpdk 1959 1960`spdk_env_dpdk_post_init` now takes a boolean, `legacy_mem`, as an argument. 1961 1962A new function, `spdk_env_dpdk_dump_mem_stats`, prints information about the memory consumed by DPDK to a file specified by 1963the user. A new utility, `scripts/dpdk_mem_info.py`, wraps this function and prints the output in an easy to read way. 1964 1965### event 1966 1967The functions `spdk_reactor_enable_framework_monitor_context_switch()` and 1968`spdk_reactor_framework_monitor_context_switch_enabled()` have been changed to 1969`spdk_framework_enable_context_switch_monitor()` and 1970`spdk_framework_context_switch_monitor_enabled()`, respectively. 1971 1972### ftl 1973 1974All NVMe dependencies were removed from ftl library. 1975From now ftl library is using bdev_zone API. 1976bdev_ftl becomes virtual bdev. 1977 1978`ctrlr` and `trid` fields in `spdk_ftl_dev_init_opts` structure were replaced by 1979`base_bdev_desc`. 1980 1981`bdev_ftl_create` RPC method `trtype` and `traddr` parameters were replaced by `base_bdev` 1982parameter. 1983 1984`spdk_ftl_module_init` and `spdk_ftl_module_fini` functions were removed. 1985 1986`spdk_ftl_punit_range` and `ftl_module_init_opts` structures were removed. 1987 1988### isa-l 1989 1990Updated ISA-L submodule to commit f3993f5c0b6911 which includes implementation and 1991optimization for aarch64. 1992 1993Enabled ISA-L on aarch64 by default in addition to x86. 1994 1995### nvme 1996 1997`delayed_pcie_doorbell` parameter in `spdk_nvme_io_qpair_opts` was renamed to `delay_cmd_submit` 1998to allow reuse in other transports. 1999 2000Added RDMA WR batching to NVMf RDMA initiator. Send and receive WRs are chained together 2001and posted with a single call to ibv_post_send(receive) in the next call to qpair completion 2002processing function. Batching is controlled by 'delay_cmd_submit' qpair option. 2003 2004The NVMe-oF initiator now supports plugging out of tree NVMe-oF transports. In order 2005to facilitate this feature, several small API changes have been made: 2006 2007The `spdk_nvme_transport_id` struct now contains a trstring member used to identify the transport. 2008A new function, `spdk_nvme_transport_available_by_name`, has been added. 2009A function table, `spdk_nvme_transport_ops`, and macro, `SPDK_NVME_TRANSPORT_REGISTER`, have been added which 2010enable registering out of tree transports. 2011 2012A new function, `spdk_nvme_ns_supports_compare`, allows a user to check whether a given namespace supports the compare 2013operation. 2014 2015A new family of functions, `spdk_nvme_ns_compare*`, give the user access to submitting compare commands to NVMe namespaces. 2016 2017A new function, `spdk_nvme_ctrlr_cmd_get_log_page_ext`, gives users more granular control over the command dwords sent in 2018log page requests. 2019 2020### nvmf 2021 2022Add SockPriority option in [Transport] section, this can be used for NVMe-oF target 2023on TCP transport to set sock priority for the incoming TCP connections. 2024 2025The NVMe-oF target now supports plugging out of tree NVMe-oF transports. In order 2026to facilitate this feature, several small API changes have been made: 2027 2028The `spdk_nvme_transport_id` struct now contains a trstring member used to identify the transport. 2029`spdk_nvmf_tgt_get_transport`, `spdk_nvmf_transport_opts_init`, and `spdk_nvmf_transport_create` all have been 2030modified to take a string. 2031A function table, `spdk_nvmf_transport_ops`, and macro, `SPDK_NVMF_TRANSPORT_REGISTER`, have been added which 2032enable registering out of tree transports. 2033 2034Add `spdk_nvmf_tgt_stop_listen()` that can be used to stop listening for 2035incoming connections for specified target and trid. Listener is not stopped 2036implicitly upon destruction of a subsystem any more. 2037 2038A custom NVMe admin command handler has been added which allows the user to use the real drive 2039attributes from one of the target NVMe drives when reporting drive attributes to the initiator. 2040This handler can be enabled via the `nvmf_set_config` RPC. 2041Note: In a future version of SPDK, this handler will be enabled by default. 2042 2043The SPDK target and initiator both now include compare-and-write functionality with one caveat. If using the RDMA transport, 2044the target expects the initiator to send both the compare command and write command either with, or without inline data. The 2045SPDK initiator currently respects this requirement, but this note is included as a flag for other initiators attempting 2046compatibility with this version of SPDK. 2047 2048The `spdk_nvme_ctrlr_opts` struct has been extended with new field `transport_ack_timeout` which allows 2049to configure transport ACK timeout. Applicable for RDMA transport only. 2050 2051### rpc 2052 2053A new RPC, `bdev_zone_block_create`, enables creating an emulated zoned bdev on top of a standard block device. 2054 2055A new RPC, `bdev_ocssd_create`, enables creating an emulated zoned bdev on top of an Open Channel SSD. 2056 2057A new RPC, `blobfs_set_cache_size`, enables managing blobfs cache size. 2058 2059A new RPC, `env_dpdk_get_mem_stats`, has been added to facilitate reading DPDK related memory 2060consumption stats. Please see the env_dpdk section above for more details. 2061 2062A new RPC, `framework_get_reactors`, has been added to retrieve a list of all reactors. 2063 2064`bdev_ftl_create` now takes a `base_bdev` argument in lieu of `trtype`, `traddr`, and `punits`. 2065 2066`bdev_nvme_set_options` now allows users to disable I/O submission batching with the `-d` flag 2067 2068`bdev_nvme_cuse_register` now accepts a `name` parameter. 2069 2070`bdev_uring_create` now takes arguments for `bdev_name` and `block_size` 2071 2072`nvmf_set_config` now takes an argument to enable passthru of identify commands to base NVMe devices. 2073Please see the nvmf section above for more details. 2074 2075### scsi 2076 2077`spdk_scsi_lun_get_dif_ctx` now takes an additional argument of type `spdk_scsi_task`. 2078 2079### sock 2080 2081Added spdk_sock_writev_async for performing asynchronous writes to sockets. This call will 2082never return EAGAIN, instead queueing internally until the data has all been sent. This can 2083simplify many code flows that create pollers to continue attempting to flush writes 2084on sockets. 2085 2086Added `impl_name` parameter in spdk_sock_listen and spdk_sock_connect functions. Users may now 2087specify the sock layer implementation they'd prefer to use. Valid implementations are currently 2088"vpp" and "posix" and NULL, where NULL results in the previous behavior of the functions. 2089 2090### thread 2091 2092`spdk_thread_send_msg` now returns int indicating if the message was successfully 2093sent. 2094 2095A new function `spdk_thread_send_critical_msg`, has been added to support sending a single message from 2096a context that may be interrupted, e.g. a signal handler. 2097 2098Two new functions, `spdk_poller_pause`, and `spdk_poller_resume`, have been added to give greater control 2099of pollers to the application owner. 2100 2101### util 2102 2103`spdk_pipe`, a new utility for buffering data from sockets or files for parsing 2104has been added. The public API is available at `include/spdk/pipe.h`. 2105 2106### bdev 2107 2108Added spdk_bdev_io_get_nvme_fused_status function for translating bdev_io status to NVMe status 2109code for fused compare-and-write operation. 2110 2111Added spdk_bdev_get_acwu function for getting block device atomic compare and write unit size. 2112 2113## v19.10: Zoned bdev API, Opal bdev, NVMe character devices 2114 2115### rpc 2116 2117Many of SPDK's RPCs were renamed to be more consistent and intuitive in this release. 2118The old names will continue to function, but will display a deprecation warning. 2119 2120Added optional parameters '--arbitration-burst' and '--low/medium/high-priority-weight' to 2121'bdev_nvme_set_options' RPC method. 2122 2123Added optional parameter '--md-size' to 'construct_null_bdev' RPC method. 2124 2125Added optional parameters '--dif-type' and '--dif-is-head-of-md' to 'construct_null_bdev' 2126RPC method. 2127 2128Added `blobfs_detect` RPC method to detect whether a blobfs exists on given bdev. 2129 2130Added `blobfs_create` RPC method to build blobfs on given bdev. 2131 2132Added `blobfs_mount` RPC method to mount blobfs on given bdev to a host path by FUSE. 2133Then on the host path, user can directly do some file operations which will be mapped 2134to blobfs. 2135 2136### bdev 2137 2138Added new parameter `cdw0` to `spdk_bdev_io_complete_nvme_status()` and 2139`spdk_bdev_io_get_nvme_status()` that allows setting/getting 2140the NVMe completion queue DW0 entry. This allows vendor specific IO commands 2141to return command specific completion info back to the initiator. 2142 2143Added `spdk_bdev_get_write_unit_size()` function for retrieving required number 2144of logical blocks for write operation. 2145 2146New zone-related fields were added to the result of the `get_bdevs` RPC call: 2147 2148- `zoned`: indicates whether the device is zoned or a regular 2149 block device 2150- `zone_size`: number of blocks in a single zone 2151- `max_open_zones`: maximum number of open zones 2152- `optimal_open_zones`: optimal number of open zones 2153 2154The `zoned` field is a boolean and is always present, while the rest is only available for zoned 2155bdevs. 2156 2157A new `spdk_bdev_open_ext` function has been added and `spdk_bdev_open` function has been deprecated. 2158The new open function introduces requirement to provide callback function that will be called by 2159asynchronous event such as bdev removal. `spdk_bdev_open_ext` function takes bdev name as 2160an argument instead of bdev structure to avoid a race condition that can happen when the bdev 2161is being removed between a call to get its structure based on a name and actually opening it. 2162 2163New 'resize' event has been added to notify about change of block count property of block device. 2164Event is delivered only if block device was opened with `spdk_bdev_open_ext` function. 2165 2166### bdev zone 2167 2168Added new public header for zoned bdev. Zoned bdev is an extension 2169of the bdev interface. 2170 2171`spdk_bdev_get_zone_size()`, `spdk_bdev_get_max_open_zones()`, `spdk_bdev_get_optimal_open_zones()` 2172APIs were added for retrieving zoned device information. 2173`spdk_bdev_get_zone_info()` API was added for retrieving information about zones in zoned 2174device. 2175Added `spdk_bdev_zone_management()` API for changing zone state. 2176`spdk_bdev_zone_append()` and `spdk_bdev_zone_append_with_md()` APIs were added for 2177appending data to a zone. 2178Added `spdk_bdev_io_get_append location()` function for retrieving append location for I/O. 2179Added `spdk_bdev_is_zoned()` function for checking if bdev supports zoned namespace semantics. 2180 2181### bdev opal 2182 2183EXPERIMENTAL: A new opal bdev has been added to support management of 2184NVMe self-encrypting drives through the Opal specification. Users can 2185create opal bdevs from an NVMe namespace bdev, if the controller 2186containing that namespace supports Opal. Currently this is only 2187supported for namespace ID=1. The following RPCs have been added to 2188support Opal: `bdev_nvme_opal_init`, `bdev_nvme_opal_revert`, 2189`bdev_opal_create`, `bdev_opal_delete`, `bdev_opal_get_info`, 2190`bdev_opal_new_user`, `bdev_opal_set_lock_state`. 2191It does not yet support recreating the opal bdevs after application restart. 2192This bdev module should be considered very experimental, and the RPCs may 2193change significantly in future releases. 2194 2195### delay bdev 2196 2197The `bdev_delay_update_latency` has been added to allow users to update 2198a latency value for a given delay bdev. 2199 2200### compress bdev 2201 2202A new RPC `bdev_compress_get_orphans` has been added to list compress bdevs 2203that were not loaded due to a missing pm metadata file. In this state they 2204can only be deleted. 2205 2206### null bdev 2207 2208Metadata support has been added to Null bdev module. 2209 2210Protection information support has been added to Null bdev module. 2211 2212### nvme 2213 2214Added `no_shn_notification` to NVMe controller initialization options, users can enable 2215it for NVMe controllers. When the option is enabled, the controller will not do the 2216shutdown process and just disable the controller, users can start their application 2217later again to initialize the controller to the ready state. 2218 2219A controller flag `SPDK_NVME_CTRLR_WRR_SUPPORTED` was added to indicate the controller 2220can support weighted round robin arbitration feature with submission queue. 2221 2222Added `arbitration_burst` option for arbitration feature, and added three 2223`low/medium/high_priority_weight` options for weighted round robin arbitration. 2224 2225Added `spdk_nvme_ns_cmd_write_uncorrectable`. 2226 2227Added new error handling and reporting functionality. This includes several 2228new API functions to facilitate applications recovering when a qpair or 2229controller fails. 2230 2231`spdk_nvme_ctrlr_reconnect_io_qpair` - Reconnects a failed I/O qpair. 2232`spdk_nvme_ctrlr_set_trid` - Sets the trid of an existing controller. Can be used to 2233change the trid for failover cases. 2234`spdk_nvme_ctrlr_is_failed` - Returns the failed state of a controller. 2235`spdk_nvme_ctrlr_fail` - Forces a controller into a failed state. 2236 2237Modified the return behavior of several API functions to better indicate to 2238applications when a qpair is failed. This list of functions includes: 2239 2240`spdk_nvme_qpair_process_completions` 2241`spdk_nvme_ns_cmd_*` 2242`spdk_nvme_ctrlr_process_admin_completions` 2243`spdk_nvme_ctrlr_cmd_*` 2244 2245These functions now return -ENXIO when the qpair or controller on which they 2246operate is failed. 2247 2248EXPERIMENTAL: Added NVMe character device support to allow to create NVMe device nodes in Linux 2249kernel for controller as well as for namespace and process ioctl requests as usual 2250from linux environment. 2251 2252### nvmf 2253 2254The `spdk_nvmf_tgt_create` function now accepts an object of type `spdk_nvmf_target_opts` 2255as its only parameter. This new structure contains the max_subsystems parameter previously 2256passed into that function. 2257 2258A new public API function `spdk_nvmf_get_tgt` has been added which allows users to 2259retrieve a pointer to an `spdk_nvmf_tgt` object by supplying its name. In the special 2260case where an RPC or application only creates a single target, this function can accept 2261a null name parameter and will return the only available target. 2262 2263The majority of the NVMe-oF RPCs now accept an optional tgt_name parameter. This will 2264allow those RPCs to work with applications that create more than one target. 2265 2266Three new NVMe-oF RPCs have been added `nvmf_create_target`, `nvmf_delete_target`, and 2267`nvmf_get_targets`. These new RPCs provide a basic interface for managing multiple target 2268objects. In SPDK the target object defines a unique discovery service. As of this release, 2269these RPCs are not intended to be used with the in-tree SPDK target applications, spdk_tgt and 2270nvmf_tgt, which use a single, global target structure. As such, they are not included in scripts/rpc.py 2271 2272Three new header functions have also been added to help deal with multiple targets. 2273`spdk_nvmf_tgt_get_name` takes a target pointer as an argument and returns its human readable name. 2274`spdk_nvmf_get_first_target` takes no arguments and returns the first target in the global list. 2275`spdk_nvmf_get_next_tgt` takes a target pointer as an argument and returns the next one in the global list. 2276 2277The `spdk_nvmf_tgt_accept` takes additional argument allowing to pass arbitrary context 2278information to the `new_qpair` callback. This will simplify the code when having multiple 2279nvmf targets or when retrieving the context information from globals is not suitable. 2280 2281### blobstore 2282 2283A new `spdk_bdev_create_bs_dev_from_desc` function has been added and `spdk_bdev_create_bs_dev` 2284function has been deprecated. 2285The new create function can cowork with `spdk_bdev_open_ext` function, which provides callback 2286function that will be called by asynchronous event such as bdev removal. 2287 2288### blobfs_bdev 2289 2290A new blobfs module `bdev` has been added to simplify the operations of blobfs on bdev. 2291 2292Function `spdk_blobfs_bdev_detect` is added to detect whether blobfs exists on the given block device. 2293 2294Function `spdk_blobfs_bdev_create` is added to create a blobfs on the given block device. 2295 2296Function `spdk_blobfs_bdev_mount` is added to mount a blobfs on the given block device to 2297a host path by FUSE. Then, a new thread is created dedicatedly for one mountpoint to handle 2298FUSE request by blobfs API. 2299 2300### build 2301 2302Option to build FUSE components into blobfs_bdev module for mounting a blobfs filesystem. 2303It requires the installation of libfuse3. By default, it is disabled. And it will be 2304enabled if run `./configure` with `--with-fuse` option. 2305 2306### iSCSI 2307 2308Portals may no longer be associated with a cpumask. The scheduling of 2309connections is moving to a more dynamic model. 2310 2311An new RPC `iscsi_portal_group_set_auth` has been added to set CHAP authentication 2312for discovery sessions specific for the existing iSCSI portal group. This RPC overwrites 2313the setting by the global parameters for the iSCSI portal group. 2314 2315### socket 2316 2317Added `spdk_sock_is_connected` to check whether the socket is currently connected. 2318`spdk_sock_group_poll` now returns number of events on success. 2319 2320### env 2321 2322Added `spdk_pci_device_unclaim()` function to cleanup pci claim file. 2323 2324### event 2325 2326`framework_start_init` RPC no longer stops the application on error during 2327initialization. 2328 2329### DPDK 2330 2331Updated DPDK submodule to DPDK 19.08. 2332 2333### ocf 2334 2335Updated OCF submodule to OCF v19.06 2336 2337Along with update, new cache mode 'write only' was added. 2338 2339New cache modes added to use via RPC, wi - write invalidate and wa - write around. 2340 2341New version of OCF provides fully asynchronous management API. 2342 2343## v19.07: NVMe-oF FC Transport, VMD, NVMe-oF Persistent reservations, Bdev I/O with separate metadata 2344 2345### ftl 2346 2347EXPERIMENTAL: Added ability to mirror writes to persistent write buffer cache 2348to allow for recovery from dirty shutdown event. 2349 2350Added handling of Asynchronous Nand Management Events (ANM). 2351 2352### vmd 2353 2354EXPERIMENTAL: Added Intel Volume Management Device (VMD) driver. VMD is an integrated 2355controller inside the CPU PCIe root complex. It enables virtual HBAs for the connected 2356NVMe SSDs. `spdk_vmd_init()` enumerates NVMe SSDs behind VMD device and hook them into 2357SPDK PCI subsystem. `spdk_nvme_probe()` or `spdk_nvme_connect()` can be used to connect 2358NVMe driver to the device located at the given transport ID. 2359 2360To obtain transport ID of NVMe SSD behind VMD `spdk_lspci` can be used. 2361 2362Current implementation does not support hotplug. 2363 2364### blobfs 2365 2366Blobfs file asynchronous operations were added to public APIs. 2367 2368### util 2369 2370A new file API `spdk_posix_file_load` was added to load file content into a data buffer. 2371 2372New APIs `spdk_dif_ctx_set_data_offset`, `spdk_dif_verify_stream`, 2373`spdk_dif_get_range_with_md`, `spdk_dif_get_length_with_md` have been added, 2374and existing APIs `spdk_dif_ctx_init`, `spdk_dif_set_md_interleave_iovs`, and 2375`spdk_dif_generate_stream` have been refined to insert or strip DIF into iovs 2376windows of any alignment. 2377 2378New APIs `spdk_dif_ctx_set_remapped_init_ref_tag`, `spdk_dif_remap_ref_tag`, 2379and `spdk_dix_remap_ref_tag` have been added to remap DIF reference tag. 2380 2381New APIs `spdk_dif_update_crc32c` and `spdk_dif_update_crc32c_stream` have been 2382added to compute CRC-32C checksum for extended LBA payload. 2383 2384Bdevperf and bdevio applications now support starting tests with application specific 2385RPCs. Please see helper Python scripts in their respective directories. 2386This is a move towards simpler RPC-only configuration for all main 2387and auxiliary applications. 2388 2389Legacy INI style configuration for SPDK applications will become deprecated in SPDK 19.10, 2390and removed in SPDK 20.01. Please consider moving to JSON-RPC configuration files and/or 2391RPC driven run-time configuration. 2392 2393### nvmf 2394 2395EXPERIMENTAL: A Fibre Channel transport that supports Broadcom HBAs has been 2396added. This depends on the FC HBA driver at 2397https://github.com/ecdufcdrvr/bcmufctdrvr. See [the documentation](https://spdk.io/doc/nvmf.html#nvmf_fc_transport) 2398for more information. 2399 2400Persistent reservation emulation has been added to the NVMe-oF target. Persistent reservation 2401state is stored in a JSON file on the local filesystem between target restart. To support this, 2402an optional parameter to the RPC method `nvmf_subsystem_add_ns` called `--ptpl-file` was added. 2403This allows the user to specify which file to store the persistent reservation state in. Note 2404that this is done per namespace. 2405 2406The c2h success optimization under which a command capsule response is not sent 2407for reads is turned on by default. A config knob was added to allow disabling 2408the optimization. This will mostly be used for integration testing with 5.0.x kernels 2409while some compatibility fixes make their way down the pipeline for 5.1.x kernels. 2410 2411The sock priority setting of the TCP connection owned by the tcp transport is added. It is 2412used to optimize the TCP connection performance under designated traffic classes. And the 2413priority is used to differentiate the sock priority between SPDK NVMe-oF TCP target application 2414and other TCP based applications. 2415 2416Shared receive queue can now be disabled even for NICs that support it using the 2417`nvmf_create_transport` RPC method parameter `no_srq`. The actual use of a shared 2418receive queue is predicated on hardware support when this flag is not used. 2419 2420spdk_nvmf_get_optimal_poll_group was added, which is used to return the optimal 2421poll group for the qpair. And `ConnectionScheduler` configuration is added into the 2422[Nvmf] section in etc/spdk/nvmf.conf.in to demonstrate how to configure the connection 2423scheduling strategy among different spdk threads. 2424 2425Added infrastructure to retrieve global and per poll group NVMf statistics. 2426 2427DIF strip and insert is now supported for TCP transport. When it is enabled, DIF 2428setting is not exposed to the NVMe-oF initiator, and DIF is attached into data 2429for write I/O and stripped from data for read I/O. 2430 2431Added a field `dif_insert_or_strip` to struct spdk_nvmf_transport_opts, and 2432updated the related rpc function nvmf_create_transport to make this 2433configurable parameter available to users. The `dif_insert_or_strip` is relevant 2434for TCP transport for now and used to configure the DIF strip and insert. 2435 2436Added infrastructure to retrieve NVMf transport statistics. 2437 2438### notify 2439 2440The function `spdk_notify_get_types()` and `spdk_notify_get_events()` were 2441renamed to `spdk_notify_foreach_type()` and `spdk_notify_foreach_event()`, 2442respectively. And update type name of callback accordingly. 2443 2444### bdev 2445 2446The format of the data returned by the get_bdevs_iostat RPC has changed to 2447make it easier to parse. It now returns an object with a "ticks" object 2448and "bdevs" array with the per-bdev statistics. 2449 2450A new bdev module `delay` has been added which simulates a drive latency when placed 2451on top of a Null bdev. This module is intended only for testing and can be created using 2452the new RPC `bdev_delay_create`. That RPC takes the name of the underlying bdev as well 2453as average and p99 latency arguments for both read and write operations. Average latency is 2454defined as a value close to what you would expect a perf tool such as FIO to report back as 2455the mean latency of all I/O submitted to the drive. p99 latency is defined as the value one 2456would expect the drive to see the slowest 1% of I/O report. For underlying drives with already 2457significant latency, the latency values provided to the drive will be additive. This should be 2458taken into account if trying to achieve an artificial latency on top of an nvme drive or aio device. 2459 2460DIF reference tag remapping is now supported for partition type virtual bdev 2461modules. When using partition type virtual bdevs, block address space is 2462remapped during I/O processing and DIF reference tag is remapped accordingly. 2463 2464Added spdk_bdev_*_with_md() functions allowing for IO with metadata being transferred in 2465separate buffer. To check support for separate metadata, use spdk_bdev_is_md_separate(). 2466 2467All bdevs now have a UUID. For devices whose backing hardware does not provide a UUID, 2468one is automatically generated. Across runs of SPDK, bdevs whose UUID is automatically 2469generated may change. 2470 2471A new virtual bdev module `compress` has been added to provide compression services on top of 2472a thinly provisioned logical volume. See documentation for complete details. 2473 2474### nvme 2475 2476Added an optional parameter `--io-queue-requests` to RPC `set_bdev_nvme_options`, which 2477can be used to change the number of requests allocated for one NVMe I/O queue. For 2478very big I/O size, e.g. 128MiB, with this option user will not get an error due to 2479limited requests in NVMe driver layer. 2480 2481Added spdk_nvme_ctrlr_get_transport_id() to get the transport ID from a 2482previously attached controller. 2483 2484Nvme Opal library spdk_opal_cmd deprecated. Adding separate command APIs. 2485NVMe Opal library add support for activating locking SP which will make the transaction 2486from "Manufactured-Inactive" state to "Manufactured" state. Upon successfully invoking 2487of this method, lock and unlock features will be enabled. 2488NVMe Opal library add support for locking/unlocking range and list locking range info. 2489NVMe opal library add support for multiuser. Admin can enable user and add user to specific 2490locking range and the user can lock/unlock his range. 2491 2492Added spdk_nvme_ctrlr_io_cmd_raw_no_payload_build() allowing a caller to pass 2493a completely formed command to an NVMe submission queue (buffer addresses and all). 2494This is supported on the PCIe transport only. 2495 2496Added spdk_nvme_get_ctrlr_registers() to return a pointer to the virtual address 2497of the NVMe controller registers. This is supported on the PCIe transport only. 2498 2499Added additional options to the spdk_nvme_ctrlr_alloc_qpair() option parameter 2500structure to allow caller to override the virtual and optionally physical address 2501of the submission and completion queue pair to be created. This is supported on 2502the PCIe transport only. 2503 2504Added `disable_error_logging` to struct spdk_nvme_ctrlr_opts, which disables 2505logging of failed requests. By default logging is enabled. 2506 2507Added spdk_nvme_qpair_print_command(), spdk_nvme_qpair_print_completion() and 2508spdk_nvme_cpl_get_status_string(). Allowing for easier display of error messages. 2509 2510Added support for NVMe Sanitize command. 2511 2512### env 2513 2514The parameter `free_space` has been added to spdk_ring_enqueue() to wait when 2515the ring is almost full and resume when there is enough space available in 2516the ring. 2517 2518A new API `spdk_mempool_lookup` has been added to lookup the memory pool created 2519by the primary process. 2520 2521Added spdk_pci_get_first_device() and spdk_pci_get_next_device() to allow 2522iterating over PCI devices detected by SPDK. Because of this, all SPDK APIs 2523to attach/detach PCI devices are no longer thread safe. They are now meant to 2524be called from only a single thread only, the same only that called spdk_env_init(). 2525This applies to the newly added APIs as well. 2526 2527### vpp 2528 2529SPDK now supports VPP version 19.04.2, up from VPP 18.01. 2530 2531VPP socket abstraction now uses VPP Session API, instead of VLC (VPP Communications Library). 2532This allows for better control over sessions and queues. 2533Please see VPP documentation for more details: 2534[VPP Host Stack](https://wiki.fd.io/view/VPP/HostStack) 2535 2536### sock 2537 2538Add spdk_sock_get_optimal_sock_group(), which returns the optimal sock group for 2539this socket. When a socket is created, it is often assigned to a sock group using 2540spdk_sock_group_add_sock so that a set of sockets can be polled more efficiently. 2541For some network devices, it is optimal to assign particular sockets to specific 2542sock groups. This API is intended to provide the user with that information. 2543 2544spdk_sock_group_get_ctx() was added to return the context of the spdk_sock_group. 2545spdk_sock_group_create() is updated to allow input the user provided ctx. 2546spdk_sock_set_priority() is added to set the priority of the socket. 2547 2548### rpc 2549 2550Added thread_get_stats RPC method to retrieve existing statistics. 2551 2552Added nvmf_get_stats RPC method to retrieve NVMf subsystem statistics. 2553 2554Response buffers for RPC requests are now always pre-allocated, which implies 2555that all spdk_jsonrpc_begin_result() calls always succeed and return a valid 2556buffer for JSON response. RPC calls no longer need to check if the buffer is 2557non-NULL. 2558 2559Added SPDK_RPC_REGISTER_ALIAS_DEPRECATED to help with deprecation process when 2560renaming existing RPC. First time a deprecated alias is used, it will print 2561a warning message. 2562 2563RPC `get_rpc_methods` was renamed `rpc_get_methods`. The old name is still usable, 2564but is now deprecated. 2565 2566### blobstore 2567 2568A snapshot can now be deleted if there is only a single clone on top of it. 2569 2570### build 2571 2572Preliminary support for cross compilation is now available. Targeting an older 2573CPU on the same architecture using your native compiler can be accomplished by 2574using the `--target-arch` option to `configure` as follows: 2575 2576~~~bash 2577./configure --target-arch=broadwell 2578~~~ 2579 2580Additionally, some support for cross-compiling to other architectures has been 2581added via the `--cross-prefix` argument to `configure`. To cross-compile, set CC 2582and CXX to the cross compilers, then run configure as follows: 2583 2584~~~bash 2585./configure --target-arch=aarm64 --cross-prefix=aarch64-linux-gnu 2586~~~ 2587 2588### vhost 2589 2590A security vulnerability has been identified and fixed in SPDK Vhost-SCSI target. 2591A malicious client (e.g. a virtual machine) could send a carefully prepared, 2592invalid I/O request to crash the entire SPDK process. All users of SPDK Vhost-SCSI 2593target are strongly recommended to update. All SPDK versions < 19.07 are affected. 2594 2595By default, SPDK will now rely on upstream DPDK's rte_vhost instead of its fork 2596located inside SPDK repo. The internal fork is still kept around to support older 2597DPDK versions, but is considered legacy and will be eventually removed. 2598 2599`configure` will now automatically use the upstream rte_vhost if the used DPDK 2600version is >= 19.05. 2601 2602spdk_vhost_init() is now asynchronous and accepts a completion callback. 2603 2604### iscsi target 2605 2606A security vulnerability has been identified and fixed in SPDK iSCSI target. 2607A malicious client (e.g. an iSCSI initiator) could send a carefully prepared, 2608invalid I/O request to crash the entire SPDK process. All users of SPDK iSCSI 2609target are strongly recommended to update. All SPDK versions < 19.07 are affected. 2610 2611### thread 2612 2613Exposed spdk_set_thread() in order for applications to associate 2614with SPDK thread when necessary. 2615 2616Added spdk_thread_destroy() to allow framework polling the thread to 2617release resources associated with that thread. 2618 2619## v19.04: Compression bdev, Notification library, NVMe Opal support 2620 2621### nvme 2622 2623Added asynchronous probe support. New APIs spdk_nvme_probe_async(), 2624spdk_nvme_connect_async() and spdk_nvme_probe_poll_async() were added to enable 2625this feature. spdk_nvme_probe_async() and spdk_nvme_connect_async() return a 2626context associated with the specified controllers. Users then call 2627spdk_nvme_probe_poll_async() until it returns 0, indicating that the operation 2628completed. 2629 2630A new qpair creation option, delay_pcie_doorbell, was added. This can be passed 2631to spdk_nvme_alloc_io_qpair(). This makes the I/O submission functions, such as 2632spdk_nvme_ns_writev(), skip ringing the submission queue doorbell. Instead the 2633doorbell will be rung as necessary inside spdk_nvme_qpair_process_completions(). 2634This can result in significantly fewer MMIO writes to the doorbell register 2635under heavy load, greatly improving performance. 2636 2637spdk_nvme_ctrlr_get_regs_cmbsz() was added to report the size of the controller 2638memory buffer, if available. 2639 2640spdk_nvme_ctrlr_get_flags() was added to return controller feature 2641flags. Two flags are currently tracked: 2642SPDK_NVME_CTRLR_SGL_SUPPORTED 2643SPDK_NVME_CTRLR_SECURITY_SEND_RECV_SUPPORTED 2644 2645The NVMe hotplug poller is now able to detach devices hot-removed from the system 2646via `/sys/bus/pci/devices/<bdf>/remove` and `/sys/bus/pci/devices/<bdf>/driver/unbind`. 2647 2648Opal support was added for scan, take ownership, revert TPer, and dumping device 2649info. The nvme_manage tool can be used to perform these operations. The public 2650API functions are spdk_nvme_ctrlr_security_receive() and 2651spdk_nvme_ctrlr_security_send(). This module should be considered experimental 2652pending additional features and tests. 2653 2654The NVMe-oF initiator is now able to transfer IO whose size is more than 128KiB 2655if the corresponding NVMe-oF target allows. 2656 2657### raid 2658 2659Added new strip_size_kb rpc param on create to replace the more ambiguous 2660strip_size. The strip_size rpc param is deprecated. 2661 2662Changed the raid bdev product_name from "Pooled Device" to "Raid Volume" 2663 2664### thread 2665 2666Added spdk_thread_has_pollers() function to verify if there are any registered 2667pollers to be run on the thread. Added spdk_thread_is_idle() function to check 2668if there are any scheduled operations to be performed on the thread at given 2669time. 2670 2671spdk_thread_create() now takes an optional CPU affinity mask that is passed to 2672the scheduler. 2673 2674spdk_thread_lib_init() now takes an optional context size. For each thread 2675created, an additional region of memory of this size will be allocated. A 2676pointer to this region of memory can be obtained by calling 2677spdk_thread_get_ctx(). The inverse operation is also available via 2678spdk_thread_get_from_ctx(). 2679 2680spdk_thread_poll() now optionally accepts the current time, in ticks. This can 2681be used to avoid some calls to spdk_get_ticks() internally. 2682 2683spdk_app_start() now only accepts a single context argument. 2684 2685### bdev 2686 2687An new API `spdk_bdev_get_data_block_size` has been added to get size of data 2688block except for metadata. 2689 2690spdk_vbdev_register() has been deprecated. spdk_bdev_register() should be used 2691instead. 2692 2693A mechanism for acquiring and releasing data buffers from bdev modules, used 2694to perform zero copy operations, was added. 2695 2696New APIs spdk_bdev_get_md_size(), spdk_bdev_is_md_interleaved(), spdk_bdev_get_dif_type(), 2697spdk_bdev_is_dif_head_of_md(), and spdk_bdev_is_dif_check_enabled() have been 2698added to get metadata and DIF settings. 2699 2700Bdevs claimed by the `examine_config` callback will be now further examined in the 2701`examine_disk` callback. 2702 2703spdk_bdev_io_get_io_channel() was added as a convenient way to get an io_channel 2704from a bdev_io. 2705 2706### ocf 2707 2708Updated OCF submodule to OCF v19.3.2 2709 2710Added support for many-to-one configuration for OCF bdev. 2711Multiple core devices can now be cached on single cache device. 2712 2713Added persistent metadata support, allowing to restore cache state after shutdown. 2714During start of SPDK application, the devices are examined and if OCF metadata 2715is present - appropriate OCF bdevs will be recreated. 2716 2717Added Write-Back mode support. In this mode, data is first written to 2718caching device and periodically synchronized to the core devices. 2719Dirty data is saved as persistent metadata on cache device, 2720allowing for safe restore during application restart. 2721For more details please see OCF documentation: 2722[OpenCAS cache configuration](https://open-cas.github.io/cache_configuration.html) 2723 2724### NVMe-oF Target 2725 2726Support for per-device shared receive queues in the RDMA transport has been added. 2727It is enabled by default for any device that supports it. 2728 2729The size of a shared receive queue is defined by transport configuration file parameter 2730`MaxSRQDepth` and `nvmf_create_transport` RPC method parameter `max_srq_depth`. 2731Default size is 4096. 2732 2733Add model number as parameter to construct_nvmf_subsystem (-d option), 2734rather than using hardcoded define. 2735 2736DIF passthrough feature has been added. DIF setting of the allocated bdevs is 2737exposed to the NVMe-oF initiator and data with DIF from the NVMe-oF initiator is 2738passed through to the allocated bdevs. 2739 2740### env 2741 2742The `phys_addr` parameter in spdk_malloc() and spdk_zmalloc() has been deprecated. 2743For retrieving physical addresses, spdk_vtophys() should be used instead. 2744 2745spdk_realloc() has been added to reallocate DMA/shared memory. 2746 2747spdk_pci_device_is_removed() has been added to let the upper-layer SPDK drivers know 2748that device has a pending external hotremove request. 2749 2750spdk_env_fini() and spdk_env_dpdk_post_fini() were added to release any resources 2751allocated by spdk_env_init() or spdk_env_dpdk_post_init() respectively. It is expected 2752that common usage of those functions is to call them just before terminating the process. 2753 2754Added spdk_iommu_is_enabled() to report if SPDK application is using IOMMU for DMA. 2755 2756### DPDK 2757 2758Dropped support for DPDK 17.07 and earlier, which SPDK won't even compile with right now. 2759 2760Updated DPDK submodule to DPDK 19.02. 2761 2762### rpc 2763 2764New `get_spdk_version` RPC method is introduced to get version info of the running SPDK application. 2765 2766The `start_nbd_disk` RPC method now take nbd_device as an optional parameter. If nbd_device 2767is specified, use that specified nbd device. If it's not specified, pick available one. 2768 2769### iSCSI target 2770 2771DIF strip and insert is now supported. DIF settings are not exposed to the iSCSI initiator. 2772DIF is attached into data for write I/O and stripped from data for read I/O. 2773 2774### vhost 2775 2776Added experimental support for running with the external, upstream rte_vhost library. 2777This can be enabled by configuring SPDK with an `--without-internal-vhost-lib` flag. 2778The minimum supported rte_vhost version (DPDK version) is 19.05-rc1. 2779 2780As a result of fuzz testing, a lot of data races in vhost-scsi LUN hotplug path were identified and 2781fixed. Those data races could have potentially resulted in SPDK crashes, RPC hangs, or memory leaks 2782if Vhost-SCSI LUN hotplug RPCs were executed while connected VMs were in the middle of restarting. 2783 2784The SCSI target id in `add_vhost_scsi_lun` RPC is now optional. If `-1` is passed, the first 2785unoccupied target id will be used. 2786 2787### AIO 2788 2789AIO bdev module can now reap I/O completions directly from userspace, significantly improving 2790the overall performance. 2791 2792### blobfs 2793 2794Synchronous IO operations no longer use spdk_io_channel, but instead use 2795spdk_fs_thread_ctx. The behavior is otherwise identical. 2796 2797### OCF 2798 2799Added support for caching multiple bdevs using a single bdev as a cache. 2800 2801### notify 2802 2803Added the notify library that provides a high performance local event bus 2804between libraries. Example usage was added to bdev module, which reports 2805notifications for added and removed bdevs via RPC. 2806 2807### sock 2808 2809Added new API spdk_sock_readv() to the sock library for performing vectored 2810reads. 2811 2812### event 2813 2814The function spdk_subsystem_init() no longer requires spdk_event as an argument. 2815 2816Changed API of spdk_subsystem_config_json() to no longer be asynchronous. 2817 2818### io_uring 2819 2820A bdev module that issues I/O to kernel block devices using the new io_uring Linux kernel 2821API was added. This module requires liburing. 2822 2823### build 2824 2825Options to easily compile with profile guided optimization have been added to 2826`configure`. To use profile guided optimization with SPDK, run 2827`./configure --with-pgo-capture`, build SPDK, then run a workload of your 2828choosing. Then, simply run `./configure --with-pgo-enable` and recompile to 2829build using the generated profile data. Profile guided optimization can yield 2830very large performance improvements, especially on GCC 8 and clang 7. This may 2831be combined with link time optimization which has been available under the 2832`--enable-lto` configure option for several releases. 2833 2834### compression bdev/reduce library 2835 2836Added "reduce" block compression scheme based on using SSDs for storing 2837compressed blocks of storage and persistent memory for metadata. Please see 2838[compression](https://spdk.io/doc/bdev.html) for more details. 2839 2840## v19.01: NVMe-oF TCP/IP Transport, Open Channel SSD Flash Translation Layer, Caching bdev based on OCF, ISA-L Support, DIF/DIX library 2841 2842### ocf bdev 2843 2844New virtual bdev module based on [Open CAS Framework](https://open-cas.github.io/) has been added. 2845This module allows for the use of one bdev to act as a high performance cache in front of another bdev. 2846Please see [documentation](https://spdk.io/doc/bdev.html#bdev_config_cas) for more details. 2847Only write through mode is currently supported and this feature is considered experimental. 2848 2849### event framework 2850 2851For `spdk_app_parse_args`, add return value to the callback which parses application 2852specific command line parameters to protect SPDK applications from crashing by invalid 2853values from user input. 2854 2855By default, all SPDK applications will now reserve all hugepages at runtime. The pre-reserved 2856memory size can be still set with `-s` or `--mem-size` option, although the default value 2857was reduced down to 0. 2858 2859A custom hugetlbfs directory can now be specified via spdk_app_opts. 2860This can be used to configure hugepages with different sizes, a different size limit, 2861or different access permissions than the system's default hugepage pool. 2862SPDK applications can specify a custom hugetlbfs mount with the `--huge-dir` option. 2863 2864### environment 2865 2866spdk_vtophys() has been refactored to accept length of the translated region as a new 2867parameter. The function will now update that parameter with the largest possible value 2868for which the memory is contiguous in the physical memory address space. 2869 2870The following functions were removed: 2871 2872- spdk_pci_nvme_device_attach() 2873- spdk_pci_nvme_enumerate() 2874- spdk_pci_ioat_device_attach() 2875- spdk_pci_ioat_enumerate() 2876- spdk_pci_virtio_device_attach() 2877- spdk_pci_virtio_enumerate() 2878 2879They were replaced with generic spdk_pci_device_attach() and spdk_pci_enumerate() which 2880require a new spdk_pci_driver object to be provided. It can be one of the following: 2881 2882- spdk_pci_nvme_get_driver() 2883- spdk_pci_ioat_get_driver() 2884- spdk_pci_virtio_get_driver() 2885 2886spdk_pci_hook_device() and spdk_pci_unhook_device() were added. Those allow adding a virtual 2887spdk_pci_device into the SPDK PCI subsystem. A virtual device calls provided callbacks for 2888each BAR mapping request or PCI config access. It's attachable with spdk_pci_device_attach() 2889or spdk_pci_enumerate() like any other device. 2890 2891A new spdk_pause() function was added to pause CPU execution for an implementation specific 2892amount of time. Quoting from DPDK function this is based on: "This call is intended for 2893tight loops which poll a shared resource or wait for an event. A short pause within the loop 2894may reduce the power consumption." 2895 2896A new public header file env_dpdk.h has been introduced, and function spdk_env_dpdk_post_init 2897is added into it. If user is using DPDK, and already called rte_eal_init, then include 2898include/spdk/env_dpdk.h, and call spdk_env_dpdk_post_init() instead of spdk_env_init. 2899 2900ISA-L has been added as an SPDK submodule. ISA-L is enabled by default on x86 architecture 2901to accelerate algorithms such as CRC for iSCSI and NVMe-oF. Users may still disable ISA-L 2902by explicitly passing --without-isal to the configure script. 2903 2904### util 2905 2906A new uuid API `spdk_uuid_copy` was added to make a copy of the source uuid. 2907 2908An new parameter `init_crc` representing the initial CRC value was added to 2909`spdk_crc16_t10dif`. The parameter can be used to calculate a CRC value spanning 2910multiple separate buffers. 2911 2912New DIF APIs were added to generate and verify DIF by byte granularity for both DIF and DIX 2913formats. Among them, DIF with copy APIs will be usable to emulate DIF operations such as DIF 2914insert and strip. 2915 2916Added `spdk_strtol` and `spdk_strtoll` to provide additional error checking around `strtol` 2917and `strtoll`. 2918 2919Added `spdk_sprintf_append_realloc` and `spdk_vsprintf_append_realloc` for appending a string 2920with automatic buffer re-allocation. 2921 2922### nvme 2923 2924Wrapper functions spdk_nvme_ctrlr_security_send() and spdk_nvme_ctrlr_security_receive() are 2925introduced to support further security protocol development. 2926 2927admin_timeout_ms was added to NVMe controller initialization options, users 2928can change the default value when probing a controller. 2929 2930Add two new fields "header_digest" and "data_digest" in struct spdk_nvme_ctrlr_opts, 2931it will be used to enable the digest support for the NVMe/TCP transport. 2932 2933Add a new TCP/IP transport(located in lib/nvme/nvme_tcp.c) in nvme driver. With 2934this new transport, it can be used to connect the NVMe-oF target with the 2935same TCP/IP support. 2936 2937Added API, spdk_nvme_ctrlr_is_discovery(), to indicate whether the ctrlr 2938arg refers to a Discovery Controller or not. 2939 2940Added an API function `spdk_nvme_host_id_parse` and corresponding object `spdk_nvme_host_id` 2941for parsing host address and host service ID arguments on a per connection basis. 2942 2943The RPC `construct_nvme_bdev` now allows a user to specify a source address and service id for the host to 2944use when connecting to the controller backing the NVMe bdev. 2945 2946### NVMe-oF Target 2947 2948The `spdk_nvmf_tgt_opts` struct has been deprecated in favor of `spdk_nvmf_transport_opts`. 2949Users will no longer be able to specify target wide I/O parameters. `spdk_nvmf_tgt_listen` 2950will also no longer implicitly initialize a transport with the default target options (since 2951there are none). Instead, a user must manually instantiate the transport with `spdk_nvmf_transport_create` 2952prior to calling `spdk_nvmf_tgt_listen`. 2953 2954Related to the previous change, the rpc `set_nvmf_target_options` has been renamed to 2955`set_nvmf_target_max_subsystems` to indicate that this is the only target option available for the user to edit. 2956 2957Added fields `num_shared_buffers` and `buf_cache_size` in struct spdk_nvmf_transport_opts, 2958and also updated the related rpc function nvmf_create_transport, to make this 2959configurable parameter available to users. The `num_shared_buffers` is used to 2960configure the shared buffer numbers of the transport used by RDMA or TCP transport. 2961`buf_cache_size` configures number of shared buffers to cache per poll group. 2962 2963### nvmf 2964 2965Add a new TCP/IP transport (located in lib/nvmf/tcp.c). With this transport, 2966the SPDK NVMe-oF target can have a new transport, and can serve the NVMe-oF 2967protocol via TCP/IP from the host. 2968 2969Added optional mechanism to modify the RDMA transport's behavior when creating protection domains and registering memory. 2970By default, the RDMA transport will use the ibverbs library to create protection domains and register memory. 2971Using `spdk_nvme_rdma_init_hooks` will subvert that and use an existing registration. 2972 2973### bdev 2974 2975Added `enable_bdev_histogram` and `get_bdev_histogram` RPC commands to allow gathering latency data for specified bdev. 2976Please see [documentation](https://spdk.io/doc/bdev.html#rpc_bdev_histogram) for more details. 2977 2978Added `required_alignment` field to `spdk_bdev`, that specifies an alignment requirement for data buffers associated with an spdk_bdev_io. 2979Bdev layer will automatically double buffer any spdk_bdev_io that violates this alignment, before the spdk_bdev_io is submitted to the bdev module. 2980 2981On shutdown, bdev unregister now proceeds in top-down fashion, with 2982claimed bdevs skipped (these will be unregistered later, when virtual 2983bdev built on top of the respective base bdev unclaims it). This 2984allows virtual bdevs to be shut down cleanly as opposed to the 2985previous behavior that didn't differentiate between hotremove and 2986planned shutdown. 2987 2988The `delete_bdev` RPC is now deprecated. Users should instead use the specific deletion RPC 2989for the bdev type to be removed (i.e. delete_malloc_bdev). 2990 2991Added support for separate bandwidth rate limits for read and write to QoS in bdev layer. 2992 2993Bdev I/O statistics now track unmap operations. 2994 2995### logical volumes 2996 2997Logical volume bdev can now be marked as read only using `set_read_only_lvol_bdev` RPC. 2998This allows for basing clones on top of lvol_bdev without first creating a snapshot. 2999 3000Added option to change method for data erasure when deleting lvol or resizing down. 3001Default of unmapping clusters can now be changed to writing zeroes or no operation. 3002 3003Added option to change method for erasing data region on lvol store creation. 3004Default of unmapping can now be changed to writing zeroes or no operation. 3005 3006### log 3007 3008"trace flags" are now referred to as "log flags" in the SPDK log API. The 3009set_trace_flag, clear_trace_flag and get_trace_flags RPCs are now deprecated, 3010and set_log_flag, clear_log_flag and get_log_flags RPCs have been added. 3011 3012### trace 3013 3014New `trace_record` application was added. It can be used to poll spdk trace shm file and 3015append any new trace entries into another specified file. This can help retain those entries 3016that would otherwise be overwritten in the shm file. See 3017[Capturing sufficient trace events](https://spdk.io/doc/nvmf_tgt_tracepoints.html#capture_trace_events) 3018for more details. 3019 3020Number of trace entries in circular buffer per lcore can now be assigned by starting SPDK app 3021with argument "--num-trace-entries <NUM>" provided. 3022 3023New `get_tpoint_group_mask` RPC was added to get current tpoint_group_mask, and 3024each tpoint group status. 3025New `enable_tpoint_group` and `disable_tpoint_group` RPC were added to enable or 3026disable a specific tpoint group. 3027 3028### ftl 3029 3030EXPERIMENTAL: Added basic flash translation layer module allowing for using Open Channel SSDs as 3031block devices. The module is split into the library (located in lib/ftl) and bdev_ftl 3032(lib/bdev/ftl). See the [documentation](https://spdk.io/doc/ftl.html) for more details. 3033 3034### vhost 3035 3036A security vulnerability has been identified and fixed in the SPDK vhost target. A malicious 3037vhost client (i.e. virtual machine) could carefully construct a circular descriptor chain which 3038would result in a partial denial of service in the SPDK vhost target. These types of descriptor 3039chains are now properly detected by the vhost target. All SPDK vhost users serving untrusted 3040vhost clients are strongly recommended to upgrade. (Reported by Dima Stepanov and Evgeny 3041Yakovlev.) 3042 3043Vhost SCSI and Vhost Block devices can now accept multiple connections on the same socket file. 3044Each connection (internally called a vhost session) will have access to the same storage, but 3045will use different virtqueues, different features and possibly different memory. 3046 3047### vhost scsi 3048 3049SCSI target hotremove can now be performed even without the VIRTIO_SCSI_F_HOTPLUG feature negotiated. 3050Regardless of VIRTIO_SCSI_F_HOTPLUG support, the hotremoval will be still reported through SCSI sense codes. 3051 3052### DPDK 3053 3054DPDK submodule was updated to DPDK 18.11. Note that SPDK does not fully leverage the new 3055multi-process device hotplug yet and continues to work the same way it always did. 3056 3057Dropped support for DPDK 16.07 and earlier, which SPDK won't even compile with right now. 3058 3059### RPC 3060 3061The following RPC commands deprecated in the previous release are now removed: 3062 3063- construct_virtio_user_scsi_bdev 3064- construct_virtio_pci_scsi_bdev 3065- construct_virtio_user_blk_bdev 3066- construct_virtio_pci_blk_bdev 3067- remove_virtio_scsi_bdev 3068- construct_nvmf_subsystem 3069 3070### Miscellaneous 3071 3072The configure options `--with-raid` and `--without-raid` that were deprecated in the previous 3073release are now removed. 3074 3075### nbd 3076 3077Starting nbd using `spdk_nbd_start` is now performed asynchronously. 3078 3079### net framework 3080 3081Net framework initialization and finish is now done asynchronously. 3082 3083### rpc 3084 3085Added `spdk_rpc_is_method_allowed` function for checking whether method is permitted in a given state. 3086Added `spdk_rpc_get_state` to check current state of RPC server. 3087RPC `wait_subsystem_init` has been added to allow clients to block until all subsystems are initialized. 3088 3089### json rpc 3090 3091JSON RPC client is now running in non-blocking mode. Requests are sent and received during spdk_jsonrpc_client_poll. 3092JSON RPC server can now receive a callback on connection termination or server shutdown using `spdk_jsonrpc_conn_add_close_cb` 3093and `spdk_jsonrpc_conn_del_close_cb`. 3094 3095## v18.10: Dynamic memory allocation, Crypto Virtual Bdev, jsonrpc-client, SPDKCLI iSCSI and NVMe-oF support 3096 3097### nvme 3098 3099spdk_nvme_ctrlr_cmd_security_send() and spdk_nvme_ctrlr_cmd_security_receive() 3100were added to support sending or receiving security protocol data to or from 3101nvme controller. 3102 3103spdk_nvme_ns_get_extended_sector_size() was added. This function includes 3104the metadata size per sector (if any). spdk_nvme_ns_get_sector_size() still 3105returns only the data size per sector, not including metadata. 3106 3107New `send_nvme_cmd` RPC was added to allow sending NVMe commands directly to NVMe controller. 3108See the [send_nvme_cmd](http://spdk.io/doc/jsonrpc.html#rpc_send_nvme_cmd) documentation 3109for more details. 3110 3111### Build System 3112 3113New `configure` options, `--with-shared` and `--without-shared` 3114[default], provide the capability to build, or not, SPDK shared libraries. 3115This includes the single SPDK shared lib encompassing all of the SPDK 3116static libs as well as individual SPDK shared libs corresponding to 3117each of the SPDK static ones. Although the production of the shared 3118libs conforms with conventional version naming practices, such naming 3119does not at this time confer any SPDK ABI compatibility claims. 3120 3121### bdev 3122 3123spdk_bdev_alias_del_all() was added to delete all alias from block device. 3124 3125A new virtual bdev module has been added to perform at rest data encryption using the DPDK CryptoDev 3126Framework. The module initially uses a software AESNI CBC cipher with experimental support for the 3127Intel QAT hardware accelerator also currently implemented with support for CBC cipher. Future work 3128may include additional ciphers as well as consideration for authentication. 3129 3130The RAID virtual bdev module is now always enabled by default. The configure --with-raid and 3131--without-raid options are now ignored and deprecated and will be removed in the next release. 3132 3133Enforcement of bandwidth limits for quality of service (QoS) has been added to the bdev layer. 3134See the new [set_bdev_qos_limit](http://www.spdk.io/doc/jsonrpc.html#rpc_set_bdev_qos_limit) 3135documentation for more details. The previous set_bdev_qos_limit_iops RPC method introduced at 313618.04 release has been deprecated. The new set_bdev_qos_limit RPC method can support both 3137bandwidth and IOPS limits. 3138 3139spdk_bdev_config_json() and corresponding `get_bdevs_config` RPC was removed. 3140 3141### Environment Abstraction Layer and Event Framework 3142 3143The size parameter of spdk_mem_map_translate is now a pointer. This allows the 3144function to report back the actual size of the translation relative to the original 3145request made by the user. 3146 3147A new structure spdk_mem_map_ops has been introduced to hold memory map related 3148callbacks. This structure is now passed as the second argument of spdk_mem_map_alloc 3149in lieu of the notify callback. 3150 3151### DPDK 18.08 3152 3153The DPDK submodule has been updated to the DPDK 18.08 release. SPDK will now automatically 3154utilize DPDK's dynamic memory management with DPDK versions >= 18.05.1. 3155 3156Hugepages can be still reserved with `[-s|--mem-size <size>]` option at application startup, 3157but once we use them all up, instead of failing user allocations with -ENOMEM, we'll try 3158to dynamically reserve even more. This allows starting SPDK with `--mem-size 0` and using 3159only as many hugepages as it is really needed. 3160 3161Due to this change, the memory buffers returned by `spdk_*malloc()` are no longer guaranteed 3162to be physically contiguous. 3163 3164### I/OAT 3165 3166I/OAT driver can now reinitialize I/OAT channels after encountering DMA errors. 3167 3168### iscsi target 3169 3170Parameter names of `set_iscsi_options` and `get_iscsi_global_params` RPC 3171method for CHAP authentication in discovery sessions have been changed to 3172align with `construct_target_node` RPC method. Old names are still usable 3173but will be removed in future release. 3174 3175`set_iscsi_discovery_auth` and `set_iscsi_target_node_auth` RPC methods have 3176been added to set CHAP authentication for discovery sessions and existing 3177target nodes, respectively. 3178 3179The SPDK iSCSI target supports an AuthFile which can be used to load CHAP 3180shared secrets when the iSCSI target starts. SPDK previously provided a 3181default location for this file (`/usr/local/etc/spdk/auth.conf`) if none was 3182specified. This default has been removed. Users must now explicitly specify 3183the location of this file to load CHAP shared secrets from a file, or use 3184the related iSCSI RPC methods to add them at runtime. 3185 3186### iscsi initiator 3187 3188The SPDK iSCSI initiator is no longer considered experimental and becomes 3189a first-class citizen among bdev modules. The basic usage has been briefly 3190described in the bdev user guide: [iSCSI bdev](https://spdk.io/doc/bdev.html#bdev_config_iscsi) 3191 3192### Miscellaneous 3193 3194The SPDK application framework can now parse long name command line parameters. 3195Most single-character parameters have a long name equivalent now. See the 3196[Command Line Parameters](https://spdk.io/doc/app_overview.html) documentation 3197for details or use the `--help` command line parameter to list all available 3198params. 3199 3200bdevperf `-s` param (io size) was renamed to `-o` as `-s` had been already 3201used by existing apps for memory size. 3202 3203bdevio can now accept all SPDK command line parameters. The config now has to 3204be provided with `-c` or `--config` param. 3205 3206The following ioat/perf and nvme/perf parameters were renamed as well: 3207 `-s` (io size) to `-o` 3208 `-d` (mem size) to `-s` 3209 3210The ReactorMask config file parameter has been deprecated. Users should 3211use the -m or --cpumask command line option to specify the CPU core mask 3212for the application. 3213 3214Default config file pathnames have been removed from iscsi_tgt, nvmf_tgt 3215and vhost. Config file pathnames may now only be specified using the 3216-c command line option. 3217 3218Users may no longer set DPDK_DIR in their environment to specify the 3219location of the DPDK installation used to build SPDK. Using DPDK_DIR 3220has not been the documented nor recommended way to specify the DPDK 3221location for several releases, but removing it ensures no unexpected 3222surprises for users who may have DPDK_DIR defined for other reasons. 3223Users should just use the "configure" script to specify the DPDK 3224location before building SPDK. 3225 3226Although we know that many developers still use Python 2 we are officially 3227switching to Python3 with requirement that all new code must be valid also 3228for Python 2 up to the EOL which is year 2020. 3229 3230Invoking interpreter explicitly is forbidden for executable scripts. There 3231is no need to use syntax like "python ./scripts/rpc.py". All executable 3232scripts must contain proper shebang pointing to the right interpreter. 3233Scripts without shebang mustn't be executable. 3234 3235A Python script has been added to enable conversion of old INI config file 3236to new JSON-RPC config file format. This script can be found at 3237scripts/config_converter.py. Example how this script can be used: 3238~~~{.sh} 3239cat old_format.ini | scripts/config_converter.py > new_json_format.json 3240~~~ 3241 3242### Sock 3243 3244Two additional parameters were added to spdk_sock_get_addr() for the server 3245port and client port. These parameters are named "sport" and "cport" 3246respectively. 3247 3248### Virtio 3249 3250The following RPC commands have been deprecated: 3251 3252- construct_virtio_user_scsi_bdev 3253- construct_virtio_pci_scsi_bdev 3254- construct_virtio_user_blk_bdev 3255- construct_virtio_pci_blk_bdev 3256- remove_virtio_scsi_bdev 3257 3258The `construct_virtio_*` ones were replaced with a single `construct_virtio_dev` 3259command that can create any type of Virtio bdev(s). `remove_virtio_scsi_bdev` 3260was replaced with `remove_virtio_bdev` that can delete both Virtio Block and SCSI 3261devices. 3262 3263### Blobfs 3264 3265spdk_file_get_id() returning unique ID for the file was added. 3266 3267### JSON 3268 3269Added jsonrpc-client C library intended for issuing RPC commands from applications. 3270 3271Added API enabling iteration over JSON object: 3272 3273- spdk_json_find() 3274- spdk_json_find_string() 3275- spdk_json_find_array() 3276- spdk_json_object_first() 3277- spdk_json_array_first() 3278- spdk_json_next() 3279 3280### Blobstore 3281 3282Blobstore I/O operations are now based on io_units, instead of blobstore page size. 3283The io_unit size is now the same as the underlying block device's block size. 3284Logical volumes built on a block device with 512B block size can now be used as boot devices 3285in QEMU. 3286 3287### SPDKCLI 3288 3289The SPDKCLI interactive command tool for managing SPDK is no longer considered experimental. 3290Support for the iSCSI and NVMe-oF targets has been added. 3291 3292## v18.07: Raid, Infrastructure Improvements, Bug Fixes 3293 3294### bdev 3295 3296A new public header file bdev_module.h has been introduced to facilitate the 3297development of new bdev modules. This header includes an interface for the 3298spdk_bdev_part and spdk_bdev_part_base objects to enable the creation of 3299multiple virtual bdevs on top of a single base bdev and should act as the 3300primary API for module authors. 3301 3302spdk_bdev_get_opts() and spdk_bdev_set_opts() were added to set bdev-wide 3303options. 3304 3305A mechanism for handling out of memory condition errors (ENOMEM) returned from 3306I/O submission requests at the bdev layer has been added. See 3307spdk_bdev_queue_io_wait(). 3308 3309The spdk_bdev_get_io_stat() function now returns cumulative totals instead of 3310resetting on each call. This allows multiple callers to query I/O statistics 3311without conflicting with each other. Existing users will need to adjust their 3312code to record the previous I/O statistics to calculate the delta between calls. 3313 3314I/O queue depth tracking and samples options have been added. See 3315spdk_bdev_get_qd(), spdk_bdev_get_qd_sampling_period(), and 3316spdk_bdev_set_qd_sampling_period(). 3317 3318### RAID module 3319 3320A new bdev module called "raid" has been added as experimental module which 3321aggregates underlying NVMe bdevs and exposes a single raid bdev. Please note 3322that vhost will not work with this module because it does not yet have support 3323for multi-element io vectors. 3324 3325### Log 3326 3327The debug log component flag available on several SPDK applications has been 3328renamed from `-t` to `-L` to prevent confusion with tracepoints and to allow the 3329option to be added to tools that already use `-t` to mean something else. 3330 3331### Blobstore 3332 3333A new function, spdk_bs_dump(), has been added that dumps all of the contents of 3334a blobstore to a file pointer. This includes the metadata and is very useful for 3335debugging. 3336 3337Two new operations have been added for thin-provisioned blobs. 3338spdk_bs_inflate_blob() will allocate clusters for all thinly provisioned regions 3339of the blob and populate them with the correct data by reading from the backing 3340blob(s). spdk_bs_blob_decouple_parent() works similarly, but will only allocate 3341clusters that correspond to data in the blob's immediate parent. Clusters 3342allocated to grandparents or that aren't allocated at all will remain 3343thin-provisioned. 3344 3345### BlobFS 3346 3347Changed the return type of spdk_file_truncate() from void to int to allow the 3348propagation of `ENOMEM` errors. 3349 3350### NVMe Driver 3351 3352The new API functions spdk_nvme_qpair_add_cmd_error_injection() and 3353spdk_nvme_qpair_remove_cmd_error_injection() have been added for NVMe error 3354emulation. Users can set a specified command to fail with a particular error 3355status. 3356 3357Changed the name `timeout_sec` parameter to `timeout_us` in 3358spdk_nvme_ctrlr_register_timeout_callback(), and also changed the type from 3359uint32_t to uint64_t. This will give users more fine-grained control over the 3360timeout period. 3361 3362Basic support for Open Channel SSDs was added. See nvme_ocssd.h 3363 3364### NVMe Over Fabrics 3365 3366The spdk_nvmf_tgt_destroy() function is now asynchronous and takes a callback 3367as a parameter. 3368 3369spdk_nvmf_qpair_disconnect() was added to allow the user to disconnect qpairs. 3370 3371spdk_nvmf_subsystem_get_max_namespaces() was added to query the maximum allowed 3372number of namespaces for a given subsystem. 3373 3374### Build System 3375 3376The build system now generates a combined shared library (libspdk.so) that may 3377be used in place of the individual static libraries (libspdk_*.a). The combined 3378library includes all components of SPDK and is intended to make linking against 3379SPDK easier. The static libraries are also still provided for users that prefer 3380to link only the minimal set of components required. 3381 3382### git pre-commit and pre-push hooks 3383 3384The pre-commit hook will run `scripts/check_format.sh` and verify there are no 3385formatting errors before allowing `git commit` to run. The pre-push hook runs 3386`make CONFIG_WERROR=y` with and without `CONFIG_DEBUG=y` using both the gcc and 3387clang compiler before allowing `git push` to run. Following each DEBUG build 3388`test/unit/unittest.sh` is run and verified. Results are recorded in the 3389`make.log` file. 3390 3391To enable type: 'git config core.hooksPath .githooks'. To override after 3392configuration use the `git --no-verify` flag. 3393 3394### RPC 3395 3396The `start_nbd_disk` RPC method now returns the path to the kernel NBD device node 3397rather than always returning `true`. 3398 3399### DPDK 18.05 3400 3401The DPDK submodule has been rebased on the DPDK 18.05 release. DPDK 18.05 supports 3402dynamic memory allocation, but due to some issues found after the DPDK 18.05 release, 3403that support is not enabled for SPDK 18.07. Therefore, SPDK 18.07 will continue to use 3404the legacy memory allocation model. The plan is to enable dynamic memory allocation 3405after the DPDK 18.08 release which should fix these issues. 3406 3407### Environment Abstraction Layer and Event Framework 3408 3409The spdk_mem_map_translate() function now takes a size parameter to indicate the size of 3410the memory region. This can be used by environment implementations to validate the 3411requested translation. 3412 3413The I/O Channel implementation has been moved to its own library - lib/thread. The 3414public API that was previously in spdk/io_channel.h is now in spdk/thread.h The 3415file spdk/io_channel.h remains and includes spdk/thread.h. 3416 3417spdk_reactor_get_tsc_stats was added to return interesting statistics for each 3418reactor. 3419 3420### IOAT 3421 3422IOAT for copy engine is disabled by default. It can be enabled by specifying the Enable 3423option with "Yes" in `[Ioat]` section of the configuration file. The Disable option is 3424now deprecated and will be removed in a future release. 3425 3426## v18.04: Logical Volume Snapshot/Clone, iSCSI Initiator, Bdev QoS, VPP Userspace TCP/IP 3427 3428### vhost 3429 3430The SPDK vhost-scsi, vhost-blk and vhost-nvme applications have fixes to address the 3431DPDK rte_vhost vulnerability [CVE-2018-1059](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1059). 3432Please see this [security advisory](https://access.redhat.com/security/cve/cve-2018-1059) 3433for additional information on the DPDK vulnerability. 3434 3435Workarounds have been added to ensure vhost compatibility with QEMU 2.12. 3436 3437EXPERIMENTAL: Support for vhost-nvme has been added to the SPDK vhost target. See the 3438[vhost documentation](http://www.spdk.io/doc/vhost.html) for more details. 3439 3440### Unified Target Application 3441 3442A new unified SPDK target application, `spdk_tgt`, has been added. This application combines the 3443functionality of several existing SPDK applications, including the iSCSI target, NVMe-oF target, 3444and vhost target. The new application can be managed through the existing configuration file and 3445[JSON-RPC](http://www.spdk.io/doc/jsonrpc.html) methods. 3446 3447### Env 3448 3449spdk_mempool_get_bulk() has been added to wrap DPDK rte_mempool_get_bulk(). 3450 3451New memory management functions spdk_malloc(), spdk_zmalloc(), and spdk_free() have been added. 3452These new functions have a `flags` parameter that allows the user to specify whether the allocated 3453memory needs to be suitable for DMA and whether it should be shared across processes with the same 3454shm_id. The new functions are intended to replace spdk_dma_malloc() and related functions, which will 3455eventually be deprecated and removed. 3456 3457### Bdev 3458 3459A new optional bdev module interface function, `init_complete`, has been added to notify bdev modules 3460when the bdev subsystem initialization is complete. This may be useful for virtual bdevs that require 3461notification that the set of initialization examine() calls is complete. 3462 3463The bdev layer now allows modules to provide an optional per-bdev UUID, which can be retrieved with 3464the spdk_bdev_get_uuid() function. 3465 3466Enforcement of IOPS limits for quality of service (QoS) has been added to the bdev layer. See the 3467[set_bdev_qos_limit_iops](http://www.spdk.io/doc/jsonrpc.html#rpc_set_bdev_qos_limit_iops) documentation 3468for more details. 3469 3470### RPC 3471 3472The `[Rpc]` configuration file section, which was deprecated in v18.01, has been removed. 3473Users should switch to the `-r` command-line parameter instead. 3474 3475The JSON-RPC server implementation now allows up to 32 megabyte responses, growing as 3476needed; previously, the response was limited to 32 kilobytes. 3477 3478### SPDKCLI 3479 3480EXPERIMENTAL: New SPDKCLI interactive command tool for managing SPDK is available. 3481See the [SPDKCLI](http://www.spdk.io/doc/spdkcli.html) documentation for more details. 3482 3483### NVMe Driver 3484 3485EXPERIMENTAL: Support for WDS and RDS capable CMBs in NVMe controllers has been added. This support is 3486experimental pending a functional allocator to free and reallocate CMB buffers. 3487 3488spdk_nvme_ns_get_uuid() has been added to allow retrieval of per-namespace UUIDs when available. 3489 3490New API functions spdk_nvme_ctrlr_get_first_active_ns() and spdk_nvme_ctrlr_get_next_active_ns() 3491have been added to iterate active namespaces, as well as spdk_nvme_ctrlr_is_active_ns() to check if 3492a namespace ID is active. 3493 3494### NVMe-oF Target 3495 3496Namespaces may now be assigned unique identifiers via new optional `eui64` and `nguid` parameters 3497to the `nvmf_subsystem_add_ns` RPC method. Additionally, the NVMe-oF target automatically exposes 3498the backing bdev's UUID as the namespace UUID when available. 3499 3500spdk_nvmf_subsystem_remove_ns() is now asynchronous and requires a callback to indicate completion. 3501 3502### Blobstore 3503 3504A number of functions have been renamed: 3505 3506- spdk_bs_io_write_blob() => spdk_blob_io_write() 3507- spdk_bs_io_read_blob() => spdk_blob_io_read() 3508- spdk_bs_io_writev_blob() => spdk_blob_io_writev() 3509- spdk_bs_io_readv_blob() => spdk_blob_io_readv() 3510- spdk_bs_io_unmap_blob() => spdk_blob_io_unmap() 3511- spdk_bs_io_write_zeroes_blob() => spdk_blob_io_write_zeroes() 3512 3513The old names still exist but are deprecated. They will be removed in the v18.07 release. 3514 3515spdk_blob_resize() is now an asynchronous operation to enable resizing a blob while I/O 3516are in progress to that blob on other threads. An explicit spdk_blob_sync_md() is still 3517required to sync the updated metadata to disk. 3518 3519### Logical Volumes 3520 3521A new `destroy_lvol_bdev` RPC method to delete logical volumes has been added. 3522 3523Lvols now have their own UUIDs which replace previous LvolStoreUUID_BlobID combination. 3524 3525New Snapshot and Clone functionalities have been added. User may create Snapshots of existing Lvols 3526and Clones of existing Snapshots. 3527See the [lvol snapshots](http://www.spdk.io/doc/logical_volumes.html#lvol_snapshots) documentation 3528for more details. 3529 3530Resizing logical volumes is now supported via the `resize_lvol_bdev` RPC method. 3531 3532### Lib 3533 3534A set of changes were made in the SPDK's lib code altering 3535instances of calls to `exit()` and `abort()` to return a failure instead 3536wherever reasonably possible. 3537 3538spdk_app_start() no longer exit()'s on an internal failure, but 3539instead returns a non-zero error status. 3540 3541spdk_app_parse_args() no longer exit()'s on help, '-h', or an invalid 3542option, but instead returns SPDK_APP_PARSE_ARGS_HELP and 3543SPDK_APP_PARSE_ARGS_FAIL, respectively, and SPDK_APP_PARSE_ARGS_SUCCESS 3544on success. 3545 3546spdk_pci_get_device() has been deprecated and will be removed in SPDK v18.07. 3547 3548### I/O Channels 3549 3550The prototype for spdk_poller_fn() has been modified; it now returns a value indicating 3551whether or not the poller did any work. Existing pollers will need to be updated to 3552return a value. 3553 3554### iSCSI Target 3555 3556The SPDK iSCSI target now supports the fd.io Vector Packet Processing (VPP) framework userspace 3557TCP/IP stack. See the [iSCSI VPP documentation](http://www.spdk.io/doc/iscsi.html#vpp) for more 3558details. 3559 3560### iSCSI initiator 3561 3562An iSCSI initiator bdev module has been added to SPDK. This module should be considered 3563experimental pending additional features and tests. More details can be found in 3564lib/bdev/iscsi/README. 3565 3566### PMDK 3567 3568The persistent memory (PMDK) bdev module is now enabled using `--with-pmdk` instead of 3569`--with-nvml`. This reflects the renaming of the persistent memory library from NVML to 3570PMDK. 3571 3572### Virtio Block driver 3573 3574A userspace driver for Virtio Block devices has been added. It was built on top of the 3575[Virtio](http://www.spdk.io/doc/virtio.html) library and can be managed similarly to 3576the Virtio SCSI driver. See the 3577[Virtio Block](http://www.spdk.io/doc/bdev.html#bdev_config_virtio_blk) reference for 3578more information. 3579 3580### Virtio with 2MB hugepages 3581 3582The previous 1GB hugepage limitation has now been lifted. A new `-g` command-line option 3583enables SPDK Virtio to work with 2MB hugepages. 3584See [2MB hugepages](http://www.spdk.io/doc/virtio.html#virtio_2mb) for details. 3585 3586## v18.01: Blobstore Thin Provisioning 3587 3588### Build System 3589 3590The build system now includes a `make install` rule, including support for the common 3591`DESTDIR` and `prefix` variables as used in other build systems. Additionally, the prefix 3592may be set via the configure `--prefix` option. Example: `make install prefix=/usr`. 3593 3594### RPC 3595 3596A JSON RPC listener is now enabled by default using a UNIX domain socket at /var/tmp/spdk.sock. 3597A -r option command line option has been added to enable an alternative UNIX domain socket location, 3598or a TCP port in the format ip_addr:tcp_port (i.e. 127.0.0.1:5260). The Rpc configuration file 3599section is now deprecated and will be removed in the v18.04 release. 3600 3601### I/O Channels 3602 3603spdk_poller_register() and spdk_poller_unregister() were moved from the event 3604framework (include/spdk/event.h) to the I/O channel library 3605(include/spdk/io_channel.h). This allows code that doesn't depend on the event 3606framework to request registration and unregistration of pollers. 3607 3608spdk_for_each_channel() now allows asynchronous operations during iteration. 3609Instead of immediately continuing the interaction upon returning from the iteration 3610callback, the user must call spdk_for_each_channel_continue() to resume iteration. 3611 3612### Block Device Abstraction Layer (bdev) 3613 3614The poller abstraction was removed from the bdev layer. There is now a general purpose 3615abstraction for pollers available in include/spdk/io_channel.h 3616 3617### Lib 3618 3619A set of changes were made in the SPDK's lib code altering, 3620instances of calls to `exit()` and `abort()` to return a failure instead 3621wherever reasonably possible. This has resulted in return type changes of 3622the API for: 3623 3624- spdk_env_init() from type `void` to `int`. 3625- spdk_mem_map_init() from type `void` to `int`. 3626 3627Applications making use of these APIs should be modified to check for 3628a non-zero return value instead of relying on them to fail without return. 3629 3630### NVMe Driver 3631 3632SPDK now supports hotplug for vfio-attached devices. But there is one thing keep in mind: 3633Only physical removal events are supported; removing devices via the sysfs `remove` file will not work. 3634 3635### NVMe-oF Target 3636 3637Subsystems are no longer tied explicitly to CPU cores. Instead, connections are handed out to the available 3638cores round-robin. The "Core" option in the configuration file has been removed. 3639 3640### Blobstore 3641 3642A number of functions have been renamed: 3643 3644- spdk_bs_md_resize_blob() => spdk_blob_resize() 3645- spdk_bs_md_sync_blob() => spdk_blob_sync_md() 3646- spdk_bs_md_close_blob() => spdk_blob_close() 3647- spdk_bs_md_get_xattr_names() => spdk_blob_get_xattr_names() 3648- spdk_bs_md_get_xattr_value() => spdk_blob_get_xattr_value() 3649- spdk_blob_md_set_xattr() => spdk_blob_set_xattr() 3650- spdk_blob_md_remove_xattr() => spdk_blob_remove_xattr() 3651- spdk_bs_md_create_blob() => spdk_bs_create_blob() 3652- spdk_bs_md_open_blob() => spdk_bs_open_blob() 3653- spdk_bs_md_delete_blob() => spdk_bs_delete_blob() 3654- spdk_bs_md_iter_first() => spdk_bs_iter_first() 3655- spdk_bs_md_iter_next() => spdk_bs_iter_next() 3656 3657The function signature of spdk_blob_close() has changed. It now takes a struct spdk_blob * argument 3658rather than struct spdk_blob **. 3659 3660The function signature of spdk_bs_iter_next() has changed. It now takes a struct spdk_blob * argument 3661rather than struct spdk_blob **. 3662 3663Thin provisioning support has been added to the blobstore. It can be enabled by setting the 3664`thin_provision` flag in struct spdk_blob_opts when calling spdk_bs_create_blob_ext(). 3665 3666### NBD device 3667 3668The NBD application (test/lib/bdev/nbd) has been removed; Same functionality can now be 3669achieved by using the test/app/bdev_svc application and start_nbd_disk RPC method. 3670See the [GPT](http://www.spdk.io/doc/bdev.html#bdev_config_gpt) documentation for more details. 3671 3672### FIO plugin 3673 3674SPDK `fio_plugin` now supports FIO 3.3. The support for previous FIO 2.21 has been dropped, 3675although it still remains to work for now. The new FIO contains huge amount of bugfixes and 3676it's recommended to do an update. 3677 3678### Virtio library 3679 3680Previously a part of the bdev_virtio module, now a separate library. Virtio is now available 3681via `spdk_internal/virtio.h` file. This is an internal interface to be used when implementing 3682new Virtio backends, namely Virtio-BLK. 3683 3684### iSCSI 3685 3686The MinConnectionIdleInterval parameter has been removed, and connections are no longer migrated 3687to an epoll/kqueue descriptor on the master core when idle. 3688 3689## v17.10: Logical Volumes 3690 3691### New dependencies 3692 3693libuuid was added as new dependency for logical volumes. 3694 3695libnuma is now required unconditionally now that the DPDK submodule has been updated to DPDK 17.08. 3696 3697### Block Device Abstraction Layer (bdev) 3698 3699An [fio](http://github.com/axboe/fio) plugin was added that can route 3700I/O to the bdev layer. See the [plugin documentation](https://github.com/spdk/spdk/tree/master/examples/bdev/fio_plugin/) 3701for more information. 3702 3703spdk_bdev_unmap() was modified to take an offset and a length in bytes as 3704arguments instead of requiring the user to provide an array of SCSI 3705unmap descriptors. This limits unmaps to a single contiguous range. 3706 3707spdk_bdev_write_zeroes() was introduced. It ensures that all specified blocks will be zeroed out. 3708If a block device doesn't natively support a write zeroes command, the bdev layer emulates it using 3709write commands. 3710 3711New API functions that accept I/O parameters in units of blocks instead of bytes 3712have been added: 3713 3714- spdk_bdev_read_blocks(), spdk_bdev_readv_blocks() 3715- spdk_bdev_write_blocks(), spdk_bdev_writev_blocks() 3716- spdk_bdev_write_zeroes_blocks() 3717- spdk_bdev_unmap_blocks() 3718 3719The bdev layer now handles temporary out-of-memory I/O failures internally by queueing the I/O to be 3720retried later. 3721 3722### Linux AIO bdev 3723 3724The AIO bdev now allows the user to override the auto-detected block size. 3725 3726### NVMe driver 3727 3728The NVMe driver now recognizes the NVMe 1.3 Namespace Optimal I/O Boundary field. 3729NVMe 1.3 devices may report an optimal I/O boundary, which the driver will take 3730into account when splitting I/O requests. 3731 3732The HotplugEnable option in `[Nvme]` sections of the configuration file is now 3733"No" by default. It was previously "Yes". 3734 3735The NVMe library now includes a spdk_nvme_ns_get_ctrlr() function which returns the 3736NVMe Controller associated with a given namespace. 3737 3738The NVMe library now allows the user to specify a host identifier when attaching 3739to a controller. The host identifier is used as part of the Reservations feature, 3740as well as in the NVMe-oF Connect command. The default host ID is also now a 3741randomly-generated UUID, and the default host NQN uses the host ID to generate 3742a UUID-based NQN. 3743 3744spdk_nvme_connect() was added to allow the user to connect directly to a single 3745NVMe or NVMe-oF controller. 3746 3747### NVMe-oF Target (nvmf_tgt) 3748 3749The NVMe-oF target no longer requires any in-capsule data buffers to run, and 3750the feature is now entirely optional. Previously, at least 4 KiB in-capsule 3751data buffers were required. 3752 3753NVMe-oF subsystems have a new configuration option, AllowAnyHost, to control 3754whether the host NQN whitelist is enforced when accepting new connections. 3755If no Host options have been specified and AllowAnyHost is disabled, the 3756connection will be denied; this is a behavior change from previous releases, 3757which allowed any host NQN to connect if the Host list was empty. 3758AllowAnyHost is disabled by default. 3759 3760NVMe-oF namespaces may now be assigned arbitrary namespace IDs, and the number 3761of namespaces per subsystem is no longer limited. 3762 3763The NVMe-oF target now supports the Write Zeroes command. 3764 3765### Environment Abstraction Layer 3766 3767A new default value, SPDK_MEMPOOL_DEFAULT_CACHE_SIZE, was added to provide 3768additional clarity when constructing spdk_mempools. Previously, -1 could be 3769passed and the library would choose a reasonable default, but this new value 3770makes it explicit that the default is being used. 3771 3772### Blobstore 3773 3774The blobstore super block now contains a bstype field to identify the type of the blobstore. 3775Existing code should be updated to fill out bstype when calling spdk_bs_init() and spdk_bs_load(). 3776 3777spdk_bs_destroy() was added to allow destroying blobstore on device 3778with an initialized blobstore. 3779 3780spdk_bs_io_readv_blob() and spdk_bs_io_writev_blob() were added to enable 3781scattered payloads. 3782 3783A CLI tool for blobstore has been added, allowing basic operations through either command 3784line or shell interface. See the [blobcli](https://github.com/spdk/spdk/tree/master/examples/blob/cli) 3785documentation for more details. 3786 3787### Event Framework 3788 3789The ability to set a thread name, previously only used by the reactor code, is 3790now part of the spdk_thread_allocate() API. Users may specify a thread name 3791which will show up in tools like `gdb`. 3792 3793### Log 3794 3795The spdk_trace_dump() function now takes a new parameter to allow the caller to 3796specify an output file handle (stdout or stderr, for example). 3797 3798### Logical Volumes 3799 3800Logical volumes library built on top of SPDK blobstore has been added. 3801It is possible to create logical volumes on top of other devices using RPC. 3802 3803See the [logical volumes](http://www.spdk.io/doc/logical_volumes.html) documentation for more information. 3804 3805### Persistent Memory 3806 3807A new persistent memory bdev type has been added. 3808The persistent memory block device is built on top of [libpmemblk](http://pmem.io/nvml/libpmemblk/). 3809It is possible to create pmem devices on top of pmem pool files using RPC. 3810 3811See the [Pmem Block Device](http://www.spdk.io/doc/bdev.html#bdev_config_pmem) documentation for more information. 3812 3813### Virtio SCSI driver 3814 3815A userspace driver for Virtio SCSI devices has been added. 3816The driver is capable of creating block devices on top of LUNs exposed by another SPDK vhost-scsi application. 3817 3818See the [Virtio SCSI](http://www.spdk.io/doc/virtio.html) documentation and 3819[Getting Started](http://www.spdk.io/doc/bdev.html#bdev_config_virtio_scsi) guide for more information. 3820 3821### Vhost target 3822 3823The vhost target application now supports live migration between QEMU instances. 3824 3825## v17.07: Build system improvements, userspace vhost-blk target, and GPT bdev 3826 3827### Build System 3828 3829A `configure` script has been added to simplify the build configuration process. 3830The existing CONFIG file and `make CONFIG_...` options are also still supported. 3831Run `./configure --help` for information about available configuration options. 3832 3833A DPDK submodule has been added to make building SPDK easier. If no `--with-dpdk` 3834option is specified to configure, the SPDK build system will automatically build a 3835known-good configuration of DPDK with the minimal options enabled. See the Building 3836section of README.md for more information. 3837 3838A [Vagrant](https://www.vagrantup.com/) setup has been added to make it easier to 3839develop and use SPDK on systems without suitable NVMe hardware. See the Vagrant 3840section of README.md for more information. 3841 3842### Userspace vhost-blk target 3843 3844The vhost library and example app have been updated to support the vhost-blk 3845protocol in addition to the existing vhost-scsi protocol. 3846See the [vhost documentation](http://www.spdk.io/doc/vhost.html) for more details. 3847 3848### Block device abstraction layer (bdev) 3849 3850A GPT virtual block device has been added, which automatically exposes GPT partitions 3851with a special SPDK-specific partition type as bdevs. 3852See the [GPT bdev documentation](http://www.spdk.io/doc/bdev.md#bdev_config_gpt) for 3853more information. 3854 3855### NVMe driver 3856 3857The NVMe driver has been updated to support recent Intel SSDs, including the Intel® 3858Optane™ SSD DC P4800X series. 3859 3860A workaround has been added for devices that failed to recognize register writes 3861during controller reset. 3862 3863The NVMe driver now allocates request tracking objects on a per-queue basis. The 3864number of requests allowed on an I/O queue may be set during `spdk_nvme_probe()` by 3865modifying `io_queue_requests` in the opts structure. 3866 3867The SPDK NVMe `fio_plugin` has been updated to support multiple threads (`numjobs`). 3868 3869spdk_nvme_ctrlr_alloc_io_qpair() has been modified to allow the user to override 3870controller-level options for each individual I/O queue pair. 3871Existing callers with qprio == 0 can be updated to: 3872~~~ 3873... = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, NULL, 0); 3874~~~ 3875Callers that need to specify a non-default qprio should be updated to: 3876~~~ 3877struct spdk_nvme_io_qpair_opts opts; 3878spdk_nvme_ctrlr_get_default_io_qpair_opts(ctrlr, &opts, sizeof(opts)); 3879opts.qprio = SPDK_NVME_QPRIO_...; 3880... = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, &opts, sizeof(opts)); 3881~~~ 3882 3883### Environment Abstraction Layer 3884 3885The environment abstraction layer has been updated to include several new functions 3886in order to wrap additional DPDK functionality. See `include/spdk/env.h` for the 3887current set of functions. 3888 3889### SPDK Performance Analysis with Intel® VTune™ Amplifier 3890 3891Support for SPDK performance analysis has been added to Intel® VTune™ Amplifier 2018. 3892 3893This analysis provides: 3894 3895- I/O performance monitoring (calculating standard I/O metrics like IOPS, throughput, etc.) 3896- Tuning insights on the interplay of I/O and compute devices by estimating how many cores 3897 would be reasonable to provide for SPDK to keep up with a current storage workload. 3898 3899See the VTune Amplifier documentation for more information. 3900 3901## v17.03: Blobstore and userspace vhost-scsi target 3902 3903### Blobstore and BlobFS 3904 3905The blobstore is a persistent, power-fail safe block allocator designed to be 3906used as the local storage system backing a higher-level storage service. 3907See the [blobstore documentation](http://www.spdk.io/doc/blob.html) for more details. 3908 3909BlobFS adds basic filesystem functionality like filenames on top of the blobstore. 3910This release also includes a RocksDB Env implementation using BlobFS in place of the 3911kernel filesystem. 3912See the [BlobFS documentation](http://www.spdk.io/doc/blobfs.html) for more details. 3913 3914### Userspace vhost-scsi target 3915 3916A userspace implementation of the QEMU vhost-scsi protocol has been added. 3917The vhost target is capable of exporting SPDK bdevs to QEMU-based VMs as virtio devices. 3918See the [vhost documentation](http://www.spdk.io/doc/vhost.html) for more details. 3919 3920### Event framework 3921 3922The overhead of the main reactor event loop was reduced by optimizing the number of 3923calls to spdk_get_ticks() per iteration. 3924 3925### NVMe library 3926 3927The NVMe library will now automatically split readv/writev requests with scatter-gather 3928lists that do not map to valid PRP lists when the NVMe controller does not natively 3929support SGLs. 3930 3931The `identify` and `perf` NVMe examples were modified to add a consistent format for 3932specifying remote NVMe over Fabrics devices via the `-r` option. 3933This is implemented using the new `spdk_nvme_transport_id_parse()` function. 3934 3935### iSCSI Target 3936 3937The [Nvme] section of the configuration file was modified to remove the `BDF` directive 3938and replace it with a `TransportID` directive. Both local (PCIe) and remote (NVMe-oF) 3939devices can now be specified as the backing block device. A script to generate an 3940entire [Nvme] section based on the local NVMe devices attached was added at 3941`scripts/gen_nvme.sh`. 3942 3943### NVMe-oF Target 3944 3945The [Nvme] section of the configuration file was modified to remove the `BDF` directive 3946and replace it with a `TransportID` directive. Both local (PCIe) and remote (NVMe-oF) 3947devices can now be specified as the backing block device. A script to generate an 3948entire [Nvme] section based on the local NVMe devices attached was added at 3949`scripts/gen_nvme.sh`. 3950 3951## v16.12: NVMe over Fabrics host, hotplug, and multi-process 3952 3953### NVMe library 3954 3955The NVMe library has been changed to create its own request memory pool rather than 3956requiring the user to initialize the global `request_mempool` variable. Apps can be 3957updated by simply removing the initialization of `request_mempool`. Since the NVMe 3958library user no longer needs to know the size of the internal NVMe request 3959structure to create the pool, the `spdk_nvme_request_size()` function was also removed. 3960 3961The `spdk_nvme_ns_cmd_deallocate()` function was renamed and extended to become 3962`spdk_nvme_ns_cmd_dataset_management()`, which allows access to all of the NVMe 3963Dataset Management command's parameters. Existing callers can be updated to use 3964`spdk_nvme_ns_cmd_dataset_management()` with `SPDK_NVME_DSM_ATTR_DEALLOCATE` as the 3965`type` parameter. 3966 3967The NVMe library SGL callback prototype has been changed to return virtual addresses 3968rather than physical addresses. Callers of `spdk_nvme_ns_cmd_readv()` and 3969`spdk_nvme_ns_cmd_writev()` must update their `next_sge_fn` callbacks to match. 3970 3971The NVMe library now supports NVMe over Fabrics devices in addition to the existing 3972support for local PCIe-attached NVMe devices. For an example of how to enable 3973NVMe over Fabrics support in an application, see `examples/nvme/identify` and 3974`examples/nvme/perf`. 3975 3976Hot insert/remove support for NVMe devices has been added. To enable NVMe hotplug 3977support, an application should call the `spdk_nvme_probe()` function on a regular 3978basis to probe for new devices (reported via the existing `probe_cb` callback) and 3979removed devices (reported via a new `remove_cb` callback). Hotplug is currently 3980only supported on Linux with the `uio_pci_generic` driver, and newly-added NVMe 3981devices must be bound to `uio_pci_generic` by an external script or tool. 3982 3983Multiple processes may now coordinate and use a single NVMe device simultaneously 3984using [DPDK Multi-process Support](http://dpdk.org/doc/guides/prog_guide/multi_proc_support.html). 3985 3986### NVMe over Fabrics target (`nvmf_tgt`) 3987 3988The `nvmf_tgt` configuration file format has been updated significantly to enable 3989new features. See the example configuration file `etc/spdk/nvmf.conf.in` for 3990more details on the new and changed options. 3991 3992The NVMe over Fabrics target now supports virtual mode subsystems, which allow the 3993user to export devices from the SPDK block device abstraction layer as NVMe over 3994Fabrics subsystems. Direct mode (raw NVMe device access) is also still supported, 3995and a single `nvmf_tgt` may export both types of subsystems simultaneously. 3996 3997### Block device abstraction layer (bdev) 3998 3999The bdev layer now supports scatter/gather read and write I/O APIs, and the NVMe 4000blockdev driver has been updated to support scatter/gather. Apps can use the 4001new scatter/gather support via the `spdk_bdev_readv()` and `spdk_bdev_writev()` 4002functions. 4003 4004The bdev status returned from each I/O has been extended to pass through NVMe 4005or SCSI status codes directly in cases where the underlying device can provide 4006a more specific status code. 4007 4008A Ceph RBD (RADOS Block Device) blockdev driver has been added. This allows the 4009`iscsi_tgt` and `nvmf_tgt` apps to export Ceph RBD volumes as iSCSI LUNs or 4010NVMe namespaces. 4011 4012### General changes 4013 4014`libpciaccess` has been removed as a dependency and DPDK PCI enumeration is 4015used instead. Prior to DPDK 16.07 enumeration by class code was not supported, 4016so for earlier DPDK versions, only Intel SSD DC P3x00 devices will be discovered 4017by the NVMe library. 4018 4019The `env` environment abstraction library has been introduced, and a default 4020DPDK-based implementation is provided as part of SPDK. The goal of the `env` 4021layer is to enable use of alternate user-mode memory allocation and PCI access 4022libraries. See `doc/porting.md` for more details. 4023 4024The build process has been modified to produce all of the library files in the 4025`build/lib` directory. This is intended to simplify the use of SPDK from external 4026projects, which can now link to SPDK libraries by adding the `build/lib` directory 4027to the library path via `-L` and linking the SPDK libraries by name (for example, 4028`-lspdk_nvme -lspdk_log -lspdk_util`). 4029 4030`nvmf_tgt` and `iscsi_tgt` now have a JSON-RPC interface, which allows the user 4031to query and modify the configuration at runtime. The RPC service is disabled by 4032default, since it currently does not provide any authentication or security 4033mechanisms; it should only be enabled on systems with controlled user access 4034behind a firewall. An example RPC client implemented in Python is provided in 4035`scripts/rpc.py`. 4036 4037## v16.08: iSCSI target, NVMe over Fabrics maturity 4038 4039This release adds a userspace iSCSI target. The iSCSI target is capable of exporting 4040NVMe devices over a network using the iSCSI protocol. The application is located 4041in app/iscsi_tgt and a documented configuration file can be found at etc/spdk/spdk.conf.in. 4042 4043This release also significantly improves the existing NVMe over Fabrics target. 4044 4045- The configuration file format was changed, which will require updates to 4046 any existing nvmf.conf files (see `etc/spdk/nvmf.conf.in`): 4047 - `SubsystemGroup` was renamed to `Subsystem`. 4048 - `AuthFile` was removed (it was unimplemented). 4049 - `nvmf_tgt` was updated to correctly recognize NQN (NVMe Qualified Names) 4050 when naming subsystems. The default node name was changed to reflect this; 4051 it is now "nqn.2016-06.io.spdk". 4052 - `Port` and `Host` sections were merged into the `Subsystem` section 4053 - Global options to control max queue depth, number of queues, max I/O 4054 size, and max in-capsule data size were added. 4055 - The Nvme section was removed. Now a list of devices is specified by 4056 bus/device/function directly in the Subsystem section. 4057 - Subsystems now have a Mode, which can be Direct or Virtual. This is an attempt 4058 to future-proof the interface, so the only mode supported by this release 4059 is "Direct". 4060- Many bug fixes and cleanups were applied to the `nvmf_tgt` app and library. 4061- The target now supports discovery. 4062 4063This release also adds one new feature and provides some better examples and tools 4064for the NVMe driver. 4065 4066- The Weighted Round Robin arbitration method is now supported. This allows 4067 the user to specify different priorities on a per-I/O-queue basis. To 4068 enable WRR, set the `arb_mechanism` field during `spdk_nvme_probe()`. 4069- A simplified "Hello World" example was added to show the proper way to use 4070 the NVMe library API; see `examples/nvme/hello_world/hello_world.c`. 4071- A test for measuring software overhead was added. See `test/lib/nvme/overhead`. 4072 4073## v16.06: NVMf userspace target 4074 4075This release adds a userspace NVMf (NVMe over Fabrics) target, conforming to the 4076newly-released NVMf 1.0/NVMe 1.2.1 specification. The NVMf target exports NVMe 4077devices from a host machine over the network via RDMA. Currently, the target is 4078limited to directly exporting physical NVMe devices, and the discovery subsystem 4079is not supported. 4080 4081This release includes a general API cleanup, including renaming all declarations 4082in public headers to include a `spdk` prefix to prevent namespace clashes with 4083user code. 4084 4085- NVMe 4086 - The `nvme_attach()` API was reworked into a new probe/attach model, which 4087 moves device detection into the NVMe library. The new API also allows 4088 parallel initialization of NVMe controllers, providing a major reduction in 4089 startup time when using multiple controllers. 4090 - I/O queue allocation was changed to be explicit in the API. Each function 4091 that generates I/O requests now takes a queue pair (`spdk_nvme_qpair *`) 4092 argument, and I/O queues may be allocated using 4093 `spdk_nvme_ctrlr_alloc_io_qpair()`. This allows more flexible assignment of 4094 queue pairs than the previous model, which only allowed a single queue 4095 per thread and limited the total number of I/O queues to the lowest number 4096 supported on any attached controller. 4097 - Added support for the Write Zeroes command. 4098 - `examples/nvme/perf` can now report I/O command latency from the 4099 the controller's viewpoint using the Intel vendor-specific read/write latency 4100 log page. 4101 - Added namespace reservation command support, which can be used to coordinate 4102 sharing of a namespace between multiple hosts. 4103 - Added hardware SGL support, which enables use of scattered buffers that 4104 don't conform to the PRP list alignment and length requirements on supported 4105 NVMe controllers. 4106 - Added end-to-end data protection support, including the ability to write and 4107 read metadata in extended LBA (metadata appended to each block of data in the 4108 buffer) and separate metadata buffer modes. 4109 See `spdk_nvme_ns_cmd_write_with_md()` and `spdk_nvme_ns_cmd_read_with_md()` 4110 for details. 4111- IOAT 4112 - The DMA block fill feature is now exposed via the `ioat_submit_fill()` 4113 function. This is functionally similar to `memset()`, except the memory is 4114 filled with an 8-byte repeating pattern instead of a single byte like memset. 4115- PCI 4116 - Added support for using DPDK for PCI device mapping in addition to the 4117 existing libpciaccess option. Using the DPDK PCI support also allows use of 4118 the Linux VFIO driver model, which means that SPDK userspace drivers will work 4119 with the IOMMU enabled. Additionally, SPDK applications may be run as an 4120 unprivileged user with access restricted to a specific set of PCIe devices. 4121 - The PCI library API was made more generic to abstract away differences 4122 between the underlying PCI access implementations. 4123 4124## v1.2.0: IOAT user-space driver 4125 4126This release adds a user-space driver with support for the Intel I/O Acceleration Technology 4127(I/OAT, also known as "Crystal Beach") DMA offload engine. 4128 4129- IOAT 4130 - New user-space driver supporting DMA memory copy offload 4131 - Example programs `ioat/perf` and `ioat/verify` 4132 - Kernel-mode DMA engine test driver `kperf` for performance comparison 4133- NVMe 4134 - Per-I/O flags for Force Unit Access (FUA) and Limited Retry 4135 - Public API for retrieving log pages 4136 - Reservation register/acquire/release/report command support 4137 - Scattered payload support - an alternate API to provide I/O buffers via a sequence of callbacks 4138 - Declarations and `nvme/identify` support for Intel SSD DC P3700 series vendor-specific log pages and features 4139- Updated to support DPDK 2.2.0 4140 4141## v1.0.0: NVMe user-space driver 4142 4143This is the initial open source release of the Storage Performance Development Kit (SPDK). 4144 4145Features: 4146 4147- NVMe user-space driver 4148- NVMe example programs 4149 - `examples/nvme/perf` tests performance (IOPS) using the NVMe user-space driver 4150 - `examples/nvme/identify` displays NVMe controller information in a human-readable format 4151- Linux and FreeBSD support 4152