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