From a78ddd8231f142a5560fde185e42eac618f56f6b Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 28 Mar 2018 15:36:02 -0700 Subject: [PATCH] nvme: add function to get PCI device from ctrlr This allows us to remove most uses of spdk_pci_get_device(), which looks up a PCI device structure from an arbitrary PCI address. This function is problematic, since it uses internal DPDK data structures that aren't meant to be part of the public API. There is still one use in the codebase, which will be cleaned up in another patch. Change-Id: Ia1fe1f799c240195f6871c1d92821074f884c4e6 Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/405707 Tested-by: SPDK Automated Test System Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris --- examples/nvme/identify/identify.c | 2 +- examples/nvme/perf/perf.c | 2 +- include/spdk/nvme.h | 9 +++++++++ lib/nvme/nvme_ctrlr.c | 14 ++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/examples/nvme/identify/identify.c b/examples/nvme/identify/identify.c index f71aa3548..8292dba03 100644 --- a/examples/nvme/identify/identify.c +++ b/examples/nvme/identify/identify.c @@ -571,7 +571,7 @@ print_controller(struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_transport return; } - pci_dev = spdk_pci_get_device(&pci_addr); + pci_dev = spdk_nvme_ctrlr_get_pci_device(ctrlr); if (!pci_dev) { return; } diff --git a/examples/nvme/perf/perf.c b/examples/nvme/perf/perf.c index d2c2b59f6..250296aae 100644 --- a/examples/nvme/perf/perf.c +++ b/examples/nvme/perf/perf.c @@ -1483,7 +1483,7 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, return; } - pci_dev = spdk_pci_get_device(&pci_addr); + pci_dev = spdk_nvme_ctrlr_get_pci_device(ctrlr); if (!pci_dev) { return; } diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index ebc9ae8ad..6b8101b77 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -459,6 +459,15 @@ union spdk_nvme_vs_register spdk_nvme_ctrlr_get_regs_vs(struct spdk_nvme_ctrlr * */ uint32_t spdk_nvme_ctrlr_get_num_ns(struct spdk_nvme_ctrlr *ctrlr); +/** + * \brief Get the PCI device of a given NVMe controller. + * + * \return PCI device of the NVMe controller, or NULL if not available. + * + * This only works for local (PCIe-attached) NVMe controllers; other transports will return NULL. + */ +struct spdk_pci_device *spdk_nvme_ctrlr_get_pci_device(struct spdk_nvme_ctrlr *ctrlr); + /** * \brief Determine if a particular log page is supported by the given NVMe controller. * diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index c53d6024d..625f69fc8 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1796,6 +1796,20 @@ spdk_nvme_ctrlr_get_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t ns_id) return &ctrlr->ns[ns_id - 1]; } +struct spdk_pci_device * +spdk_nvme_ctrlr_get_pci_device(struct spdk_nvme_ctrlr *ctrlr) +{ + if (ctrlr == NULL) { + return NULL; + } + + if (ctrlr->trid.trtype != SPDK_NVME_TRANSPORT_PCIE) { + return NULL; + } + + return nvme_ctrlr_proc_get_devhandle(ctrlr); +} + void spdk_nvme_ctrlr_register_aer_callback(struct spdk_nvme_ctrlr *ctrlr, spdk_nvme_aer_cb aer_cb_fn,