1# Changelog 2 3## v20.07: (Upcoming Release) 4 5### nvme 6 7Add `opts_size` in `spdk_nvme_ctrlr_opts` structure in order to solve the compatiblity issue 8for different ABI version. 9 10### RPC 11 12Command line parameters `-r` and `--rpc-socket` will longer accept TCP ports. RPC server 13must now be started on a Unix domain socket. Exposing RPC on the network, as well as providing 14proper authentication (if needed) is now a responsibility of the user. 15 16### accel 17 18A new API was added `spdk_accel_get_capabilities` that allows applications to 19query the capabilities of the currently enabled accel engine back-end. 20 21A new capability, CRC-32C, was added via `spdk_accel_submit_crc32c`. 22 23The software accel engine implemenation has added support for CRC-32C. 24 25A new capability, compare, was added via `spdk_accel_submit_compare`. 26 27The software accel engine implemenation has added support for compare. 28 29### dpdk 30 31Updated DPDK submodule to DPDK 19.11.2, which includes fixes for DPDK vulnerabilities: 32CVE-2020-10722, CVE-2020-10723, CVE-2020-10724, CVE-2020-10725, CVE-2020-10724. 33 34### idxd 35 36IDXD engine support for CRC-32C has been added. 37 38### rdma 39 40A new `rdma` library has been added. It is an abstraction layer over different RDMA providers. 41Two providers are available - verbs (used by default when RDMA is enabled or enabled explicitly 42using --with-rdma=verbs) and mlx5 Direct Verbs aka DV (enabled by --with-rdma=mlx5_dv). 43Using mlx5_dv requires libmlx5 installed on the system. 44 45### rpc 46 47Parameter `-p` or `--max-qpairs-per-ctrlr` of `nvmf_create_transport` RPC command accepted by the 48rpc.py script is deprecated, new parameter `-m` or `--max-io-qpairs-per-ctrlr` is added. 49 50Parameter `max_qpairs_per_ctrlr` of `nvmf_create_transport` RPC command accepted by the NVMF target 51is deprecated, new parameter `max_io_qpairs_per_ctrlr` is added. 52 53### sock 54 55Added `spdk_sock_impl_get_opts` and `spdk_sock_impl_set_opts` functions to set/get socket layer configuration 56options. Options can be set independently for each implementation. 57 58Added `recv_buf_size` and 'send_buf_size' socket layer options. They are used only in posix implementation. 59 60### vhost 61 62The function `spdk_vhost_blk_get_dev` has been removed. 63 64## v20.04: 65 66IDXD engine support for compare has been added. 67 68### configuration 69 70Legacy INI style configuration for SPDK applications has been deprecated and will be 71removed in future release. 72Please switch to JSON-RPC configuration files and/or RPC driven run-time configuration. 73 74### copy 75 76The copy engine library, modules and public APIs have been renamed. Use of the word `copy` 77has been replaced with the word `accel` short for accelerator in preparation for adding new 78capabilities in the future. Additionally, APIs for what was previously called the `memcpy` 79engine have been renamed to identify the engine as a software accelerator. 80 81### crypto 82 83Support for AES_XTS was added for the QAT polled mode driver (pmd). The create RPC 84`bdev_crypto_create` has 2 new optional parameters: cipher and key2. Cipher can be either 85AES_CBC (default) or AES_XTS. AES_XTS is only valid when using the QAT polled mode driver. 86The key2 parameter is the second key required for AES_XTS. 87 88### event 89 90Reactors now accumulate CPU stats and they are retrieved by the RPC `framework_get_reactors`. 91 92### idxd 93 94IDXD support was added in the form of a low level library that can directly 95utilize the IDXD offload engine as well as an accel plug-in module allowing for use 96with the generic accel framework API. IDXD is the first in a family of offload 97engines that share the same interface, specifically DSA is added here. More info 98can be found here: https://01.org/blogs/2019/introducing-intel-data-streaming-accelerator 99 100Much of the implementation models IOAT, however the low level interfaces are very 101different. The RPC to enable IDXD requires a configuration number as well. The 102code includes two pre-defined configurations of IDXD groups/work queues/engines. A future 103version will provide an interface to allow for setting of individual configuration 104parameters. 105 106IDXD is not yet available so this feature should be considered experimental. It will 107be built up with additional documentation as an ongoing activity. 108 109### iscsi 110 111The iSCSI target now creates a lightweight thread per poll group instead of assuming a pool 112of lightweight threads already exist at start up time. A poll group is a collection of 113unrelated iSCSI connections. Each poll group is only accessed from the associated 114lightweight thread. 115 116### ftl 117 118Several changes have been made to the `spdk_ftl_conf`, `spdk_ftl_dev_init_ops`, and 119`spdk_ftl_attrs` structs. Please see `include/spdk/ftl.h` for more details. 120 121### miscellaneous 122 123The `--json-ignore-init-errors` command line parameter has been added to ignore 124initialization errors on JSON config load. 125 126The public header file io_channel.h has been removed. Please use thread.h which has the 127exact same API. 128 129### nvme 130 131Exported internal nvme_ctrlr_cmd_security_receive/send() APIs as public APIs with "the spdk_" 132prefix. 133 134Added `priority` field in `spdk_nvme_transport_id`, this field is used to specify the priority 135of the NVMe-oF connection, and currently it is used for NVMe-oF tcp connection. 136 137A new poll group API has been added to allow for pooling of nvme qpairs across a single 138entity which can be polled for completions. This new API consists of the `spdk_nvme_poll_group` 139family of functions. As a result of this new API, all NVMe transports are expected to implement 140several poll group related functions. 141 142A new flag, `create_only`, has been added to the `spdk_nvme_io_qpair_opts` structure. This flag 143allows a user to call `spdk_nvme_ctrlr_get_default_io_qpair` without also connecting the qpair 144within the context of that call. 145 146As a result of the `create_only` flag, two new API functions, `spdk_nvme_ctrlr_connect_io_qpair` 147and `spdk_nvme_ctrlr_disconnect_io_qpair`, have been added to facilitate connecting newly created 148qpairs (for example, after they have been added to a poll group) and disconnecting qpairs without 149destroying them (for example to disconnect a qpair before migrating it to a new poll group and 150reconnecting it). 151 152The functions `spdk_nvme_ctrlr_alloc_cmb_io_buffer` and `spdk_nvme_ctrlr_free_cmb_io_buffer` 153have been changed to `spdk_nvme_ctrlr_map_cmb` and `spdk_nvme_ctrlr_unmap_cmb` respectively. 154 155An additional function, `spdk_nvme_ctrlr_reserve_cmb`, has been added to facilitate reserving 156the entire size of the controller memory buffer for data transfer. 157 158### nvme_cuse 159 160`spdk_nvme_cuse_get_ctrlr_name` now takes two additional parameters, `char *name` which 161stores the pointer to the controller name, and `size_t *size` which stores the length of 162the name. The return type has also been changed from char * to int. 163 164`spdk_nvme_cuse_get_ns_name` now takes two additional parameters, `char *name` which 165stores the pointer to the namespace name, and `size_t *size` which stores the length of 166the name. The return type has also been changed from char * to int. 167 168### nvme_opal 169 170Several public OPAL structure definitions have been changed since the last release. 171 172### nvmf 173 174`spdk_nvmf_poll_group_destroy()` is now asynchronous and accepts a completion callback. 175 176The NVMe-oF target now creates a lightweight thread per poll group instead of assuming a pool 177of lightweight threads already exist at start up time. A poll group is a collection of 178unrelated NVMe-oF connections. Each poll group is only accessed from the associated 179lightweight thread. 180 181A new struct, `spdk_nvmf_subsystem_listener`, has been added to encapsulate the subsystem specific 182nature of a listener object. 183 184`spdk_nvmf_tgt_listen` no longer accepts a callback function or argument. It also returns an 185int to indicate the status of the listen call. 186 187The execution of `spdk_nvme_poll_group_destroy` is now asynchronous and the function accepts 188a cb_fn and cb_arg to call upon completion. 189 190The execution of `spdk_nvmf_subsystem_add_listener` is now asynchronous and the function accepts 191a cb_fn and cb_arg to call upon completion. 192 193The `nvmf_transport.h` header has been made public to allow custom NVMe-oF transports to integrate 194with NVMe-oF libraries without using internal APIs. 195 196### ocf 197 198Updated the OCF submodule to OCF v20.03 199 200New version of OCF comes with API changes and bug fixes 201 202### rpc 203 204A new RPC `thread_set_cpumask` has been added to set the cpumask of the thread 205to the specified value. 206 207A new RPC `thread_get_pollers` has been added to retrieve pollers from SPDK threads. 208 209A new RPC `thread_get_io_channels` has been added to retrieve I/O channels from SPDK threads. 210 211A new RPC `bdev_rbd_resize` has been added to resize Ceph RBD bdevs. 212 213### sock 214 215The `spdk_sock_set_priority` function has been removed since the feature to set the sock priority 216will be contained in two new functions, i.e., `spdk_sock_listen_ext` and `spdk_sock_connect_ext`. 217Users may now specify the priority of the socket in the opts that they want to use. 218 219### spdk_top 220 221A new application, `spdk_top`, has been added which allows users to monitor resource consumption 222by a running SPDK application. More information on this application can be found in 223`app/spdk_top/README`. 224 225### thread 226 227A new function `spdk_thread_lib_init_ext` has been added, and the function 228`spdk_thread_lib_init` has been deprecated. The user of `spdk_thread_lib_init_ext` is 229expected to implement both functions `spdk_thread_op_fn` and `spdk_thread_op_supported_fn`. 230`spdk_thread_op_supported_fn` is called to check whether the SPDK thread operation 231is supported. `spdk_thread_op_fn` is called to execute the SPDK thread operation. 232Current SPDK operation types are `SPDK_THREAD_OP_NEW` and `SPDK_THREAD_OP_RESCHED`. 233The operation `SPDK_THREAD_OP_NEW` is called each time a new thread is created. 234The operation `SPDK_THREAD_OP_RESCHED` is called when SPDK thread needs to be rescheduled. 235 236A unique ID has been added for each created SPDK thread, it is retrieved by a new function 237`spdk_thread_get_id`, and the SPDK thread which has the specific ID is got by 238a new function `spdk_thread_get_by_id`. 239 240A new function `spdk_thread_cpumask` has been added to set the current thread's cpumask 241to the specified value. The function requires the operation `SPDK_THREAD_OP_RESCHED` 242is supported. 243 244A new function `spdk_poller_register_named` has been added to set arbitrary name to the 245created poller. If NULL, the name is set to the pointer of the poller function. 246 247The function `spdk_thread_poll` now measures run time per call correctly on multiple SPDK 248threads configuration, and a new function `spdk_thread_get_last_tsc` has been added to use together. 249 250Voluntary termination of SPDK thread has been supported by refining the functions `spdk_thread_exit` 251and `spdk_thread_poll`. 252 253### util 254 255New functions `spdk_sn32_lt` and `spdk_sn32_gt` have been added. They compare two sequence 256numbers based on serial number arithmetic. 257 258### vhost 259 260Poll groups per session have been replaced by SPDK threads per vhost controller. 261 262### vmd 263 264A new function, `spdk_vmd_fini`, has been added. It releases all resources acquired by the VMD 265library through the `spdk_vmd_init` call. 266 267## v20.01 268 269### bdev 270 271A new function, `spdk_bdev_set_timeout`, has been added to set per descriptor I/O timeouts. 272 273A new class of functions `spdk_bdev_compare*`, have been added to allow native bdev support 274of block comparisons and compare-and-write. 275 276A new class of bdev events, `SPDK_BDEV_EVENT_MEDIA_MANAGEMENT`, has been added to allow bdevs 277which expose raw media to alert all I/O channels of pending media management events. 278 279A new API was added `spdk_bdev_io_get_aux_buf` allowing the caller to request 280an auxiliary buffer for its own private use. The API is used in the same manner that 281`spdk_bdev_io_get_buf` is used and the length of the buffer is always the same as the 282bdev_io primary buffer. 'spdk_bdev_io_put_aux_buf' frees the allocated auxiliary 283buffer. 284 285### blobfs 286 287Added boolean return value for function spdk_fs_set_cache_size to indicate its operation result. 288 289Added `blobfs_set_cache_size` RPC method to set cache size for blobstore filesystem. 290 291### blobstore 292 293Added new `use_extent_table` option to `spdk_blob_opts` for creating blobs with Extent Table descriptor. 294Using this metadata format, dramatically decreases number of writes required to persist each cluster allocation 295for thin provisioned blobs. Extent Table descriptor is enabled by default. 296See the [Blobstore Programmer's Guide](https://spdk.io/doc/blob.html#blob_pg_cluster_layout) for more details. 297 298### dpdk 299 300Updated DPDK submodule to DPDK 19.11. 301 302### env_dpdk 303 304`spdk_env_dpdk_post_init` now takes a boolean, `legacy_mem`, as an argument. 305 306A new function, `spdk_env_dpdk_dump_mem_stats`, prints information about the memory consumed by DPDK to a file specified by 307the user. A new utility, `scripts/dpdk_mem_info.py`, wraps this function and prints the output in an easy to read way. 308 309### event 310 311The functions `spdk_reactor_enable_framework_monitor_context_switch()` and 312`spdk_reactor_framework_monitor_context_switch_enabled()` have been changed to 313`spdk_framework_enable_context_switch_monitor()` and 314`spdk_framework_context_switch_monitor_enabled()`, respectively. 315 316### ftl 317 318All NVMe dependencies were removed from ftl library. 319From now ftl library is using bdev_zone API. 320bdev_ftl becomes virtual bdev. 321 322`ctrlr` and `trid` fields in `spdk_ftl_dev_init_opts` structure were replaced by 323`base_bdev_desc`. 324 325`bdev_ftl_create` RPC method `trtype` and `traddr` parameters were replaced by `base_bdev` 326parameter. 327 328`spdk_ftl_module_init` and `spdk_ftl_module_fini` functions were removed. 329 330`spdk_ftl_punit_range` and `ftl_module_init_opts` structures were removed. 331 332### isa-l 333 334Updated ISA-L submodule to commit f3993f5c0b6911 which includes implementation and 335optimization for aarch64. 336 337Enabled ISA-L on aarch64 by default in addition to x86. 338 339### nvme 340 341`delayed_pcie_doorbell` parameter in `spdk_nvme_io_qpair_opts` was renamed to `delay_cmd_submit` 342to allow reuse in other transports. 343 344Added RDMA WR batching to NVMf RDMA initiator. Send and receive WRs are chained together 345and posted with a single call to ibv_post_send(receive) in the next call to qpair completion 346processing function. Batching is controlled by 'delay_cmd_submit' qpair option. 347 348The NVMe-oF initiator now supports plugging out of tree NVMe-oF transports. In order 349to facilitate this feature, several small API changes have been made: 350 351The `spdk_nvme_transport_id` struct now contains a trstring member used to identify the transport. 352A new function, `spdk_nvme_transport_available_by_name`, has been added. 353A function table, `spdk_nvme_transport_ops`, and macro, `SPDK_NVME_TRANSPORT_REGISTER`, have been added which 354enable registering out of tree transports. 355 356A new function, `spdk_nvme_ns_supports_compare`, allows a user to check whether a given namespace supports the compare 357operation. 358 359A new family of functions, `spdk_nvme_ns_compare*`, give the user access to submitting compare commands to NVMe namespaces. 360 361A new function, `spdk_nvme_ctrlr_cmd_get_log_page_ext`, gives users more granular control over the command dwords sent in 362log page requests. 363 364### nvmf 365 366Add SockPriority option in [Transport] section, this can be used for NVMe-oF target 367on TCP transport to set sock priority for the incomming TCP connections. 368 369The NVMe-oF target now supports plugging out of tree NVMe-oF transports. In order 370to facilitate this feature, several small API changes have been made: 371 372The `spdk_nvme_transport_id` struct now contains a trstring member used to identify the transport. 373`spdk_nvmf_tgt_get_transport`, `spdk_nvmf_transport_opts_init`, and `spdk_nvmf_transport_create` all have been 374modified to take a string. 375A function table, `spdk_nvmf_transport_ops`, and macro, `SPDK_NVMF_TRANSPORT_REGISTER`, have been added which 376enable registering out of tree transports. 377 378Add `spdk_nvmf_tgt_stop_listen()` that can be used to stop listening for 379incoming connections for specified target and trid. Listener is not stopped 380implicitly upon destruction of a subsystem any more. 381 382A custom NVMe admin command handler has been added which allows the user to use the real drive 383attributes from one of the target NVMe drives when reporting drive attributes to the initiator. 384This handler can be enabled via the `nvmf_set_config` RPC. 385Note: In a future version of SPDK, this handler will be enabled by default. 386 387The SPDK target and initiator both now include compare-and-write functionality with one caveat. If using the RDMA transport, 388the target expects the initiator to send both the compare command and write command either with, or without inline data. The 389SPDK initiator currently respects this requirement, but this note is included as a flag for other initiators attempting 390compatibility with this version of SPDK. 391 392The `spdk_nvme_ctrlr_opts` struct has been extended with new field `transport_ack_timeout` which allows 393to configure transport ACK timeout. Applicable for RDMA transport only. 394 395### rpc 396 397A new RPC, `bdev_zone_block_create`, enables creating an emulated zoned bdev on top of a standard block device. 398 399A new RPC, `bdev_ocssd_create`, enables creating an emulated zoned bdev on top of an Open Channel SSD. 400 401A new RPC, `blobfs_set_cache_size`, enables managing blobfs cache size. 402 403A new RPC, `env_dpdk_get_mem_stats`, has been added to facilitate reading DPDK related memory 404consumption stats. Please see the env_dpdk section above for more details. 405 406A new RPC, `framework_get_reactors`, has been added to retrieve a list of all reactors. 407 408`bdev_ftl_create` now takes a `base_bdev` argument in lieu of `trtype`, `traddr`, and `punits`. 409 410`bdev_nvme_set_options` now allows users to disable I/O submission batching with the `-d` flag 411 412`bdev_nvme_cuse_register` now accepts a `name` parameter. 413 414`bdev_uring_create` now takes arguments for `bdev_name` and `block_size` 415 416`nvmf_set_config` now takes an argument to enable passthru of identify commands to base NVMe devices. 417Please see the nvmf section above for more details. 418 419### scsi 420 421`spdk_scsi_lun_get_dif_ctx` now takes an additional argument of type `spdk_scsi_task`. 422 423### sock 424 425Added spdk_sock_writev_async for performing asynchronous writes to sockets. This call will 426never return EAGAIN, instead queueing internally until the data has all been sent. This can 427simplify many code flows that create pollers to continue attempting to flush writes 428on sockets. 429 430Added `impl_name` parameter in spdk_sock_listen and spdk_sock_connect functions. Users may now 431specify the sock layer implementation they'd prefer to use. Valid implementations are currently 432"vpp" and "posix" and NULL, where NULL results in the previous behavior of the functions. 433 434### thread 435 436`spdk_thread_send_msg` now returns int indicating if the message was successfully 437sent. 438 439A new function `spdk_thread_send_critical_msg`, has been added to support sending a single message from 440a context that may be interrupted, e.g. a signal handler. 441 442Two new functions, `spdk_poller_pause`, and `spdk_poller_resume`, have been added to give greater control 443of pollers to the application owner. 444 445### util 446 447`spdk_pipe`, a new utility for buffering data from sockets or files for parsing 448has been added. The public API is available at `include/spdk/pipe.h`. 449 450### bdev 451 452Added spdk_bdev_io_get_nvme_fused_status function for translating bdev_io status to NVMe status 453code for fused compare-and-write operation. 454 455Added spdk_bdev_get_acwu function for getting block device atomic compare and write unit size. 456 457## v19.10 458 459### rpc 460 461Many of SPDK's RPCs were renamed to be more consistent and intuitive in this release. 462The old names will continue to function, but will display a deprecation warning. 463 464Added optional parameters '--arbitration-burst' and '--low/medium/high-priority-weight' to 465'bdev_nvme_set_options' RPC method. 466 467Added optional parameter '--md-size' to 'construct_null_bdev' RPC method. 468 469Added optional parameters '--dif-type' and '--dif-is-head-of-md' to 'construct_null_bdev' 470RPC method. 471 472Added `blobfs_detect` RPC method to detect whether a blobfs exists on given bdev. 473 474Added `blobfs_create` RPC method to build blobfs on given bdev. 475 476Added `blobfs_mount` RPC method to mount blobfs on given bdev to a host path by FUSE. 477Then on the host path, user can directly do some file operations which will be mapped 478to blobfs. 479 480### bdev 481 482Added new parameter `cdw0` to `spdk_bdev_io_complete_nvme_status()` and 483`spdk_bdev_io_get_nvme_status()` that allows setting/getting 484the NVMe completion queue DW0 entry. This allows vendor specific IO commands 485to return commmand specific completion info back to the initiator. 486 487Added `spdk_bdev_get_write_unit_size()` function for retrieving required number 488of logical blocks for write operation. 489 490New zone-related fields were added to the result of the `get_bdevs` RPC call: 491 492 - `zoned`: indicates whether the device is zoned or a regular 493 block device 494 - `zone_size`: number of blocks in a single zone 495 - `max_open_zones`: maximum number of open zones 496 - `optimal_open_zones`: optimal number of open zones 497 498The `zoned` field is a boolean and is always present, while the rest is only available for zoned 499bdevs. 500 501A new `spdk_bdev_open_ext` function has been added and `spdk_bdev_open` function has been deprecated. 502The new open function introduces requirement to provide callback function that will be called by 503asynchronous event such as bdev removal. `spdk_bdev_open_ext` function takes bdev name as 504an argument instead of bdev structure to avoid a race condition that can happen when the bdev 505is being removed between a call to get its structure based on a name and actually openning it. 506 507New 'resize' event has been added to notify about change of block count property of block device. 508Event is delivered only if block device was opened with `spdk_bdev_open_ext` function. 509 510### bdev zone 511 512Added new public header for zoned bdev. Zoned bdev is an extension 513of the bdev interface. 514 515`spdk_bdev_get_zone_size()`, `spdk_bdev_get_max_open_zones()`, `spdk_bdev_get_optimal_open_zones()` 516APIs were added for retrieving zoned device information. 517`spdk_bdev_get_zone_info()` API was added for retrieving information about zones in zoned 518device. 519Added `spdk_bdev_zone_management()` API for changing zone state. 520`spdk_bdev_zone_append()` and `spdk_bdev_zone_append_with_md()` APIs were added for 521appending data to a zone. 522Added `spdk_bdev_io_get_append location()` function for retrieving append location for I/O. 523Added `spdk_bdev_is_zoned()` function for checking if bdev supports zoned namespace semantics. 524 525### bdev opal 526 527EXPERIMENTAL: A new opal bdev has been added to support management of 528NVMe self-encrypting drives through the Opal specification. Users can 529create opal bdevs from an NVMe namespace bdev, if the controller 530containing that namespace supports Opal. Currently this is only 531supported for namespace ID=1. The following RPCs have been added to 532support Opal: `bdev_nvme_opal_init`, `bdev_nvme_opal_revert`, 533`bdev_opal_create`, `bdev_opal_delete`, `bdev_opal_get_info`, 534`bdev_opal_new_user`, `bdev_opal_set_lock_state`. 535It does not yet support recreating the opal bdevs after application restart. 536This bdev module should be considered very experimental, and the RPCs may 537change significantly in future releases. 538 539### delay bdev 540 541The `bdev_delay_update_latency` has been added to allow users to update 542a latency value for a given delay bdev. 543 544### compress bdev 545 546A new RPC `bdev_compress_get_orphans` has been added to list compress bdevs 547that were not loaded due to a missing pm metadata file. In this state they 548can only be deleted. 549 550### null bdev 551 552Metadata support has been added to Null bdev module. 553 554Protection information support has been added to Null bdev module. 555 556### nvme 557 558Added `no_shn_notification` to NVMe controller initialization options, users can enable 559it for NVMe controllers. When the option is enabled, the controller will not do the 560shutdown process and just disable the controller, users can start their application 561later again to initialize the controller to the ready state. 562 563A controller flag `SPDK_NVME_CTRLR_WRR_SUPPORTED` was added to indicate the controller 564can support weighted round robin arbitration feature with submission queue. 565 566Added `arbitration_burst` option for arbitration feature, and added three 567`low/medium/high_priority_weight` options for weighted round robin arbitration. 568 569Added `spdk_nvme_ns_cmd_write_uncorrectable`. 570 571Added new error handling and reporting functionality. This includes several 572new API functions to facilitate applications recovering when a qpair or 573controller fails. 574 575`spdk_nvme_ctrlr_reconnect_io_qpair` - Reconnects a failed I/O qpair. 576`spdk_nvme_ctrlr_set_trid` - Sets the trid of an existing controller. Can be used to 577change the trid for failover cases. 578`spdk_nvme_ctrlr_is_failed` - Returns the failed state of a controller. 579`spdk_nvme_ctrlr_fail` - Forces a controller into a failed state. 580 581Modified the return behavior of several API functions to better indicate to 582applications when a qpair is failed. This list of functions includes: 583 584`spdk_nvme_qpair_process_completions` 585`spdk_nvme_ns_cmd_*` 586`spdk_nvme_ctrlr_process_admin_completions` 587`spdk_nvme_ctrlr_cmd_*` 588 589These functions now return -ENXIO when the qpair or controller on which they 590operate is failed. 591 592EXPERIMENTAL: Added NVMe character device support to allow to create NVMe device nodes in Linux 593kernel for controller as well as for namespace and process ioctl requests as usual 594from linux environment. 595 596### nvmf 597 598The `spdk_nvmf_tgt_create` function now accepts an object of type `spdk_nvmf_target_opts` 599as its only parameter. This new structure contains the max_subsystems parameter previously 600passed into that function. 601 602A new public API function `spdk_nvmf_get_tgt` has been added which allows users to 603retrieve a pointer to an `spdk_nvmf_tgt` object by supplying its name. In the special 604case where an RPC or application only creates a single target, this function can accept 605a null name parameter and will return the only available target. 606 607The majority of the NVMe-oF RPCs now accept an optional tgt_name parameter. This will 608allow those RPCs to work with applications that create more than one target. 609 610Three new NVMe-oF RPCs have been added `nvmf_create_target`, `nvmf_delete_target`, and 611`nvmf_get_targets`. These new RPCs provide a basic interface for managing multiple target 612objects. In SPDK the target object defines a unique discovery service. As of this release, 613these RPCs are not intended to be used with the in-tree SPDK target applications, spdk_tgt and 614nvmf_tgt, which use a single, global target structure. As such, they are not included in scripts/rpc.py 615 616Three new header functions have also been added to help deal with multiple targets. 617`spdk_nvmf_tgt_get_name` takes a target pointer as an argument and returns its human readable name. 618`spdk_nvmf_get_first_target` takes no arguments and returns the first target in the global list. 619`spdk_nvmf_get_next_tgt` takes a target pointer as an argument and returns the next one in the global list. 620 621The `spdk_nvmf_tgt_accept` takes additional argument allowing to pass arbitrary context 622information to the `new_qpair` callback. This will simplify the code when having multiple 623nvmf targets or when retrieving the context information from globals is not suitable. 624 625### blobstore 626 627A new `spdk_bdev_create_bs_dev_from_desc` function has been added and `spdk_bdev_create_bs_dev` 628function has been deprecated. 629The new create function can cowork with `spdk_bdev_open_ext` function, which provides callback 630function that will be called by asynchronous event such as bdev removal. 631 632### blobfs_bdev 633 634A new blobfs module `bdev` has been added to simplify the operations of blobfs on bdev. 635 636Function `spdk_blobfs_bdev_detect` is added to detect whether blobfs exists on the given block device. 637 638Function `spdk_blobfs_bdev_create` is added to create a blobfs on the given block device. 639 640Function `spdk_blobfs_bdev_mount` is added to mount a blobfs on the given block device to 641a host path by FUSE. Then, a new thread is created dedicatedly for one mountpoint to handle 642FUSE request by blobfs API. 643 644### build 645 646Option to build FUSE components into blobfs_bdev module for mounting a blobfs filesystem. 647It requires the installation of libfuse3. By default, it is disabled. And it will be 648enabled if run `./configure` with `--with-fuse` option. 649 650### iSCSI 651 652Portals may no longer be associated with a cpumask. The scheduling of 653connections is moving to a more dynamic model. 654 655An new RPC `iscsi_portal_group_set_auth` has been added to set CHAP authentication 656for discovery sessions specific for the existing iSCSI portal group. This RPC overwrites 657the setting by the global parameters for the iSCSI portal group. 658 659### socket 660 661Added `spdk_sock_is_connected` to check whether the socket is currently connected. 662`spdk_sock_group_poll` now returns number of events on success. 663 664### env 665 666Added `spdk_pci_device_unclaim()` function to cleanup pci claim file. 667 668### event 669 670`framework_start_init` RPC no longer stops the application on error during 671initialization. 672 673### DPDK 674 675Updated DPDK submodule to DPDK 19.08. 676 677### ocf 678 679Updated OCF submodule to OCF v19.06 680 681Along with update, new cache mode 'write only' was added. 682 683New cache modes added to use via RPC, wi - write invalidate and wa - write around. 684 685New version of OCF provides fully asynchronous management API. 686 687## v19.07 688 689### ftl 690 691EXPERIMENTAL: Added ability to mirror writes to persistent write buffer cache 692to allow for recovery from dirty shutdown event. 693 694Added handling of Asynchronous Nand Management Events (ANM). 695 696### vmd 697 698EXPERIMENTAL: Added Intel Volume Management Device (VMD) driver. VMD is an integrated 699controller inside the CPU PCIe root complex. It enables virtual HBAs for the connected 700NVMe SSDs. `spdk_vmd_init()` enumerates NVMe SSDs behind VMD device and hook them into 701SPDK PCI subsystem. `spdk_nvme_probe()` or `spdk_nvme_connect()` can be used to connect 702NVMe driver to the device located at the given transport ID. 703 704To obtain transport ID of NVMe SSD behind VMD `spdk_lspci` can be used. 705 706Current implementation does not support hotplug. 707 708### blobfs 709 710Blobfs file asynchronous operations were added to public APIs. 711 712### util 713 714A new file API `spdk_posix_file_load` was added to load file content into a data buffer. 715 716New APIs `spdk_dif_ctx_set_data_offset`, `spdk_dif_verify_stream`, 717`spdk_dif_get_range_with_md`, `spdk_dif_get_length_with_md` have been added, 718and existing APIs `spdk_dif_ctx_init`, `spdk_dif_set_md_interleave_iovs`, and 719`spdk_dif_generate_stream` have been refined to insert or strip DIF by stream 720fasion with any alignment. 721 722New APIs `spdk_dif_ctx_set_remapped_init_ref_tag`, `spdk_dif_remap_ref_tag`, 723and `spdk_dix_remap_ref_tag` have been added to remap DIF reference tag. 724 725New APIs `spdk_dif_update_crc32c` and `spdk_dif_update_crc32c_stream` have been 726added to compute CRC-32C checksum for extended LBA payload. 727 728Bdevperf and bdevio applications now support starting tests with application specific 729RPCs. Please see helper Python scripts in their respective directories. 730This is a move towards simpler RPC-only configuration for all main 731and auxiliary applications. 732 733Legacy INI style configuration for SPDK applications will become deprecated in SPDK 19.10, 734and removed in SPDK 20.01. Please consider moving to JSON-RPC configuration files and/or 735RPC driven run-time configuration. 736 737### nvmf 738 739EXPERIMENTAL: A Fibre Channel transport that supports Broadcom HBAs has been 740added. This depends on the FC HBA driver at 741https://github.com/ecdufcdrvr/bcmufctdrvr. See [the documentation](https://spdk.io/doc/nvmf.html#nvmf_fc_transport) 742for more information. 743 744Persistent reservation emulation has been added to the NVMe-oF target. Persistent reservation 745state is stored in a JSON file on the local filesystem between target restart. To support this, 746an optional parameter to the RPC method `nvmf_subsystem_add_ns` called `--ptpl-file` was added. 747This allows the user to specify which file to store the persistent reservation state in. Note 748that this is done per namespace. 749 750The c2h success optimization under which a command capsule response is not sent 751for reads is turned on by default. A config knob was added to allow disabling 752the optimization. This will mostly be used for integration testing with 5.0.x kernels 753while some compatibility fixes make their way down the pipeline for 5.1.x kernels. 754 755The sock priority setting of the TCP connection owned by the tcp transport is added. It is 756used to optimize the TCP connection performance under designated traffic classes. And the 757priority is used to differeniate the sock priority between SPDK NVMe-oF TCP target application 758and other TCP based applications. 759 760Shared receive queue can now be disabled even for NICs that support it using the 761`nvmf_create_transport` RPC method parameter `no_srq`. The actual use of a shared 762receive queue is predicated on hardware support when this flag is not used. 763 764spdk_nvmf_get_optimal_poll_group was added, which is used to return the optimal 765poll group for the qpair. And `ConnectionScheduler` configuration is added into the 766[Nvmf] section in etc/spdk/nvmf.conf.in to demonstrate how to configure the connection 767scheduling strategy among different spdk threads. 768 769Added infrastructure to retrieve global and per poll group NVMf statistics. 770 771DIF strip and insert is now supported for TCP transport. When it is enabled, DIF 772setting is not exposed to the NVMe-oF initiator, and DIF is attached into data 773for write I/O and stripped from data for read I/O. 774 775Added a field `dif_insert_or_strip` to struct spdk_nvmf_transport_opts, and 776updated the related rpc function nvmf_create_transport to make this 777configurable parameter available to users. The `dif_insert_or_strip` is relevant 778for TCP transport for now and used to configure the DIF strip and insert. 779 780Added infrastructure to retrieve NVMf transport statistics. 781 782### notify 783 784The function `spdk_notify_get_types()` and `spdk_notify_get_events()` were 785renamed to `spdk_notify_foreach_type()` and `spdk_notify_foreach_event()`, 786respectively. And update type name of callback accordingly. 787 788### bdev 789 790The format of the data returned by the get_bdevs_iostat RPC has changed to 791make it easier to parse. It now returns an object with a "ticks" object 792and "bdevs" array with the per-bdev statistics. 793 794A new bdev module `delay` has been added which simulates a drive latency when placed 795on top of a Null bdev. This module is intended only for testing and can be created using 796the new RPC `bdev_delay_create`. That RPC takes the name of the underlying bdev as well 797as average and p99 latency arguments for both read and write operations. Average latency is 798defined as a value close to what you would expect a perf tool such as FIO to report back as 799the mean latency of all I/O submitted to the drive. p99 latency is defined as the value one 800would expect the drive to see the slowest 1% of I/O report. For underlying drives with already 801significant latency, the latency values provided to the drive will be additive. This should be 802taken into account if trying to achieve an artificial latency on top of an nvme drive or aio device. 803 804DIF reference tag remapping is now supported for partition type virtual bdev 805modules. When using partition type virtual bdevs, block address space is 806remapped during I/O processing and DIF reference tag is remapped accordingly. 807 808Added spdk_bdev_*_with_md() functions allowing for IO with metadata being transferred in 809separate buffer. To check support for separatate metadata, use spdk_bdev_is_md_separate(). 810 811All bdevs now have a UUID. For devices whose backing hardware does not provide a UUID, 812one is automatically generated. Across runs of SPDK, bdevs whose UUID is automatically 813generated may change. 814 815A new virtual bdev module `compress` has been added to provide compression services on top of 816a thinly provisioned logical volume. See documentation for complete details. 817 818### nvme 819 820Added an optional parameter `--io-queue-requests` to RPC `set_bdev_nvme_options`, which 821can be used to change the number of requests allocated for one NVMe I/O queue. For 822very big I/O size, e.g. 128MiB, with this option user will not get an error due to 823limited requests in NVMe driver layer. 824 825Added spdk_nvme_ctrlr_get_transport_id() to get the transport ID from a 826previously attached controller. 827 828Nvme Opal library spdk_opal_cmd deprecated. Adding seperate command APIs. 829NVMe Opal library add support for activating locking SP which will make the transaction 830from "Manufactured-Inactive" state to "Manufactured" state. Upon successfully invoking 831of this method, lock and unlock features will be enabled. 832NVMe Opal library add support for locking/unlocking range and list locking range info. 833NVMe opal library add support for multiuser. Admin can enable user and add user to specific 834locking range and the user can lock/unlock his range. 835 836Added spdk_nvme_ctrlr_io_cmd_raw_no_payload_build() allowing a caller to pass 837a completely formed command to an NVMe submission queue (buffer addresses and all). 838This is supported on the PCIe transport only. 839 840Added spdk_nvme_get_ctrlr_registers() to return a pointer to the virtual address 841of the NVMe controller registers. This is supported on the PCIe transport only. 842 843Added additional options to the spdk_nvme_ctrlr_alloc_qpair() option parameter 844structure to allow caller to override the virtual and optionally physical address 845of the submission and completion queue pair to be created. This is supported on 846the PCIe transport only. 847 848Added `disable_error_logging` to struct spdk_nvme_ctrlr_opts, which disables 849logging of failed requests. By default logging is enabled. 850 851Added spdk_nvme_qpair_print_command(), spdk_nvme_qpair_print_completion() and 852spdk_nvme_cpl_get_status_string(). Allowing for easier display of error messages. 853 854Added support for NVMe Sanitize command. 855 856### env 857 858The parameter `free_space` has been added to spdk_ring_enqueue() to wait when 859the ring is almost full and resume when there is enough space available in 860the ring. 861 862A new API `spdk_mempool_lookup` has been added to lookup the memory pool created 863by the primary process. 864 865Added spdk_pci_get_first_device() and spdk_pci_get_next_device() to allow 866iterating over PCI devices detected by SPDK. Because of this, all SPDK APIs 867to attach/detach PCI devices are no longer thread safe. They are now meant to 868be called from only a single thread only, the same only that called spdk_env_init(). 869This applies to the newly added APIs as well. 870 871### vpp 872 873SPDK now supports VPP version 19.04.2, up from VPP 18.01. 874 875VPP socket abstraction now uses VPP Session API, instead of VLC (VPP Communications Library). 876This allows for better control over sessions and queues. 877Please see VPP documentation for more details: 878[VPP Host Stack](https://wiki.fd.io/view/VPP/HostStack) 879 880### sock 881 882Add spdk_sock_get_optimal_sock_group(), which returns the optimal sock group for 883this socket. When a socket is created, it is often assigned to a sock group using 884spdk_sock_group_add_sock so that a set of sockets can be polled more efficiently. 885For some network devices, it is optimal to assign particular sockets to specific 886sock groups. This API is intended to provide the user with that information. 887 888spdk_sock_group_get_ctx() was added to return the context of the spdk_sock_group. 889spdk_sock_group_create() is updated to allow input the user provided ctx. 890spdk_sock_set_priority() is added to set the priority of the socket. 891 892### rpc 893 894Added thread_get_stats RPC method to retrieve existing statistics. 895 896Added nvmf_get_stats RPC method to retrieve NVMf susbsystem statistics. 897 898Response buffers for RPC requests are now always pre-allocated, which implies 899that all spdk_jsonrpc_begin_result() calls always succeed and return a valid 900buffer for JSON response. RPC calls no longer need to check if the buffer is 901non-NULL. 902 903Added SPDK_RPC_REGISTER_ALIAS_DEPRECATED to help with deprecation process when 904renaming existing RPC. First time a deprecated alias is used, it will print 905a warning message. 906 907RPC `get_rpc_methods` was renamed `rpc_get_methods`. The old name is still usable, 908but is now deprecated. 909 910### blobstore 911 912A snapshot can now be deleted if there is only a single clone on top of it. 913 914### build 915 916Preliminary support for cross compilation is now available. Targeting an older 917CPU on the same architecture using your native compiler can be accomplished by 918using the `--target-arch` option to `configure` as follows: 919 920~~~ 921./configure --target-arch=broadwell 922~~~ 923 924Additionally, some support for cross-compiling to other architectures has been 925added via the `--cross-prefix` argument to `configure`. To cross-compile, set CC 926and CXX to the cross compilers, then run configure as follows: 927 928~~~ 929./configure --target-arch=aarm64 --cross-prefix=aarch64-linux-gnu 930~~~ 931 932### vhost 933 934A security vulnerability has been identified and fixed in SPDK Vhost-SCSI target. 935A malicious client (e.g. a virtual machine) could send a carefully prepared, 936invalid I/O request to crash the entire SPDK process. All users of SPDK Vhost-SCSI 937target are strongly recommended to update. All SPDK versions < 19.07 are affected. 938 939By default, SPDK will now rely on upstream DPDK's rte_vhost instead of its fork 940located inside SPDK repo. The internal fork is still kept around to support older 941DPDK versions, but is considered legacy and will be eventually removed. 942 943`configure` will now automatically use the upstream rte_vhost if the used DPDK 944version is >= 19.05. 945 946spdk_vhost_init() is now asynchronous and accepts a completion callback. 947 948### iscsi target 949 950A security vulnerability has been identified and fixed in SPDK iSCSI target. 951A malicious client (e.g. an iSCSI initiator) could send a carefully prepared, 952invalid I/O request to crash the entire SPDK process. All users of SPDK iSCSI 953target are strongly recommended to update. All SPDK versions < 19.07 are affected. 954 955### thread 956 957Exposed spdk_set_thread() in order for applications to associate 958with SPDK thread when necessary. 959 960Added spdk_thread_destroy() to allow framework polling the thread to 961release resources associated with that thread. 962 963## v19.04 964 965### nvme 966 967Added asynchronous probe support. New APIs spdk_nvme_probe_async(), 968spdk_nvme_connect_async() and spdk_nvme_probe_poll_async() were added to enable 969this feature. spdk_nvme_probe_async() and spdk_nvme_connect_async() return a 970context associated with the specified controllers. Users then call 971spdk_nvme_probe_poll_async() until it returns 0, indicating that the operation 972completed. 973 974A new qpair creation option, delay_pcie_doorbell, was added. This can be passed 975to spdk_nvme_alloc_io_qpair(). This makes the I/O submission functions, such as 976spdk_nvme_ns_writev(), skip ringing the submission queue doorbell. Instead the 977doorbell will be rung as necessary inside spdk_nvme_qpair_process_completions(). 978This can result in significantly fewer MMIO writes to the doorbell register 979under heavy load, greatly improving performance. 980 981spdk_nvme_ctrlr_get_regs_cmbsz() was added to report the size of the controller 982memory buffer, if available. 983 984spdk_nvme_ctrlr_get_flags() was added to return controller feature 985flags. Two flags are currently tracked: 986SPDK_NVME_CTRLR_SGL_SUPPORTED 987SPDK_NVME_CTRLR_SECURITY_SEND_RECV_SUPPORTED 988 989The NVMe hotplug poller is now able to detach devices hot-removed from the system 990via `/sys/bus/pci/devices/<bdf>/remove` and `/sys/bus/pci/devices/<bdf>/driver/unbind`. 991 992Opal support was added for scan, take ownership, revert TPer, and dumping device 993info. The nvme_manage tool can be used to perform these operations. The public 994API functions are spdk_nvme_ctrlr_security_receive() and 995spdk_nvme_ctrlr_security_send(). This module should be considered experimental 996pending additional features and tests. 997 998The NVMe-oF initiator is now able to transfer IO whose size is more than 128KiB 999if the corresponding NVMe-oF target allows. 1000 1001### raid 1002 1003Added new strip_size_kb rpc param on create to replace the more ambiguous 1004strip_size. The strip_size rpc param is deprecated. 1005 1006Changed the raid bdev product_name from "Pooled Device" to "Raid Volume" 1007 1008### thread 1009 1010Added spdk_thread_has_pollers() function to verify if there are any registered 1011pollers to be run on the thread. Added spdk_thread_is_idle() function to check 1012if there are any scheduled operations to be performed on the thread at given 1013time. 1014 1015spdk_thread_create() now takes an optional CPU affinity mask that is passed to 1016the scheduler. 1017 1018spdk_thread_lib_init() now takes an optional context size. For each thread 1019created, an additional region of memory of this size will be allocated. A 1020pointer to this region of memory can be obtained by calling 1021spdk_thread_get_ctx(). The inverse operation is also available via 1022spdk_thread_get_from_ctx(). 1023 1024spdk_thread_poll() now optionally accepts the current time, in ticks. This can 1025be used to avoid some calls to spdk_get_ticks() internally. 1026 1027spdk_app_start() now only accepts a single context argument. 1028 1029### bdev 1030 1031An new API `spdk_bdev_get_data_block_size` has been added to get size of data 1032block except for metadata. 1033 1034spdk_vbdev_register() has been deprecated. spdk_bdev_register() should be used 1035instead. 1036 1037A mechanism for acquiring and releasing data buffers from bdev modules, used 1038to perform zero copy operations, was added. 1039 1040New APIs spdk_bdev_get_md_size(), spdk_bdev_is_md_interleaved(), spdk_bdev_get_dif_type(), 1041spdk_bdev_is_dif_head_of_md(), and spdk_bdev_is_dif_check_enabled() have been 1042added to get metadata and DIF settings. 1043 1044Bdevs claimed by the `examine_config` callback will be now further examined in the 1045`examine_disk` callback. 1046 1047spdk_bdev_io_get_io_channel() was added as a convenient way to get an io_channel 1048from a bdev_io. 1049 1050### ocf 1051 1052Updated OCF submodule to OCF v19.3.2 1053 1054Added support for many-to-one configuration for OCF bdev. 1055Multiple core devices can now be cached on single cache device. 1056 1057Added persistent metadata support, allowing to restore cache state after shutdown. 1058During start of SPDK application, the devices are examined and if OCF metadata 1059is present - appropriate OCF bdevs will be recreated. 1060 1061Added Write-Back mode support. In this mode, data is first written to 1062caching device and periodically synchronized to the core devices. 1063Dirty data is saved as persistent metadata on cache device, 1064allowing for safe restore during application restart. 1065For more details please see OCF documentation: 1066[OpenCAS cache configuration](https://open-cas.github.io/cache_configuration.html) 1067 1068### NVMe-oF Target 1069 1070Support for per-device shared receive queues in the RDMA transport has been added. 1071It is enabled by default for any device that supports it. 1072 1073The size of a shared receive queue is defined by transport configuration file parameter 1074`MaxSRQDepth` and `nvmf_create_transport` RPC method parameter `max_srq_depth`. 1075Default size is 4096. 1076 1077Add model number as parameter to construct_nvmf_subsystem (-d option), 1078rather than using hardcoded define. 1079 1080DIF passthrough feature has been added. DIF setting of the allocated bdevs is 1081exposed to the NVMe-oF initiator and data with DIF from the NVMe-oF initiator is 1082passed through to the allocated bdevs. 1083 1084### env 1085 1086The `phys_addr` parameter in spdk_malloc() and spdk_zmalloc() has been deprecated. 1087For retrieving physical addresses, spdk_vtophys() should be used instead. 1088 1089spdk_realloc() has been added to reallocate DMA/shared memory. 1090 1091spdk_pci_device_is_removed() has been added to let the upper-layer SPDK drivers know 1092that device has a pending external hotremove request. 1093 1094spdk_env_fini() and spdk_env_dpdk_post_fini() were added to release any resources 1095allocated by spdk_env_init() or spdk_env_dpdk_post_init() respectively. It is expected 1096that common usage of those functions is to call them just before terminating the process. 1097 1098Added spdk_iommu_is_enabled() to report if SPDK application is using IOMMU for DMA. 1099 1100### DPDK 1101 1102Dropped support for DPDK 17.07 and earlier, which SPDK won't even compile with right now. 1103 1104Updated DPDK submodule to DPDK 19.02. 1105 1106### rpc 1107 1108New `get_spdk_version` RPC method is introduced to get version info of the running SPDK application. 1109 1110The `start_nbd_disk` RPC method now take nbd_device as an optional parameter. If nbd_device 1111is specified, use that specified nbd device. If it's not specified, pick available one. 1112 1113### iSCSI target 1114 1115DIF strip and insert is now supported. DIF settings are not exposed to the iSCSI initiator. 1116DIF is attached into data for write I/O and stripped from data for read I/O. 1117 1118### vhost 1119 1120Added experimental support for running with the external, upstream rte_vhost library. 1121This can be enabled by configuring SPDK with an `--without-internal-vhost-lib` flag. 1122The minimum supported rte_vhost version (DPDK version) is 19.05-rc1. 1123 1124As a result of fuzz testing, a lot of data races in vhost-scsi LUN hotplug path were identified and 1125fixed. Those data races could have potentially resulted in SPDK crashes, RPC hangs, or memory leaks 1126if Vhost-SCSI LUN hotplug RPCs were executed while connected VMs were in the middle of restarting. 1127 1128The SCSI target id in `add_vhost_scsi_lun` RPC is now optional. If `-1` is passed, the first 1129unoccupied target id will be used. 1130 1131### AIO 1132 1133AIO bdev module can now reap I/O completions directly from userspace, significantly improving 1134the overall performance. 1135 1136### blobfs 1137 1138Synchronous IO operations no longer use spdk_io_channel, but instead use 1139spdk_fs_thread_ctx. The behavior is otherwise identical. 1140 1141### OCF 1142 1143Added support for caching multiple bdevs using a single bdev as a cache. 1144 1145### notify 1146 1147Added the notify library that provides a high performance local event bus 1148between libraries. Example usage was added to bdev module, which reports 1149notifications for added and removed bdevs via RPC. 1150 1151### sock 1152 1153Added new API spdk_sock_readv() to the sock library for performing vectored 1154reads. 1155 1156### event 1157 1158The function spdk_subsystem_init() no longer requires spdk_event as an argument. 1159 1160Changed API of spdk_subsystem_config_json() to no longer be asynchronous. 1161 1162### io_uring 1163 1164A bdev module that issues I/O to kernel block devices using the new io_uring Linux kernel 1165API was added. This module requires liburing. 1166 1167### build 1168 1169Options to easily compile with profile guided optimization have been added to 1170`configure`. To use profile guided optimization with SPDK, run 1171`./configure --with-pgo-capture`, build SPDK, then run a workload of your 1172choosing. Then, simply run `./configure --with-pgo-enable` and recompile to 1173build using the generated profile data. Profile guided optimization can yield 1174very large performance improvements, especially on GCC 8 and clang 7. This may 1175be combined with link time optimization which has been available under the 1176`--enable-lto` configure option for several releases. 1177 1178### compression bdev/reduce library 1179 1180Added "reduce" block compression scheme based on using SSDs for storing 1181compressed blocks of storage and presistent memory for metadata. Please see 1182[compression](https://spdk.io/doc/bdev.html) for more details. 1183 1184## v19.01 1185 1186### ocf bdev 1187 1188New virtual bdev module based on [Open CAS Framework](https://open-cas.github.io/) has been added. 1189This module allows for the use of one bdev to act as a high performance cache in front of another bdev. 1190Please see [documentation](https://spdk.io/doc/bdev.html#bdev_config_cas) for more details. 1191Only write through mode is currently supported and this feature is considered experimental. 1192 1193### event framework 1194 1195For `spdk_app_parse_args`, add return value to the callback which parses application 1196specific command line parameters to protect SPDK applications from crashing by invalid 1197values from user input. 1198 1199By default, all SPDK applications will now reserve all hugepages at runtime. The pre-reserved 1200memory size can be still set with `-s` or `--mem-size` option, although the default value 1201was reduced down to 0. 1202 1203A custom hugetlbfs directory can now be specified via spdk_app_opts. 1204This can be used to configure hugepages with different sizes, a different size limit, 1205or different access permissions than the system's default hugepage pool. 1206SPDK applications can specify a custom hugetlbfs mount with the `--huge-dir` option. 1207 1208### environment 1209 1210spdk_vtophys() has been refactored to accept length of the translated region as a new 1211parameter. The function will now update that parameter with the largest possible value 1212for which the memory is contiguous in the physical memory address space. 1213 1214The following functions were removed: 1215 1216 - spdk_pci_nvme_device_attach() 1217 - spdk_pci_nvme_enumerate() 1218 - spdk_pci_ioat_device_attach() 1219 - spdk_pci_ioat_enumerate() 1220 - spdk_pci_virtio_device_attach() 1221 - spdk_pci_virtio_enumerate() 1222 1223They were replaced with generic spdk_pci_device_attach() and spdk_pci_enumerate() which 1224require a new spdk_pci_driver object to be provided. It can be one of the following: 1225 1226 - spdk_pci_nvme_get_driver() 1227 - spdk_pci_ioat_get_driver() 1228 - spdk_pci_virtio_get_driver() 1229 1230spdk_pci_hook_device() and spdk_pci_unhook_device() were added. Those allow adding a virtual 1231spdk_pci_device into the SPDK PCI subsystem. A virtual device calls provided callbacks for 1232each BAR mapping request or PCI config access. It's attachable with spdk_pci_device_attach() 1233or spdk_pci_enumerate() like any other device. 1234 1235A new spdk_pause() function was added to pause CPU execution for an implementation specific 1236amount of time. Quoting from DPDK function this is based on: "This call is intended for 1237tight loops which poll a shared resource or wait for an event. A short pause within the loop 1238may reduce the power consumption." 1239 1240A new public header file env_dpdk.h has been introduced, and function spdk_env_dpdk_post_init 1241is added into it. If user is using DPDK, and already called rte_eal_init, then include 1242include/spdk/env_dpdk.h, and call spdk_env_dpdk_post_init() instead of spdk_env_init. 1243 1244ISA-L has been added as an SPDK submodule. ISA-L is enabled by default on x86 architecture 1245to accelerate algorithms such as CRC for iSCSI and NVMe-oF. Users may still disable ISA-L 1246by explicitly passing --without-isal to the configure script. 1247 1248### util 1249 1250A new uuid API `spdk_uuid_copy` was added to make a copy of the source uuid. 1251 1252An new parameter `init_crc` representing the initial CRC value was added to 1253`spdk_crc16_t10dif`. The parameter can be used to calculate a CRC value spanning 1254multiple separate buffers. 1255 1256New DIF APIs were added to generate and verify DIF by byte granularity for both DIF and DIX 1257formats. Among them, DIF with copy APIs will be usable to emulate DIF operations such as DIF 1258insert and strip. 1259 1260Added `spdk_strtol` and `spdk_strtoll` to provide additional error checking around `strtol` 1261and `strtoll`. 1262 1263Added `spdk_sprintf_append_realloc` and `spdk_vsprintf_append_realloc` for appending a string 1264with automatic buffer re-allocation. 1265 1266### nvme 1267 1268Wrapper functions spdk_nvme_ctrlr_security_send() and spdk_nvme_ctrlr_security_receive() are 1269introduced to support further security protocol development. 1270 1271admin_timeout_ms was added to NVMe controller initialization options, users 1272can change the default value when probing a controller. 1273 1274Add two new fields "header_digest" and "data_digest" in struct spdk_nvme_ctrlr_opts, 1275it will be used to enable the digest support for the NVMe/TCP transport. 1276 1277Add a new TCP/IP transport(located in lib/nvme/nvme_tcp.c) in nvme driver. With 1278this new transport, it can be used to connect the NVMe-oF target with the 1279same TCP/IP support. 1280 1281Added API, spdk_nvme_ctrlr_is_discovery(), to indicate whether the ctrlr 1282arg refers to a Discovery Controller or not. 1283 1284Added an API function `spdk_nvme_host_id_parse` and corresponding object `spdk_nvme_host_id` 1285for parsing host address and host service ID arguments on a per connection basis. 1286 1287The RPC `construct_nvme_bdev` now allows a user to specify a source address and service id for the host to 1288use when connecting to the controller backing the NVMe bdev. 1289 1290### NVMe-oF Target 1291 1292The `spdk_nvmf_tgt_opts` struct has been deprecated in favor of `spdk_nvmf_transport_opts`. 1293Users will no longer be able to specify target wide I/O parameters. `spdk_nvmf_tgt_listen` 1294will also no longer implicitly initialize a transport with the default target options (since 1295there are none). Instead, a user must manually instantiate the transport with `spdk_nvmf_transport_create` 1296prior to calling `spdk_nvmf_tgt_listen`. 1297 1298Related to the previous change, the rpc `set_nvmf_target_options` has been renamed to 1299`set_nvmf_target_max_subsystems` to indicate that this is the only target option available for the user to edit. 1300 1301Added fields `num_shared_buffers` and `buf_cache_size` in struct spdk_nvmf_transport_opts, 1302and also updated the related rpc function nvmf_create_transport, to make this 1303configurable parameter available to users. The `num_shared_buffers` is used to 1304configure the shared buffer numbers of the transport used by RDMA or TCP transport. 1305`buf_cache_size` configures number of shared buffers to cache per poll group. 1306 1307### nvmf 1308 1309Add a new TCP/IP transport (located in lib/nvmf/tcp.c). With this tranport, 1310the SPDK NVMe-oF target can have a new transport, and can serve the NVMe-oF 1311protocol via TCP/IP from the host. 1312 1313Added optional mechanism to modify the RDMA transport's behavior when creating protection domains and registering memory. 1314By default, the RDMA transport will use the ibverbs library to create protection domains and register memory. 1315Using `spdk_nvme_rdma_init_hooks` will subvert that and use an existing registration. 1316 1317### bdev 1318 1319Added `enable_bdev_histogram` and `get_bdev_histogram` RPC commands to allow gathering latency data for specified bdev. 1320Please see [documentation](https://spdk.io/doc/bdev.html#rpc_bdev_histogram) for more details. 1321 1322Added `required_alignment` field to `spdk_bdev`, that specifies an alignment requirement for data buffers associated with an spdk_bdev_io. 1323Bdev layer will automatically double buffer any spdk_bdev_io that violates this alignment, before the spdk_bdev_io is submitted to the bdev module. 1324 1325On shutdown, bdev unregister now proceeds in top-down fashion, with 1326claimed bdevs skipped (these will be unregistered later, when virtual 1327bdev built on top of the respective base bdev unclaims it). This 1328allows virtual bdevs to be shut down cleanly as opposed to the 1329previous behavior that didn't differentiate between hotremove and 1330planned shutdown. 1331 1332The `delete_bdev` RPC is now deprecated. Users should instead use the specific deletion RPC 1333for the bdev type to be removed (i.e. delete_malloc_bdev). 1334 1335Added support for separate bandwidth rate limits for read and write to QoS in bdev layer. 1336 1337Bdev I/O statistics now track unmap opertations. 1338 1339### logical volumes 1340 1341Logical volume bdev can now be marked as read only using `set_read_only_lvol_bdev` RPC. 1342This allows for basing clones on top of lvol_bdev without first creating a snapshot. 1343 1344Added option to change method for data erasure when deleting lvol or resizing down. 1345Default of unmapping clusters can now be changed to writing zeroes or no operation. 1346 1347Added option to change method for erasing data region on lvol store creation. 1348Default of unmapping can now be changed to writing zeroes or no operation. 1349 1350### log 1351 1352"trace flags" are now referred to as "log flags" in the SPDK log API. The 1353set_trace_flag, clear_trace_flag and get_trace_flags RPCs are now deprecated, 1354and set_log_flag, clear_log_flag and get_log_flags RPCs have been added. 1355 1356### trace 1357 1358New `trace_record` application was added. It can be used to poll spdk trace shm file and 1359append any new trace entries into another specified file. This can help retain those entries 1360that would otherwise be overwritten in the shm file. See 1361[Capturing sufficient trace events](https://spdk.io/doc/nvmf_tgt_tracepoints.html#capture_trace_events) 1362for more details. 1363 1364Number of trace entries in circular buffer per lcore can now be assigned by starting SPDK app 1365with argument "--num-trace-entries <NUM>" provided. 1366 1367New `get_tpoint_group_mask` RPC was added to get current tpoint_group_mask, and 1368each tpoint group status. 1369New `enable_tpoint_group` and `disable_tpoint_group` RPC were added to enable or 1370disable a specific tpoint group. 1371 1372### ftl 1373 1374EXPERIMENTAL: Added basic flash translation layer module allowing for using Open Channel SSDs as 1375block devices. The module is split into the library (located in lib/ftl) and bdev_ftl 1376(lib/bdev/ftl). See the [documentation](https://spdk.io/doc/ftl.html) for more details. 1377 1378### vhost 1379 1380A security vulnerability has been identified and fixed in the SPDK vhost target. A malicious 1381vhost client (i.e. virtual machine) could carefully construct a circular descriptor chain which 1382would result in a partial denial of service in the SPDK vhost target. These types of descriptor 1383chains are now properly detected by the vhost target. All SPDK vhost users serving untrusted 1384vhost clients are strongly recommended to upgrade. (Reported by Dima Stepanov and Evgeny 1385Yakovlev.) 1386 1387Vhost SCSI and Vhost Block devices can now accept multiple connections on the same socket file. 1388Each connection (internally called a vhost session) will have access to the same storage, but 1389will use different virtqueues, different features and possibly different memory. 1390 1391### vhost scsi 1392 1393SCSI target hotremove can now be performed even without the VIRTIO_SCSI_F_HOTPLUG feature negotiated. 1394Regardless of VIRTIO_SCSI_F_HOTPLUG support, the hotremoval will be still reported through SCSI sense codes. 1395 1396### DPDK 1397 1398DPDK submodule was updated to DPDK 18.11. Note that SPDK does not fully leverage the new 1399multi-process device hotplug yet and continues to work the same way it always did. 1400 1401Dropped support for DPDK 16.07 and earlier, which SPDK won't even compile with right now. 1402 1403### RPC 1404 1405The following RPC commands deprecated in the previous release are now removed: 1406 1407 - construct_virtio_user_scsi_bdev 1408 - construct_virtio_pci_scsi_bdev 1409 - construct_virtio_user_blk_bdev 1410 - construct_virtio_pci_blk_bdev 1411 - remove_virtio_scsi_bdev 1412 - construct_nvmf_subsystem 1413 1414### Miscellaneous 1415 1416The configure options `--with-raid` and `--without-raid` that were deprecated in the previous 1417release are now removed. 1418 1419### nbd 1420 1421Starting nbd using `spdk_nbd_start` is now performed asynchronously. 1422 1423### net framework 1424 1425Net framework initialization and finish is now done asynchronously. 1426 1427### rpc 1428 1429Added `spdk_rpc_is_method_allowed` function for checking whether method is permitted in a given state. 1430Added `spdk_rpc_get_state` to check current state of RPC server. 1431RPC `wait_subsystem_init` has been added to allow clients to block untill all subsystems are initialized. 1432 1433### json rpc 1434 1435JSON RPC client is now running in non-blocking mode. Requests are sent and received during spdk_jsonrpc_client_poll. 1436JSON RPC server can now recieve a callback on connection termination or server shutdown using `spdk_jsonrpc_conn_add_close_cb` 1437and `spdk_jsonrpc_conn_del_close_cb`. 1438 1439## v18.10 1440 1441### nvme 1442 1443spdk_nvme_ctrlr_cmd_security_send() and spdk_nvme_ctrlr_cmd_security_receive() 1444were added to support sending or receiving security protocol data to or from 1445nvme controller. 1446 1447spdk_nvme_ns_get_extended_sector_size() was added. This function includes 1448the metadata size per sector (if any). spdk_nvme_ns_get_sector_size() still 1449returns only the data size per sector, not including metadata. 1450 1451New `send_nvme_cmd` RPC was added to allow sending NVMe commands directly to NVMe controller. 1452See the [send_nvme_cmd](http://spdk.io/doc/jsonrpc.html#rpc_send_nvme_cmd) documentation 1453for more details. 1454 1455### Build System 1456 1457New `configure` options, `--with-shared` and `--without-shared` 1458[default], provide the capability to build, or not, SPDK shared libraries. 1459This includes the single SPDK shared lib encompassing all of the SPDK 1460static libs as well as individual SPDK shared libs corresponding to 1461each of the SPDK static ones. Although the production of the shared 1462libs conforms with conventional version naming practices, such naming 1463does not at this time confer any SPDK ABI compatibility claims. 1464 1465### bdev 1466 1467spdk_bdev_alias_del_all() was added to delete all alias from block device. 1468 1469A new virtual bdev module has been added to perform at rest data encryption using the DPDK CryptoDev 1470Framework. The module initially uses a software AESNI CBC cipher with experimental support for the 1471Intel QAT hardware accelerator also currently implemented with support for CBC cipher. Future work 1472may include additional ciphers as well as consideration for authentication. 1473 1474The RAID virtual bdev module is now always enabled by default. The configure --with-raid and 1475--without-raid options are now ignored and deprecated and will be removed in the next release. 1476 1477Enforcement of bandwidth limits for quality of service (QoS) has been added to the bdev layer. 1478See the new [set_bdev_qos_limit](http://www.spdk.io/doc/jsonrpc.html#rpc_set_bdev_qos_limit) 1479documentation for more details. The previous set_bdev_qos_limit_iops RPC method introduced at 148018.04 release has been deprecated. The new set_bdev_qos_limit RPC method can support both 1481bandwidth and IOPS limits. 1482 1483spdk_bdev_config_json() and corresponding `get_bdevs_config` RPC was removed. 1484 1485### Environment Abstraction Layer and Event Framework 1486 1487The size parameter of spdk_mem_map_translate is now a pointer. This allows the 1488function to report back the actual size of the translation relative to the original 1489request made by the user. 1490 1491A new structure spdk_mem_map_ops has been introduced to hold memory map related 1492callbacks. This structure is now passed as the second argument of spdk_mem_map_alloc 1493in lieu of the notify callback. 1494 1495### DPDK 18.08 1496 1497The DPDK submodule has been updated to the DPDK 18.08 release. SPDK will now automatically 1498utilize DPDK's dynamic memory management with DPDK versions >= 18.05.1. 1499 1500Hugepages can be still reserved with `[-s|--mem-size <size>]` option at application startup, 1501but once we use them all up, instead of failing user allocations with -ENOMEM, we'll try 1502to dynamically reserve even more. This allows starting SPDK with `--mem-size 0` and using 1503only as many hugepages as it is really needed. 1504 1505Due to this change, the memory buffers returned by `spdk_*malloc()` are no longer guaranteed 1506to be physically contiguous. 1507 1508### I/OAT 1509 1510I/OAT driver can now reinitialize I/OAT channels after encountering DMA errors. 1511 1512### iscsi target 1513 1514Parameter names of `set_iscsi_options` and `get_iscsi_global_params` RPC 1515method for CHAP authentication in discovery sessions have been changed to 1516align with `construct_target_node` RPC method. Old names are still usable 1517but will be removed in future release. 1518 1519`set_iscsi_discovery_auth` and `set_iscsi_target_node_auth` RPC methods have 1520been added to set CHAP authentication for discovery sessions and existing 1521target nodes, respectively. 1522 1523The SPDK iSCSI target supports an AuthFile which can be used to load CHAP 1524shared secrets when the iSCSI target starts. SPDK previously provided a 1525default location for this file (`/usr/local/etc/spdk/auth.conf`) if none was 1526specified. This default has been removed. Users must now explicitly specify 1527the location of this file to load CHAP shared secrets from a file, or use 1528the related iSCSI RPC methods to add them at runtime. 1529 1530### iscsi initiator 1531 1532The SPDK iSCSI initiator is no longer considered experimental and becomes 1533a first-class citizen among bdev modules. The basic usage has been briefly 1534described in the bdev user guide: [iSCSI bdev](https://spdk.io/doc/bdev.html#bdev_config_iscsi) 1535 1536### Miscellaneous 1537 1538The SPDK application framework can now parse long name command line parameters. 1539Most single-character parameters have a long name equivalent now. See the 1540[Command Line Parameters](https://spdk.io/doc/app_overview.html) documentation 1541for details or use the `--help` command line parameter to list all available 1542params. 1543 1544bdevperf `-s` param (io size) was renamed to `-o` as `-s` had been already 1545used by existing apps for memory size. 1546 1547bdevio can now accept all SPDK command line parameters. The config now has to 1548be provided with `-c` or `--config` param. 1549 1550The following ioat/perf and nvme/perf parameters were renamed as well: 1551 `-s` (io size) to `-o` 1552 `-d` (mem size) to `-s` 1553 1554The ReactorMask config file parameter has been deprecated. Users should 1555use the -m or --cpumask command line option to specify the CPU core mask 1556for the application. 1557 1558Default config file pathnames have been removed from iscsi_tgt, nvmf_tgt 1559and vhost. Config file pathnames may now only be specified using the 1560-c command line option. 1561 1562Users may no longer set DPDK_DIR in their environment to specify the 1563location of the DPDK installation used to build SPDK. Using DPDK_DIR 1564has not been the documented nor recommended way to specify the DPDK 1565location for several releases, but removing it ensures no unexpected 1566surprises for users who may have DPDK_DIR defined for other reasons. 1567Users should just use the "configure" script to specify the DPDK 1568location before building SPDK. 1569 1570Although we know that many developers still use Python 2 we are officially 1571switching to Python3 with requirement that all new code must be valid also 1572for Python 2 up to the EOL which is year 2020. 1573 1574Invoking interpreter explicitly is forbidden for executable scripts. There 1575is no need to use syntax like "python ./scripts/rpc.py". All executable 1576scripts must contain proper shebang pointing to the right interpreter. 1577Scripts without shebang musn't be executable. 1578 1579A Python script has been added to enable conversion of old INI config file 1580to new JSON-RPC config file format. This script can be found at 1581scripts/config_converter.py. Example how this script can be used: 1582~~~{.sh} 1583cat old_format.ini | scripts/config_converter.py > new_json_format.json 1584~~~ 1585 1586### Sock 1587 1588Two additional parameters were added to spdk_sock_get_addr() for the server 1589port and client port. These parameters are named "sport" and "cport" 1590respectively. 1591 1592### Virtio 1593 1594The following RPC commands have been deprecated: 1595 1596 - construct_virtio_user_scsi_bdev 1597 - construct_virtio_pci_scsi_bdev 1598 - construct_virtio_user_blk_bdev 1599 - construct_virtio_pci_blk_bdev 1600 - remove_virtio_scsi_bdev 1601 1602The `construct_virtio_*` ones were replaced with a single `construct_virtio_dev` 1603command that can create any type of Virtio bdev(s). `remove_virtio_scsi_bdev` 1604was replaced with `remove_virtio_bdev` that can delete both Virtio Block and SCSI 1605devices. 1606 1607### Blobfs 1608 1609spdk_file_get_id() returning unique ID for the file was added. 1610 1611### JSON 1612 1613Added jsonrpc-client C library intended for issuing RPC commands from applications. 1614 1615Added API enabling iteration over JSON object: 1616 1617 - spdk_json_find() 1618 - spdk_json_find_string() 1619 - spdk_json_find_array() 1620 - spdk_json_object_first() 1621 - spdk_json_array_first() 1622 - spdk_json_next() 1623 1624### Blobstore 1625 1626Blobstore I/O operations are now based on io_units, instead of blobstore page size. 1627The io_unit size is now the same as the underlying block device's block size. 1628Logical volumes built on a block device with 512B block size can now be used as boot devices 1629in QEMU. 1630 1631### SPDKCLI 1632 1633The SPDKCLI interactive command tool for managing SPDK is no longer considered experimental. 1634Support for the iSCSI and NVMe-oF targets has been added. 1635 1636## v18.07 1637 1638### bdev 1639 1640A new public header file bdev_module.h has been introduced to facilitate the 1641development of new bdev modules. This header includes an interface for the 1642spdk_bdev_part and spdk_bdev_part_base objects to enable the creation of 1643multiple virtual bdevs on top of a single base bdev and should act as the 1644primary API for module authors. 1645 1646spdk_bdev_get_opts() and spdk_bdev_set_opts() were added to set bdev-wide 1647options. 1648 1649A mechanism for handling out of memory condition errors (ENOMEM) returned from 1650I/O submission requests at the bdev layer has been added. See 1651spdk_bdev_queue_io_wait(). 1652 1653The spdk_bdev_get_io_stat() function now returns cumulative totals instead of 1654resetting on each call. This allows multiple callers to query I/O statistics 1655without conflicting with each other. Existing users will need to adjust their 1656code to record the previous I/O statistics to calculate the delta between calls. 1657 1658I/O queue depth tracking and samples options have been added. See 1659spdk_bdev_get_qd(), spdk_bdev_get_qd_sampling_period(), and 1660spdk_bdev_set_qd_sampling_period(). 1661 1662### RAID module 1663 1664A new bdev module called "raid" has been added as experimental module which 1665aggregates underlying NVMe bdevs and exposes a single raid bdev. Please note 1666that vhost will not work with this module because it does not yet have support 1667for multi-element io vectors. 1668 1669### Log 1670 1671The debug log component flag available on several SPDK applications has been 1672renamed from `-t` to `-L` to prevent confusion with tracepoints and to allow the 1673option to be added to tools that already use `-t` to mean something else. 1674 1675### Blobstore 1676 1677A new function, spdk_bs_dump(), has been added that dumps all of the contents of 1678a blobstore to a file pointer. This includes the metadata and is very useful for 1679debugging. 1680 1681Two new operations have been added for thin-provisioned blobs. 1682spdk_bs_inflate_blob() will allocate clusters for all thinly provisioned regions 1683of the blob and populate them with the correct data by reading from the backing 1684blob(s). spdk_bs_blob_decouple_parent() works similarly, but will only allocate 1685clusters that correspond to data in the blob's immediate parent. Clusters 1686allocated to grandparents or that aren't allocated at all will remain 1687thin-provisioned. 1688 1689### BlobFS 1690 1691Changed the return type of spdk_file_truncate() from void to int to allow the 1692propagation of `ENOMEM` errors. 1693 1694### NVMe Driver 1695 1696The new API functions spdk_nvme_qpair_add_cmd_error_injection() and 1697spdk_nvme_qpair_remove_cmd_error_injection() have been added for NVMe error 1698emulation. Users can set a specified command to fail with a particular error 1699status. 1700 1701Changed the name `timeout_sec` parameter to `timeout_us` in 1702spdk_nvme_ctrlr_register_timeout_callback(), and also changed the type from 1703uint32_t to uint64_t. This will give users more fine-grained control over the 1704timeout period. 1705 1706Basic support for Open Channel SSDs was added. See nvme_ocssd.h 1707 1708### NVMe Over Fabrics 1709 1710The spdk_nvmf_tgt_destroy() function is now asynchronous and takes a callback 1711as a parameter. 1712 1713spdk_nvmf_qpair_disconnect() was added to allow the user to disconnect qpairs. 1714 1715spdk_nvmf_subsystem_get_max_namespaces() was added to query the maximum allowed 1716number of namespaces for a given subsystem. 1717 1718### Build System 1719 1720The build system now generates a combined shared library (libspdk.so) that may 1721be used in place of the individual static libraries (libspdk_*.a). The combined 1722library includes all components of SPDK and is intended to make linking against 1723SPDK easier. The static libraries are also still provided for users that prefer 1724to link only the minimal set of components required. 1725 1726### git pre-commit and pre-push hooks 1727 1728The pre-commit hook will run `scripts/check_format.sh` and verify there are no 1729formating errors before allowing `git commit` to run. The pre-push hook runs 1730`make CONFIG_WERROR=y` with and without `CONFIG_DEBUG=y` using both the gcc and 1731clang compiler before allowing `git push` to run. Following each DEBUG build 1732`test/unit/unittest.sh` is run and verified. Results are recorded in the 1733`make.log` file. 1734 1735To enable type: 'git config core.hooksPath .githooks'. To override after 1736configuration use the `git --no-verify` flag. 1737 1738### RPC 1739 1740The `start_nbd_disk` RPC method now returns the path to the kernel NBD device node 1741rather than always returning `true`. 1742 1743### DPDK 18.05 1744 1745The DPDK submodule has been rebased on the DPDK 18.05 release. DPDK 18.05 supports 1746dynamic memory allocation, but due to some issues found after the DPDK 18.05 release, 1747that support is not enabled for SPDK 18.07. Therefore, SPDK 18.07 will continue to use 1748the legacy memory allocation model. The plan is to enable dynamic memory allocation 1749after the DPDK 18.08 release which should fix these issues. 1750 1751### Environment Abstraction Layer and Event Framework 1752 1753The spdk_mem_map_translate() function now takes a size parameter to indicate the size of 1754the memory region. This can be used by environment implementations to validate the 1755requested translation. 1756 1757The I/O Channel implementation has been moved to its own library - lib/thread. The 1758public API that was previously in spdk/io_channel.h is now in spdk/thread.h The 1759file spdk/io_channel.h remains and includes spdk/thread.h. 1760 1761spdk_reactor_get_tsc_stats was added to return interesting statistics for each 1762reactor. 1763 1764### IOAT 1765 1766IOAT for copy engine is disabled by default. It can be enabled by specifying the Enable 1767option with "Yes" in `[Ioat]` section of the configuration file. The Disable option is 1768now deprecated and will be removed in a future release. 1769 1770## v18.04: Logical Volume Snapshot/Clone, iSCSI Initiator, Bdev QoS, VPP Userspace TCP/IP 1771 1772### vhost 1773 1774The SPDK vhost-scsi, vhost-blk and vhost-nvme applications have fixes to address the 1775DPDK rte_vhost vulnerability [CVE-2018-1059](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1059). 1776Please see this [security advisory](https://access.redhat.com/security/cve/cve-2018-1059) 1777for additional information on the DPDK vulnerability. 1778 1779Workarounds have been added to ensure vhost compatibility with QEMU 2.12. 1780 1781EXPERIMENTAL: Support for vhost-nvme has been added to the SPDK vhost target. See the 1782[vhost documentation](http://www.spdk.io/doc/vhost.html) for more details. 1783 1784### Unified Target Application 1785 1786A new unified SPDK target application, `spdk_tgt`, has been added. This application combines the 1787functionality of several existing SPDK applications, including the iSCSI target, NVMe-oF target, 1788and vhost target. The new application can be managed through the existing configuration file and 1789[JSON-RPC](http://www.spdk.io/doc/jsonrpc.html) methods. 1790 1791### Env 1792 1793spdk_mempool_get_bulk() has been added to wrap DPDK rte_mempool_get_bulk(). 1794 1795New memory management functions spdk_malloc(), spdk_zmalloc(), and spdk_free() have been added. 1796These new functions have a `flags` parameter that allows the user to specify whether the allocated 1797memory needs to be suitable for DMA and whether it should be shared across processes with the same 1798shm_id. The new functions are intended to replace spdk_dma_malloc() and related functions, which will 1799eventually be deprecated and removed. 1800 1801### Bdev 1802 1803A new optional bdev module interface function, `init_complete`, has been added to notify bdev modules 1804when the bdev subsystem initialization is complete. This may be useful for virtual bdevs that require 1805notification that the set of initialization examine() calls is complete. 1806 1807The bdev layer now allows modules to provide an optional per-bdev UUID, which can be retrieved with 1808the spdk_bdev_get_uuid() function. 1809 1810Enforcement of IOPS limits for quality of service (QoS) has been added to the bdev layer. See the 1811[set_bdev_qos_limit_iops](http://www.spdk.io/doc/jsonrpc.html#rpc_set_bdev_qos_limit_iops) documentation 1812for more details. 1813 1814### RPC 1815 1816The `[Rpc]` configuration file section, which was deprecated in v18.01, has been removed. 1817Users should switch to the `-r` command-line parameter instead. 1818 1819The JSON-RPC server implementation now allows up to 32 megabyte responses, growing as 1820needed; previously, the response was limited to 32 kilobytes. 1821 1822### SPDKCLI 1823 1824EXPERIMENTAL: New SPDKCLI interactive command tool for managing SPDK is available. 1825See the [SPDKCLI](http://www.spdk.io/doc/spdkcli.html) documentation for more details. 1826 1827### NVMe Driver 1828 1829EXPERIMENTAL: Support for WDS and RDS capable CMBs in NVMe controllers has been added. This support is 1830experimental pending a functional allocator to free and reallocate CMB buffers. 1831 1832spdk_nvme_ns_get_uuid() has been added to allow retrieval of per-namespace UUIDs when available. 1833 1834New API functions spdk_nvme_ctrlr_get_first_active_ns() and spdk_nvme_ctrlr_get_next_active_ns() 1835have been added to iterate active namespaces, as well as spdk_nvme_ctrlr_is_active_ns() to check if 1836a namespace ID is active. 1837 1838### NVMe-oF Target 1839 1840Namespaces may now be assigned unique identifiers via new optional `eui64` and `nguid` parameters 1841to the `nvmf_subsystem_add_ns` RPC method. Additionally, the NVMe-oF target automatically exposes 1842the backing bdev's UUID as the namespace UUID when available. 1843 1844spdk_nvmf_subsystem_remove_ns() is now asynchronous and requires a callback to indicate completion. 1845 1846### Blobstore 1847 1848A number of functions have been renamed: 1849 1850- spdk_bs_io_write_blob() => spdk_blob_io_write() 1851- spdk_bs_io_read_blob() => spdk_blob_io_read() 1852- spdk_bs_io_writev_blob() => spdk_blob_io_writev() 1853- spdk_bs_io_readv_blob() => spdk_blob_io_readv() 1854- spdk_bs_io_unmap_blob() => spdk_blob_io_unmap() 1855- spdk_bs_io_write_zeroes_blob() => spdk_blob_io_write_zeroes() 1856 1857The old names still exist but are deprecated. They will be removed in the v18.07 release. 1858 1859spdk_blob_resize() is now an asynchronous operation to enable resizing a blob while I/O 1860are in progress to that blob on other threads. An explicit spdk_blob_sync_md() is still 1861required to sync the updated metadata to disk. 1862 1863### Logical Volumes 1864 1865A new `destroy_lvol_bdev` RPC method to delete logical volumes has been added. 1866 1867Lvols now have their own UUIDs which replace previous LvolStoreUUID_BlobID combination. 1868 1869New Snapshot and Clone functionalities have been added. User may create Snapshots of existing Lvols 1870and Clones of existing Snapshots. 1871See the [lvol snapshots](http://www.spdk.io/doc/logical_volumes.html#lvol_snapshots) documentation 1872for more details. 1873 1874Resizing logical volumes is now supported via the `resize_lvol_bdev` RPC method. 1875 1876### Lib 1877 1878A set of changes were made in the SPDK's lib code altering 1879instances of calls to `exit()` and `abort()` to return a failure instead 1880wherever reasonably possible. 1881 1882spdk_app_start() no longer exit()'s on an internal failure, but 1883instead returns a non-zero error status. 1884 1885spdk_app_parse_args() no longer exit()'s on help, '-h', or an invalid 1886option, but instead returns SPDK_APP_PARSE_ARGS_HELP and 1887SPDK_APP_PARSE_ARGS_FAIL, respectively, and SPDK_APP_PARSE_ARGS_SUCCESS 1888on success. 1889 1890spdk_pci_get_device() has been deprecated and will be removed in SPDK v18.07. 1891 1892### I/O Channels 1893 1894The prototype for spdk_poller_fn() has been modified; it now returns a value indicating 1895whether or not the poller did any work. Existing pollers will need to be updated to 1896return a value. 1897 1898### iSCSI Target 1899 1900The SPDK iSCSI target now supports the fd.io Vector Packet Processing (VPP) framework userspace 1901TCP/IP stack. See the [iSCSI VPP documentation](http://www.spdk.io/doc/iscsi.html#vpp) for more 1902details. 1903 1904### iSCSI initiator 1905 1906An iSCSI initiator bdev module has been added to SPDK. This module should be considered 1907experimental pending additional features and tests. More details can be found in 1908lib/bdev/iscsi/README. 1909 1910### PMDK 1911 1912The persistent memory (PMDK) bdev module is now enabled using `--with-pmdk` instead of 1913`--with-nvml`. This reflects the renaming of the persistent memory library from NVML to 1914PMDK. 1915 1916### Virtio Block driver 1917 1918A userspace driver for Virtio Block devices has been added. It was built on top of the 1919[Virtio](http://www.spdk.io/doc/virtio.html) library and can be managed similarly to 1920the Virtio SCSI driver. See the 1921[Virtio Block](http://www.spdk.io/doc/bdev.html#bdev_config_virtio_blk) reference for 1922more information. 1923 1924### Virtio with 2MB hugepages 1925 1926The previous 1GB hugepage limitation has now been lifted. A new `-g` command-line option 1927enables SPDK Virtio to work with 2MB hugepages. 1928See [2MB hugepages](http://www.spdk.io/doc/virtio.html#virtio_2mb) for details. 1929 1930## v18.01: Blobstore Thin Provisioning 1931 1932### Build System 1933 1934The build system now includes a `make install` rule, including support for the common 1935`DESTDIR` and `prefix` variables as used in other build systems. Additionally, the prefix 1936may be set via the configure `--prefix` option. Example: `make install prefix=/usr`. 1937 1938### RPC 1939 1940A JSON RPC listener is now enabled by default using a UNIX domain socket at /var/run/spdk.sock. 1941A -r option command line option has been added to enable an alternative UNIX domain socket location, 1942or a TCP port in the format ip_addr:tcp_port (i.e. 127.0.0.1:5260). The Rpc configuration file 1943section is now deprecated and will be removed in the v18.04 release. 1944 1945### I/O Channels 1946 1947spdk_poller_register() and spdk_poller_unregister() were moved from the event 1948framework (include/spdk/event.h) to the I/O channel library 1949(include/spdk/io_channel.h). This allows code that doesn't depend on the event 1950framework to request registration and unregistration of pollers. 1951 1952spdk_for_each_channel() now allows asynchronous operations during iteration. 1953Instead of immediately continuing the interation upon returning from the iteration 1954callback, the user must call spdk_for_each_channel_continue() to resume iteration. 1955 1956### Block Device Abstraction Layer (bdev) 1957 1958The poller abstraction was removed from the bdev layer. There is now a general purpose 1959abstraction for pollers available in include/spdk/io_channel.h 1960 1961### Lib 1962 1963A set of changes were made in the SPDK's lib code altering, 1964instances of calls to `exit()` and `abort()` to return a failure instead 1965wherever reasonably possible. This has resulted in return type changes of 1966the API for: 1967 1968- spdk_env_init() from type `void` to `int`. 1969- spdk_mem_map_init() from type `void` to `int`. 1970 1971Applications making use of these APIs should be modified to check for 1972a non-zero return value instead of relying on them to fail without return. 1973 1974### NVMe Driver 1975 1976SPDK now supports hotplug for vfio-attached devices. But there is one thing keep in mind: 1977Only physical removal events are supported; removing devices via the sysfs `remove` file will not work. 1978 1979### NVMe-oF Target 1980 1981Subsystems are no longer tied explicitly to CPU cores. Instead, connections are handed out to the available 1982cores round-robin. The "Core" option in the configuration file has been removed. 1983 1984### Blobstore 1985 1986A number of functions have been renamed: 1987 1988- spdk_bs_md_resize_blob() => spdk_blob_resize() 1989- spdk_bs_md_sync_blob() => spdk_blob_sync_md() 1990- spdk_bs_md_close_blob() => spdk_blob_close() 1991- spdk_bs_md_get_xattr_names() => spdk_blob_get_xattr_names() 1992- spdk_bs_md_get_xattr_value() => spdk_blob_get_xattr_value() 1993- spdk_blob_md_set_xattr() => spdk_blob_set_xattr() 1994- spdk_blob_md_remove_xattr() => spdk_blob_remove_xattr() 1995- spdk_bs_md_create_blob() => spdk_bs_create_blob() 1996- spdk_bs_md_open_blob() => spdk_bs_open_blob() 1997- spdk_bs_md_delete_blob() => spdk_bs_delete_blob() 1998- spdk_bs_md_iter_first() => spdk_bs_iter_first() 1999- spdk_bs_md_iter_next() => spdk_bs_iter_next() 2000 2001The function signature of spdk_blob_close() has changed. It now takes a struct spdk_blob * argument 2002rather than struct spdk_blob **. 2003 2004The function signature of spdk_bs_iter_next() has changed. It now takes a struct spdk_blob * argument 2005rather than struct spdk_blob **. 2006 2007Thin provisioning support has been added to the blobstore. It can be enabled by setting the 2008`thin_provision` flag in struct spdk_blob_opts when calling spdk_bs_create_blob_ext(). 2009 2010### NBD device 2011 2012The NBD application (test/lib/bdev/nbd) has been removed; Same functionality can now be 2013achieved by using the test/app/bdev_svc application and start_nbd_disk RPC method. 2014See the [GPT](http://www.spdk.io/doc/bdev.html#bdev_config_gpt) documentation for more details. 2015 2016### FIO plugin 2017 2018SPDK `fio_plugin` now supports FIO 3.3. The support for previous FIO 2.21 has been dropped, 2019although it still remains to work for now. The new FIO contains huge amount of bugfixes and 2020it's recommended to do an update. 2021 2022### Virtio library 2023 2024Previously a part of the bdev_virtio module, now a separate library. Virtio is now available 2025via `spdk_internal/virtio.h` file. This is an internal interface to be used when implementing 2026new Virtio backends, namely Virtio-BLK. 2027 2028### iSCSI 2029 2030The MinConnectionIdleInterval parameter has been removed, and connections are no longer migrated 2031to an epoll/kqueue descriptor on the master core when idle. 2032 2033## v17.10: Logical Volumes 2034 2035### New dependencies 2036 2037libuuid was added as new dependency for logical volumes. 2038 2039libnuma is now required unconditionally now that the DPDK submodule has been updated to DPDK 17.08. 2040 2041### Block Device Abstraction Layer (bdev) 2042 2043An [fio](http://github.com/axboe/fio) plugin was added that can route 2044I/O to the bdev layer. See the [plugin documentation](https://github.com/spdk/spdk/tree/master/examples/bdev/fio_plugin/) 2045for more information. 2046 2047spdk_bdev_unmap() was modified to take an offset and a length in bytes as 2048arguments instead of requiring the user to provide an array of SCSI 2049unmap descriptors. This limits unmaps to a single contiguous range. 2050 2051spdk_bdev_write_zeroes() was introduced. It ensures that all specified blocks will be zeroed out. 2052If a block device doesn't natively support a write zeroes command, the bdev layer emulates it using 2053write commands. 2054 2055New API functions that accept I/O parameters in units of blocks instead of bytes 2056have been added: 2057 2058- spdk_bdev_read_blocks(), spdk_bdev_readv_blocks() 2059- spdk_bdev_write_blocks(), spdk_bdev_writev_blocks() 2060- spdk_bdev_write_zeroes_blocks() 2061- spdk_bdev_unmap_blocks() 2062 2063The bdev layer now handles temporary out-of-memory I/O failures internally by queueing the I/O to be 2064retried later. 2065 2066### Linux AIO bdev 2067 2068The AIO bdev now allows the user to override the auto-detected block size. 2069 2070### NVMe driver 2071 2072The NVMe driver now recognizes the NVMe 1.3 Namespace Optimal I/O Boundary field. 2073NVMe 1.3 devices may report an optimal I/O boundary, which the driver will take 2074into account when splitting I/O requests. 2075 2076The HotplugEnable option in `[Nvme]` sections of the configuration file is now 2077"No" by default. It was previously "Yes". 2078 2079The NVMe library now includes a spdk_nvme_ns_get_ctrlr() function which returns the 2080NVMe Controller associated with a given namespace. 2081 2082The NVMe library now allows the user to specify a host identifier when attaching 2083to a controller. The host identifier is used as part of the Reservations feature, 2084as well as in the NVMe-oF Connect command. The default host ID is also now a 2085randomly-generated UUID, and the default host NQN uses the host ID to generate 2086a UUID-based NQN. 2087 2088spdk_nvme_connect() was added to allow the user to connect directly to a single 2089NVMe or NVMe-oF controller. 2090 2091### NVMe-oF Target (nvmf_tgt) 2092 2093The NVMe-oF target no longer requires any in-capsule data buffers to run, and 2094the feature is now entirely optional. Previously, at least 4 KiB in-capsule 2095data buffers were required. 2096 2097NVMe-oF subsytems have a new configuration option, AllowAnyHost, to control 2098whether the host NQN whitelist is enforced when accepting new connections. 2099If no Host options have been specified and AllowAnyHost is disabled, the 2100connection will be denied; this is a behavior change from previous releases, 2101which allowed any host NQN to connect if the Host list was empty. 2102AllowAnyHost is disabled by default. 2103 2104NVMe-oF namespaces may now be assigned arbitrary namespace IDs, and the number 2105of namespaces per subsystem is no longer limited. 2106 2107The NVMe-oF target now supports the Write Zeroes command. 2108 2109### Environment Abstraction Layer 2110 2111A new default value, SPDK_MEMPOOL_DEFAULT_CACHE_SIZE, was added to provide 2112additional clarity when constructing spdk_mempools. Previously, -1 could be 2113passed and the library would choose a reasonable default, but this new value 2114makes it explicit that the default is being used. 2115 2116### Blobstore 2117 2118The blobstore super block now contains a bstype field to identify the type of the blobstore. 2119Existing code should be updated to fill out bstype when calling spdk_bs_init() and spdk_bs_load(). 2120 2121spdk_bs_destroy() was added to allow destroying blobstore on device 2122with an initialized blobstore. 2123 2124spdk_bs_io_readv_blob() and spdk_bs_io_writev_blob() were added to enable 2125scattered payloads. 2126 2127A CLI tool for blobstore has been added, allowing basic operations through either command 2128line or shell interface. See the [blobcli](https://github.com/spdk/spdk/tree/master/examples/blob/cli) 2129documentation for more details. 2130 2131### Event Framework 2132 2133The ability to set a thread name, previously only used by the reactor code, is 2134now part of the spdk_thread_allocate() API. Users may specify a thread name 2135which will show up in tools like `gdb`. 2136 2137### Log 2138 2139The spdk_trace_dump() function now takes a new parameter to allow the caller to 2140specify an output file handle (stdout or stderr, for example). 2141 2142### Logical Volumes 2143 2144Logical volumes library built on top of SPDK blobstore has been added. 2145It is possible to create logical volumes on top of other devices using RPC. 2146 2147See the [logical volumes](http://www.spdk.io/doc/logical_volumes.html) documentation for more information. 2148 2149### Persistent Memory 2150 2151A new persistent memory bdev type has been added. 2152The persistent memory block device is built on top of [libpmemblk](http://pmem.io/nvml/libpmemblk/). 2153It is possible to create pmem devices on top of pmem pool files using RPC. 2154 2155See the [Pmem Block Device](http://www.spdk.io/doc/bdev.html#bdev_config_pmem) documentation for more information. 2156 2157### Virtio SCSI driver 2158 2159A userspace driver for Virtio SCSI devices has been added. 2160The driver is capable of creating block devices on top of LUNs exposed by another SPDK vhost-scsi application. 2161 2162See the [Virtio SCSI](http://www.spdk.io/doc/virtio.html) documentation and [Getting Started](http://www.spdk.io/doc/bdev.html#bdev_config_virtio_scsi) guide for more information. 2163 2164### Vhost target 2165 2166The vhost target application now supports live migration between QEMU instances. 2167 2168## v17.07: Build system improvements, userspace vhost-blk target, and GPT bdev 2169 2170### Build System 2171 2172A `configure` script has been added to simplify the build configuration process. 2173The existing CONFIG file and `make CONFIG_...` options are also still supported. 2174Run `./configure --help` for information about available configuration options. 2175 2176A DPDK submodule has been added to make building SPDK easier. If no `--with-dpdk` 2177option is specified to configure, the SPDK build system will automatically build a 2178known-good configuration of DPDK with the minimal options enabled. See the Building 2179section of README.md for more information. 2180 2181A [Vagrant](https://www.vagrantup.com/) setup has been added to make it easier to 2182develop and use SPDK on systems without suitable NVMe hardware. See the Vagrant 2183section of README.md for more information. 2184 2185### Userspace vhost-blk target 2186 2187The vhost library and example app have been updated to support the vhost-blk 2188protocol in addition to the existing vhost-scsi protocol. 2189See the [vhost documentation](http://www.spdk.io/doc/vhost.html) for more details. 2190 2191### Block device abstraction layer (bdev) 2192 2193A GPT virtual block device has been added, which automatically exposes GPT partitions 2194with a special SPDK-specific partition type as bdevs. 2195See the [GPT bdev documentation](http://www.spdk.io/doc/bdev.md#bdev_config_gpt) for 2196more information. 2197 2198### NVMe driver 2199 2200The NVMe driver has been updated to support recent Intel SSDs, including the Intel® 2201Optane™ SSD DC P4800X series. 2202 2203A workaround has been added for devices that failed to recognize register writes 2204during controller reset. 2205 2206The NVMe driver now allocates request tracking objects on a per-queue basis. The 2207number of requests allowed on an I/O queue may be set during `spdk_nvme_probe()` by 2208modifying `io_queue_requests` in the opts structure. 2209 2210The SPDK NVMe `fio_plugin` has been updated to support multiple threads (`numjobs`). 2211 2212spdk_nvme_ctrlr_alloc_io_qpair() has been modified to allow the user to override 2213controller-level options for each individual I/O queue pair. 2214Existing callers with qprio == 0 can be updated to: 2215~~~ 2216... = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, NULL, 0); 2217~~~ 2218Callers that need to specify a non-default qprio should be updated to: 2219~~~ 2220struct spdk_nvme_io_qpair_opts opts; 2221spdk_nvme_ctrlr_get_default_io_qpair_opts(ctrlr, &opts, sizeof(opts)); 2222opts.qprio = SPDK_NVME_QPRIO_...; 2223... = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, &opts, sizeof(opts)); 2224~~~ 2225 2226### Environment Abstraction Layer 2227 2228The environment abstraction layer has been updated to include several new functions 2229in order to wrap additional DPDK functionality. See `include/spdk/env.h` for the 2230current set of functions. 2231 2232### SPDK Performance Analysis with Intel® VTune™ Amplifier 2233 2234Support for SPDK performance analysis has been added to Intel® VTune™ Amplifier 2018. 2235 2236This analysis provides: 2237 2238- I/O performance monitoring (calculating standard I/O metrics like IOPS, throughput, etc.) 2239- Tuning insights on the interplay of I/O and compute devices by estimating how many cores 2240 would be reasonable to provide for SPDK to keep up with a current storage workload. 2241 2242See the VTune Amplifier documentation for more information. 2243 2244## v17.03: Blobstore and userspace vhost-scsi target 2245 2246### Blobstore and BlobFS 2247 2248The blobstore is a persistent, power-fail safe block allocator designed to be 2249used as the local storage system backing a higher-level storage service. 2250See the [blobstore documentation](http://www.spdk.io/doc/blob.html) for more details. 2251 2252BlobFS adds basic filesystem functionality like filenames on top of the blobstore. 2253This release also includes a RocksDB Env implementation using BlobFS in place of the 2254kernel filesystem. 2255See the [BlobFS documentation](http://www.spdk.io/doc/blobfs.html) for more details. 2256 2257### Userspace vhost-scsi target 2258 2259A userspace implementation of the QEMU vhost-scsi protocol has been added. 2260The vhost target is capable of exporting SPDK bdevs to QEMU-based VMs as virtio devices. 2261See the [vhost documentation](http://www.spdk.io/doc/vhost.html) for more details. 2262 2263### Event framework 2264 2265The overhead of the main reactor event loop was reduced by optimizing the number of 2266calls to spdk_get_ticks() per iteration. 2267 2268### NVMe library 2269 2270The NVMe library will now automatically split readv/writev requests with scatter-gather 2271lists that do not map to valid PRP lists when the NVMe controller does not natively 2272support SGLs. 2273 2274The `identify` and `perf` NVMe examples were modified to add a consistent format for 2275specifying remote NVMe over Fabrics devices via the `-r` option. 2276This is implemented using the new `spdk_nvme_transport_id_parse()` function. 2277 2278### iSCSI Target 2279 2280The [Nvme] section of the configuration file was modified to remove the `BDF` directive 2281and replace it with a `TransportID` directive. Both local (PCIe) and remote (NVMe-oF) 2282devices can now be specified as the backing block device. A script to generate an 2283entire [Nvme] section based on the local NVMe devices attached was added at 2284`scripts/gen_nvme.sh`. 2285 2286### NVMe-oF Target 2287 2288The [Nvme] section of the configuration file was modified to remove the `BDF` directive 2289and replace it with a `TransportID` directive. Both local (PCIe) and remote (NVMe-oF) 2290devices can now be specified as the backing block device. A script to generate an 2291entire [Nvme] section based on the local NVMe devices attached was added at 2292`scripts/gen_nvme.sh`. 2293 2294## v16.12: NVMe over Fabrics host, hotplug, and multi-process 2295 2296### NVMe library 2297 2298The NVMe library has been changed to create its own request memory pool rather than 2299requiring the user to initialize the global `request_mempool` variable. Apps can be 2300updated by simply removing the initialization of `request_mempool`. Since the NVMe 2301library user no longer needs to know the size of the internal NVMe request 2302structure to create the pool, the `spdk_nvme_request_size()` function was also removed. 2303 2304The `spdk_nvme_ns_cmd_deallocate()` function was renamed and extended to become 2305`spdk_nvme_ns_cmd_dataset_management()`, which allows access to all of the NVMe 2306Dataset Management command's parameters. Existing callers can be updated to use 2307`spdk_nvme_ns_cmd_dataset_management()` with `SPDK_NVME_DSM_ATTR_DEALLOCATE` as the 2308`type` parameter. 2309 2310The NVMe library SGL callback prototype has been changed to return virtual addresses 2311rather than physical addresses. Callers of `spdk_nvme_ns_cmd_readv()` and 2312`spdk_nvme_ns_cmd_writev()` must update their `next_sge_fn` callbacks to match. 2313 2314The NVMe library now supports NVMe over Fabrics devices in addition to the existing 2315support for local PCIe-attached NVMe devices. For an example of how to enable 2316NVMe over Fabrics support in an application, see `examples/nvme/identify` and 2317`examples/nvme/perf`. 2318 2319Hot insert/remove support for NVMe devices has been added. To enable NVMe hotplug 2320support, an application should call the `spdk_nvme_probe()` function on a regular 2321basis to probe for new devices (reported via the existing `probe_cb` callback) and 2322removed devices (reported via a new `remove_cb` callback). Hotplug is currently 2323only supported on Linux with the `uio_pci_generic` driver, and newly-added NVMe 2324devices must be bound to `uio_pci_generic` by an external script or tool. 2325 2326Multiple processes may now coordinate and use a single NVMe device simultaneously 2327using [DPDK Multi-process Support](http://dpdk.org/doc/guides/prog_guide/multi_proc_support.html). 2328 2329### NVMe over Fabrics target (`nvmf_tgt`) 2330 2331The `nvmf_tgt` configuration file format has been updated significantly to enable 2332new features. See the example configuration file `etc/spdk/nvmf.conf.in` for 2333more details on the new and changed options. 2334 2335The NVMe over Fabrics target now supports virtual mode subsystems, which allow the 2336user to export devices from the SPDK block device abstraction layer as NVMe over 2337Fabrics subsystems. Direct mode (raw NVMe device access) is also still supported, 2338and a single `nvmf_tgt` may export both types of subsystems simultaneously. 2339 2340### Block device abstraction layer (bdev) 2341 2342The bdev layer now supports scatter/gather read and write I/O APIs, and the NVMe 2343blockdev driver has been updated to support scatter/gather. Apps can use the 2344new scatter/gather support via the `spdk_bdev_readv()` and `spdk_bdev_writev()` 2345functions. 2346 2347The bdev status returned from each I/O has been extended to pass through NVMe 2348or SCSI status codes directly in cases where the underlying device can provide 2349a more specific status code. 2350 2351A Ceph RBD (RADOS Block Device) blockdev driver has been added. This allows the 2352`iscsi_tgt` and `nvmf_tgt` apps to export Ceph RBD volumes as iSCSI LUNs or 2353NVMe namespaces. 2354 2355### General changes 2356 2357`libpciaccess` has been removed as a dependency and DPDK PCI enumeration is 2358used instead. Prior to DPDK 16.07 enumeration by class code was not supported, 2359so for earlier DPDK versions, only Intel SSD DC P3x00 devices will be discovered 2360by the NVMe library. 2361 2362The `env` environment abstraction library has been introduced, and a default 2363DPDK-based implementation is provided as part of SPDK. The goal of the `env` 2364layer is to enable use of alternate user-mode memory allocation and PCI access 2365libraries. See `doc/porting.md` for more details. 2366 2367The build process has been modified to produce all of the library files in the 2368`build/lib` directory. This is intended to simplify the use of SPDK from external 2369projects, which can now link to SPDK libraries by adding the `build/lib` directory 2370to the library path via `-L` and linking the SPDK libraries by name (for example, 2371`-lspdk_nvme -lspdk_log -lspdk_util`). 2372 2373`nvmf_tgt` and `iscsi_tgt` now have a JSON-RPC interface, which allows the user 2374to query and modify the configuration at runtime. The RPC service is disabled by 2375default, since it currently does not provide any authentication or security 2376mechanisms; it should only be enabled on systems with controlled user access 2377behind a firewall. An example RPC client implemented in Python is provided in 2378`scripts/rpc.py`. 2379 2380## v16.08: iSCSI target, NVMe over Fabrics maturity 2381 2382This release adds a userspace iSCSI target. The iSCSI target is capable of exporting 2383NVMe devices over a network using the iSCSI protocol. The application is located 2384in app/iscsi_tgt and a documented configuration file can be found at etc/spdk/spdk.conf.in. 2385 2386This release also significantly improves the existing NVMe over Fabrics target. 2387 2388 - The configuration file format was changed, which will require updates to 2389 any existing nvmf.conf files (see `etc/spdk/nvmf.conf.in`): 2390 - `SubsystemGroup` was renamed to `Subsystem`. 2391 - `AuthFile` was removed (it was unimplemented). 2392 - `nvmf_tgt` was updated to correctly recognize NQN (NVMe Qualified Names) 2393 when naming subsystems. The default node name was changed to reflect this; 2394 it is now "nqn.2016-06.io.spdk". 2395 - `Port` and `Host` sections were merged into the `Subsystem` section 2396 - Global options to control max queue depth, number of queues, max I/O 2397 size, and max in-capsule data size were added. 2398 - The Nvme section was removed. Now a list of devices is specified by 2399 bus/device/function directly in the Subsystem section. 2400 - Subsystems now have a Mode, which can be Direct or Virtual. This is an attempt 2401 to future-proof the interface, so the only mode supported by this release 2402 is "Direct". 2403 - Many bug fixes and cleanups were applied to the `nvmf_tgt` app and library. 2404 - The target now supports discovery. 2405 2406This release also adds one new feature and provides some better examples and tools 2407for the NVMe driver. 2408 2409 - The Weighted Round Robin arbitration method is now supported. This allows 2410 the user to specify different priorities on a per-I/O-queue basis. To 2411 enable WRR, set the `arb_mechanism` field during `spdk_nvme_probe()`. 2412 - A simplified "Hello World" example was added to show the proper way to use 2413 the NVMe library API; see `examples/nvme/hello_world/hello_world.c`. 2414 - A test for measuring software overhead was added. See `test/lib/nvme/overhead`. 2415 2416## v16.06: NVMf userspace target 2417 2418This release adds a userspace NVMf (NVMe over Fabrics) target, conforming to the 2419newly-released NVMf 1.0/NVMe 1.2.1 specification. The NVMf target exports NVMe 2420devices from a host machine over the network via RDMA. Currently, the target is 2421limited to directly exporting physical NVMe devices, and the discovery subsystem 2422is not supported. 2423 2424This release includes a general API cleanup, including renaming all declarations 2425in public headers to include a `spdk` prefix to prevent namespace clashes with 2426user code. 2427 2428- NVMe 2429 - The `nvme_attach()` API was reworked into a new probe/attach model, which 2430 moves device detection into the NVMe library. The new API also allows 2431 parallel initialization of NVMe controllers, providing a major reduction in 2432 startup time when using multiple controllers. 2433 - I/O queue allocation was changed to be explicit in the API. Each function 2434 that generates I/O requests now takes a queue pair (`spdk_nvme_qpair *`) 2435 argument, and I/O queues may be allocated using 2436 `spdk_nvme_ctrlr_alloc_io_qpair()`. This allows more flexible assignment of 2437 queue pairs than the previous model, which only allowed a single queue 2438 per thread and limited the total number of I/O queues to the lowest number 2439 supported on any attached controller. 2440 - Added support for the Write Zeroes command. 2441 - `examples/nvme/perf` can now report I/O command latency from the 2442 the controller's viewpoint using the Intel vendor-specific read/write latency 2443 log page. 2444 - Added namespace reservation command support, which can be used to coordinate 2445 sharing of a namespace between multiple hosts. 2446 - Added hardware SGL support, which enables use of scattered buffers that 2447 don't conform to the PRP list alignment and length requirements on supported 2448 NVMe controllers. 2449 - Added end-to-end data protection support, including the ability to write and 2450 read metadata in extended LBA (metadata appended to each block of data in the 2451 buffer) and separate metadata buffer modes. 2452 See `spdk_nvme_ns_cmd_write_with_md()` and `spdk_nvme_ns_cmd_read_with_md()` 2453 for details. 2454- IOAT 2455 - The DMA block fill feature is now exposed via the `ioat_submit_fill()` 2456 function. This is functionally similar to `memset()`, except the memory is 2457 filled with an 8-byte repeating pattern instead of a single byte like memset. 2458- PCI 2459 - Added support for using DPDK for PCI device mapping in addition to the 2460 existing libpciaccess option. Using the DPDK PCI support also allows use of 2461 the Linux VFIO driver model, which means that SPDK userspace drivers will work 2462 with the IOMMU enabled. Additionally, SPDK applications may be run as an 2463 unprivileged user with access restricted to a specific set of PCIe devices. 2464 - The PCI library API was made more generic to abstract away differences 2465 between the underlying PCI access implementations. 2466 2467## v1.2.0: IOAT user-space driver 2468 2469This release adds a user-space driver with support for the Intel I/O Acceleration Technology (I/OAT, also known as "Crystal Beach") DMA offload engine. 2470 2471- IOAT 2472 - New user-space driver supporting DMA memory copy offload 2473 - Example programs `ioat/perf` and `ioat/verify` 2474 - Kernel-mode DMA engine test driver `kperf` for performance comparison 2475- NVMe 2476 - Per-I/O flags for Force Unit Access (FUA) and Limited Retry 2477 - Public API for retrieving log pages 2478 - Reservation register/acquire/release/report command support 2479 - Scattered payload support - an alternate API to provide I/O buffers via a sequence of callbacks 2480 - Declarations and `nvme/identify` support for Intel SSD DC P3700 series vendor-specific log pages and features 2481- Updated to support DPDK 2.2.0 2482 2483## v1.0.0: NVMe user-space driver 2484 2485This is the initial open source release of the Storage Performance Development Kit (SPDK). 2486 2487Features: 2488 2489- NVMe user-space driver 2490- NVMe example programs 2491 - `examples/nvme/perf` tests performance (IOPS) using the NVMe user-space driver 2492 - `examples/nvme/identify` displays NVMe controller information in a human-readable format 2493- Linux and FreeBSD support 2494