Commit Graph

116 Commits

Author SHA1 Message Date
Cunyin Chang
4f6cc16e2f bdev/nvme: initialize the adminq_timer_poller as NULL.
Change-Id: I86ef6d42e98a39ed765de88f74b826edc8f2c904
Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
2017-01-20 10:08:59 -07:00
Daniel Verkamp
5de35015b9 bdev/nvme: add timer-based admin queue poller
This is necessary to process asynchronous events, as well as keep-alive
support for NVMe over Fabrics connections.

Based on a patch by Edward Yang <eyang@us.fujitsu.com>

Change-Id: I3e81f3d5061f75b12b625fa1a06629c6dc3dc61b
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-19 10:54:33 -07:00
Daniel Verkamp
a53f617423 bdev: add API to translate to and from NVMe status
This prevents the need for bdev users and modules to manipulate the
internal bdev_io error.nvme fields.

For now, all non-NVMe error types are treated as a generic device error,
but translation from SCSI to NVMe could be added in the future.

Change-Id: I4e831b26a2f41bf2f405c7576d5019bb898d4d1b
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-19 09:39:26 -07:00
Daniel Verkamp
2138676573 bdev: defer completions from within submit_request
If a blockdev module calls spdk_bdev_io_complete() within its
submit_request function, and the user's completion callback issues a new
I/O, it is possible to cause infinite recursion, consuming all available
stack space.

To avoid this, track whether a bdev_io is being processed by
submit_request, and if io_complete() is called in this case, defer the
completion via an event.

Change-Id: I6ccdb8ed4ee0d5738e6c9840d35431de52bd5fa2
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-13 12:37:54 -07:00
Daniel Verkamp
4600aaf68f bdev: simplify spdk_bdev_free_io() flow
Because of the addition of io_channel support to the bdev layer, there
is no longer a need to re-run a completed I/O through the submission
event pipeline; it can be freed directly.

Change-Id: I2b9163c87293345acf0e85f6d0c1032f30209659
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-12 14:25:35 -07:00
Daniel Verkamp
249a68e92b bdev: add API to claim block devices
Claim the block devices used by iSCSI LUNs and NVMe-oF subsystems so
they can't accidentally be reused.

This will also be used by virtual block devices to allow layering of
bdevs.

Change-Id: I5384923fbf24f13f4ce720a797c5a628053d49f4
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-11 16:49:39 -07:00
Daniel Verkamp
a96dc2592e bdev: remove event dependency from I/O callback
Use a plain function pointer + callback context for the bdev I/O
completion callback.  This is possible now because each I/O channel will
be polled on the core that submitted the I/O.

Change-Id: I29ee8e4a3430df11c74845adab840395b9bc5010
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-09 12:09:36 -07:00
Jim Harris
6d4ce17380 bdev/nvme: do not split SGE callbacks on 2MB boundaries
An SGE could be for a payload that is greater than the NVMe
devices MDTS (i.e. 128KB), but that SGE may not be aligned
on a sector-size boundary.  We can safely assume that each
iov is individually physically contiguous - the DPDK
mempools for example guarantee this.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I8143ed01814c3154d0a06b8bbc548484437c1e88
2017-01-05 15:51:04 -07:00
Daniel Verkamp
7ac9a4ecbb event: remove spdk_event_allocate() next parameter
The 'next' event pointer was never used in the entire code base (always
NULL).

Change-Id: I75f999d3a2e10512d86edec1a5a46ef263e2635b
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-05 11:57:18 -07:00
Daniel Verkamp
c3ede774c7 event: remove spdk_event_t typedef
Use 'struct spdk_event *' directly for consistency with the rest of the
API.

Change-Id: Ib41a9bf47f5b18f4aebf5f4dee055455cb12ef7d
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-05 11:57:18 -07:00
Daniel Verkamp
2931a3efef event: remove 'complete' parameter from poller_register
The spdk_poller_register() function provides a way to pass an event to
call once the poller is registered, but it is always NULL in the current
code base.

