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