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