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,