Change-Id: I459bf40ae4d050589577d113b7984f1563aaa9cc
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-05 11:57:18 -07:00
Daniel Verkamp
7b01af8fd2 event.h: split non-public API into spdk_internal
Change-Id: Ie783df6cf387286ab882107fb9d4ce12358602e2
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-05 11:57:18 -07:00
Daniel Verkamp
66f4dce74a bdev: remove spdk_bdev_io_submit() from API
It is only used within bdev.c and can be static.

Change-Id: Id6e2cd9e5dd61a3ef1e1a27993d7a5ea7728bff2
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-05 11:57:18 -07:00
Daniel Verkamp
1e85d9ef32 bdev_module.h: move to spdk_internal/bdev.h
This is consistent with the other internal-only API headers.

Change-Id: I2c4748977d38a6c173311d26197d6273c168da7d
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2017-01-05 11:57:18 -07:00
Tsuyoshi Uchida
8b3115fc61 bdev/nvme: add OACS information in blockdev_nvme_dump_config_json (#87) 2017-01-03 15:47:32 -07:00
Ben Walker
df46c41a4c nvme: Unify spdk_nvme_discover and spdk_nvme_probe
They were very close to the same already, so finish the job.

Change-Id: Ifba9e3b2d11a3e70cbfbe46f57a67552db2757ed
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
2016-12-19 11:22:57 -07:00
Ziye Yang
002815a4d9 bdev/nvme: Pass nvme_library_fini to SPDK_BDEV_MODULE_REGISTER
Change-Id: Ifb36e1b89bdc2347520795c1d1520db82158c41b
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
2016-12-14 12:13:38 -07:00
Ziye Yang
69fa44fc88 rbd: change the product name of rbd to "Ceph Rbd Disk"
Comply with the definition format used by other bdev
modules

Change-Id: Iac108bac540687b32fea4bb70374c22534c60aa0
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
2016-12-13 09:24:31 -07:00
Tsuyoshi Uchida
b28125b9de bdev/nvme: add CSTS in blockdev_nvme_dump_config_json (#85)
* bdev/nvme: add CSTS in blockdev_nvme_dump_config_json

* bdev/nvme: delete shst

- delete shst
- change from spdk_json_write_string_fmt to spdk_json_write_uint32
2016-12-12 16:57:20 -07:00
Ben Walker
32e838af3c nvme: Remove probe_info, just use transport_id
The probe_info was reduced to just containing a
transport_id, so remove probe_info entirely.

Change-Id: Ica9a22d126cd14e282decd3eea1a0afe0460f099
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
2016-12-12 10:49:17 -07:00
Ben Walker
3da43e64e4 nvme: Remove pci_addr from probe_info
This can be obtained by parsing the traddr.

Change-Id: Idaf35066cbf900c87e771a44934de99fb5420001
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
2016-12-12 10:46:50 -07:00
Isaac Otsiabah
5bc79e9c3d bdev/nvme: add option to reset on I/O timeout
Change-Id: I7128a1f2916af8470b0564025f5f30e299ab992b
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-12-10 16:21:09 -07:00
Daniel Verkamp
50365733e3 bdev/nvme: simplify nvme_version formatting
Drop the complicated buffer size/strlen math and just split the version
string formatting into two cases depending on whether the tertiary
version is set.

Change-Id: I4b4983cb8805e8734c408f473dd8c592ec8e8138
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-12-07 13:36:37 -07:00
Daniel Verkamp
cdc332d178 bdev/nvme: fix vendor_id formatting
The printf # specifier adds 0x for %x values, but the field width then
includes the 0x part, so for example printf("%#04x", 0x1) prints "0x01"
rather than the intended "0x0001".

Rather than increasing the field width, just manually insert the 0x in
the format string and drop # for less confusion.

Change-Id: Ie6044619a22b51b39562bfa5c0c0239933bf38c8
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-12-07 13:36:37 -07:00
Tsuyoshi Uchida
07456bb114 bdev/nvme: add information in blockdev_nvme_dump_config_json (#78)
Add the following infromation.
- PCI Address
- Vendor ID
- Model Number
- Serial Number
- Firmware Revision
- NVMe spec version
- Namespace sector size
- Namespace total size
2016-12-05 13:59:39 -07:00
Tsuyoshi Uchida
438064c925 bdev/nvme: change name of variables to lower case (#77)
LunSizeInMB -> lun_size_in_mb
LunSizeInsector -> lun_size_in_sector
2016-11-28 11:08:26 -07:00
Daniel Verkamp
cf3fb7bb7d bdev/rpc: add driver-specific data to get_bdevs
Change-Id: Ieb37c9fdb55b36b62adcb421ab1d0426052d23a4
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-21 12:35:57 -07:00
Changpeng Liu
c8ce161852 bdev/nvme: set bdev write cache flag according to NVMe capability
Change-Id: Iad307b0d1883d00b2e68bbdfaa94f05955a8314d
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
2016-11-17 13:15:24 -07:00
Daniel Verkamp
5b63b8a448 copy_engine: rename spdk_copy_module_get_max_ctx_size() to spdk_copy_task_size()
Make the public API clearer - if the user wants to allocate a
spdk_copy_task directly, they need to allocate spdk_copy_task_size()
bytes.

Also change the return type to size_t for consistency.

Change-Id: I0f3757056757c510421d680c5b4532edd9bc2561
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-16 15:04:40 -07:00
Daniel Verkamp
ee64969a7b copy_engine: add spdk_ prefix to types
Change-Id: I060718887950ee7f890e76d7e041e70db39974a2
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-16 14:14:50 -07:00
Daniel Verkamp
d27b24c94b log: split internal TRACELOG macro into new header
The SPDK_TRACELOG macro depends on a CONFIG setting (DEBUG), so it
should not be part of the public API.

Create a new include/spdk_internal directory for headers that should
only be used within SPDK, not exported for public use.

Change-Id: I39b90ce57da3270e735ba32210c4b3a3468c460b
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-16 13:33:51 -07:00
liupan1111
0dacdf2947 replace SPDK_TRACELOG with SPDK_ERRLOG when an error happens (#68) 2016-11-14 10:30:49 -07:00
Daniel Verkamp
51c6917fad bdev/rbd: remove redundant len field
Use the len field from the generic spdk_bdev_io instead of duplicating
it in blockdev_rbd_io.

Change-Id: I3ebfab8dd1303add83bc2206fc87319ba7d605b3
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-09 10:05:35 -07:00
Jim Harris
0095e2b994 bdev/nvme: account for 2MB straddle in queued_next_sge()
This function needs to check for SGEs that straddle a
2MB page boundary, and ensure it does not return
a length that will cross that boundary.

This cannot happen in practice currently with SPDK
since all buffers are allocated using rte_malloc(),
but an upcoming vhost-scsi target may produce
SGEs from a guest VM's physical memory that span
a 2MB boundary.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I8b83c7c39c4cf33815abb22ff2ebc90941b21e28
2016-11-09 10:04:52 -07:00
Jim Harris
aac30ff3f4 bdev/nvme: reorganize queued_next_sge()
No functional change, but removes a few assumptions
that will be invalid in a future patch that fixes a
bug in this function.  Primarily we no longer assume
that this function will always increment the
iovpos and reset iov_offset to 0.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I770f2f24c37626063e113af850a2af792aed332a
2016-11-09 10:04:52 -07:00
Daniel Verkamp
1f3d48b22d bdev: move spdk_bdev_fn_table into bdev_module.h
The bdev function table should not be part of the public API.

Change-Id: I5d6f40d1b37c4471041c1c9d6253a3f92e9e9701
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-09 09:59:39 -07:00
Daniel Verkamp
3e32462142 bdev/rbd: remove unused blockdev_rbd_io::ch
It was written but never read (and the I/O channel is already stored in
the generic spdk_bdev_io).

Change-Id: Id33392e9d3940b2c1439e9fed2553aa091ecedf8
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-09 09:16:53 -07:00
Daniel Verkamp
22698fd8bb bdev/rbd: replace custom enum with spdk_bdev_io_type
No need to duplicate the bdev-defined I/O type.

Change-Id: I15cb68c3c68b3f25b286b04500b53081ed5e7881
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-09 09:16:53 -07:00
Daniel Verkamp
71ff831d0e bdev/rbd: simplify status code processing
The status field in blockdev_rbd_io was only used within
blockdev_rbd_io_poll(), so replace it with a local variable.

Change-Id: I3629225f28b752a3acc7521699c33bc98f1e4b7b
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-09 09:16:53 -07:00
Daniel Verkamp
0aec36be1f nvme: return virtual address in SGL callback
Instead of the next_sge callback returning the physical address
directly, make it return the virtual address and convert to physical
address inside the NVMe library.

This is necessary for NVMe over Fabrics host support, since the RDMA
userspace API requires virtual addresses rather than physical addresses.
It is also more consistent with the normal non-SGL NVMe functions that
already take virtual addresses.

Change-Id: I79a7af64ead987535f6bf3057b2b22aef3171c5b
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-09 08:57:40 -07:00
Daniel Verkamp
2b2ce628dc bdev/rbd: simplify pool_name allocation
Remove the complex list management for pool_name and just strdup() it
directly.  It is not worth the trouble to save a few bytes.

Change-Id: I8a4f7eeea619bd824ea593854423e317041c540e
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-08 13:10:54 -07:00
Daniel Verkamp
9f2e5cd713 bdev/rbd: remove unused cb_fn and size fields
Change-Id: I46082e036ac2a3318fa4191a5cb4d460d41cecf8
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-08 13:10:38 -07:00
Daniel Verkamp
bb8451cced Replace rte_panic() with abort()
Remove a DPDK dependency from generic code.

Change-Id: I8e3e2c0a36d980b426a1967ed1f88fb8b855c382
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-08 08:57:49 -07:00
Daniel Verkamp
a8e6c0aeaf bdev/nvme: only create bdevs for active namespaces
Change-Id: I3ebe0786e8ef6fe722834fb72e6deede036625ec
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-08 08:57:34 -07:00
Tsuyoshi Uchida
6583441f54 bdev: add members for SCSI sense information in spdk_bdev_io (#59)
Custom bdev modules can return any SCSI status and SCSI sense
information to a host by this patch. This is usefull when a custome bdev
module detect an error in the module and need to return meaningful
information to a host.
2016-11-07 13:14:47 -07:00
Pan Liu
fa5206c416 env: add wrapper to call function without thread affinity (#60)
Make a wrapper that spdk can call a function without thread affinity, and
call this wrapper to open rbd image.

Change-Id: Iadc87a948f43632abf497f88165483a0e269ba54
2016-11-07 10:32:16 -07:00
Daniel Verkamp
fcb00f3780 nvme: expand probe information to a struct
spdk_nvme_probe() will now provide a struct spdk_nvme_probe_info to the
probe and attach callbacks in place of the PCI device pointer.

This struct contains the useful information that could be retrieved from
the PCI device during probe.

The goal of this change is to allow expansion of the probe information
in the future when other transports (specifically, NVMe over Fabrics)
are added that do not necessarily use PCI addressing or device IDs.

Change-Id: I59a2a9e874e248ce5fa1d7f4b57c8056962ff3cd
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-02 14:15:02 -07:00
Daniel Verkamp
bbd7e1c4da env: add spdk_pci_addr_parse()
Add a helper function that converts a PCI address from a string into a
struct spdk_pci_addr and use it in place of the various sscanf()
invocations throughout SPDK.

Change-Id: Id2749723f76db741567e01b4bcb0fffb0e425fcd
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-02 14:15:02 -07:00
Daniel Verkamp
e1baabee4a bdev: add get_bdevs RPC
Add an RPC interface to list all blockdevs and their properties.

Change-Id: I50db730d5eff8cffcbe8fe5df6b3461457e8581e
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-02 09:10:54 -07:00
Daniel Verkamp
e912a90f77 env: pass PCI address when claiming devices
The PCI device claim function does not need the whole spdk_pci_device
structure, just the address.

Change-Id: If59df512043ee062cf9f759bdc104fc522625ba8
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-11-01 10:07:30 -07:00