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