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