nvme/pcie: use common trid -> ctrlr function

Simplify the PCIe transport by using an existing function to look up a
controller by transport ID.

Change-Id: I261865df1ba23069b052ca64944b7637d70c85ba
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/388701
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Daniel Verkamp 2017-11-22 15:51:45 -07:00 committed by Jim Harris
parent 1804f3c528
commit 4525fc898f
4 changed files with 37 additions and 26 deletions

View File

@ -416,21 +416,28 @@ nvme_init_controllers(void *cb_ctx, spdk_nvme_attach_cb attach_cb)
static struct spdk_nvme_ctrlr * static struct spdk_nvme_ctrlr *
spdk_nvme_get_ctrlr_by_trid(const struct spdk_nvme_transport_id *trid) spdk_nvme_get_ctrlr_by_trid(const struct spdk_nvme_transport_id *trid)
{ {
struct spdk_nvme_ctrlr *ctrlr = NULL; struct spdk_nvme_ctrlr *ctrlr;
bool found = false;
nvme_robust_mutex_lock(&g_spdk_nvme_driver->lock); nvme_robust_mutex_lock(&g_spdk_nvme_driver->lock);
ctrlr = spdk_nvme_get_ctrlr_by_trid_unsafe(trid);
nvme_robust_mutex_unlock(&g_spdk_nvme_driver->lock);
return ctrlr;
}
/* This function must be called while holding g_spdk_nvme_driver->lock */
struct spdk_nvme_ctrlr *
spdk_nvme_get_ctrlr_by_trid_unsafe(const struct spdk_nvme_transport_id *trid)
{
struct spdk_nvme_ctrlr *ctrlr;
TAILQ_FOREACH(ctrlr, &g_spdk_nvme_driver->attached_ctrlrs, tailq) { TAILQ_FOREACH(ctrlr, &g_spdk_nvme_driver->attached_ctrlrs, tailq) {
if (spdk_nvme_transport_id_compare(&ctrlr->trid, trid) == 0) { if (spdk_nvme_transport_id_compare(&ctrlr->trid, trid) == 0) {
found = true; return ctrlr;
break;
} }
} }
nvme_robust_mutex_unlock(&g_spdk_nvme_driver->lock); return NULL;
return (found == true) ? ctrlr : NULL;
} }
/* This function must only be called while holding g_spdk_nvme_driver->lock */ /* This function must only be called while holding g_spdk_nvme_driver->lock */

View File

@ -602,6 +602,9 @@ bool nvme_completion_is_retry(const struct spdk_nvme_cpl *cpl);
void nvme_qpair_print_command(struct spdk_nvme_qpair *qpair, struct spdk_nvme_cmd *cmd); void nvme_qpair_print_command(struct spdk_nvme_qpair *qpair, struct spdk_nvme_cmd *cmd);
void nvme_qpair_print_completion(struct spdk_nvme_qpair *qpair, struct spdk_nvme_cpl *cpl); void nvme_qpair_print_completion(struct spdk_nvme_qpair *qpair, struct spdk_nvme_cpl *cpl);
struct spdk_nvme_ctrlr *spdk_nvme_get_ctrlr_by_trid_unsafe(
const struct spdk_nvme_transport_id *trid);
/* Transport specific functions */ /* Transport specific functions */
#define DECLARE_TRANSPORT(name) \ #define DECLARE_TRANSPORT(name) \
struct spdk_nvme_ctrlr *nvme_ ## name ## _ctrlr_construct(const struct spdk_nvme_transport_id *trid, const struct spdk_nvme_ctrlr_opts *opts, \ struct spdk_nvme_ctrlr *nvme_ ## name ## _ctrlr_construct(const struct spdk_nvme_transport_id *trid, const struct spdk_nvme_ctrlr_opts *opts, \

View File

@ -238,15 +238,14 @@ _nvme_pcie_hotplug_monitor(void *cb_ctx, spdk_nvme_probe_cb probe_cb,
} }
} }
} else if (event.action == SPDK_NVME_UEVENT_REMOVE) { } else if (event.action == SPDK_NVME_UEVENT_REMOVE) {
bool in_list = false; struct spdk_nvme_transport_id trid;
TAILQ_FOREACH(ctrlr, &g_spdk_nvme_driver->attached_ctrlrs, tailq) { memset(&trid, 0, sizeof(trid));
if (strcmp(event.traddr, ctrlr->trid.traddr) == 0) { trid.trtype = SPDK_NVME_TRANSPORT_PCIE;
in_list = true; snprintf(trid.traddr, sizeof(trid.traddr), "%s", event.traddr);
break;
} ctrlr = spdk_nvme_get_ctrlr_by_trid_unsafe(&trid);
} if (ctrlr == NULL) {
if (in_list == false) {
return 0; return 0;
} }
SPDK_DEBUGLOG(SPDK_TRACE_NVME, "remove nvme address: %s\n", SPDK_DEBUGLOG(SPDK_TRACE_NVME, "remove nvme address: %s\n",
@ -578,7 +577,6 @@ pcie_nvme_enum_cb(void *ctx, struct spdk_pci_device *pci_dev)
struct spdk_nvme_transport_id trid = {}; struct spdk_nvme_transport_id trid = {};
struct nvme_pcie_enum_ctx *enum_ctx = ctx; struct nvme_pcie_enum_ctx *enum_ctx = ctx;
struct spdk_nvme_ctrlr *ctrlr; struct spdk_nvme_ctrlr *ctrlr;
int rc = 0;
struct spdk_pci_addr pci_addr; struct spdk_pci_addr pci_addr;
pci_addr = spdk_pci_device_get_addr(pci_dev); pci_addr = spdk_pci_device_get_addr(pci_dev);
@ -587,16 +585,13 @@ pcie_nvme_enum_cb(void *ctx, struct spdk_pci_device *pci_dev)
spdk_pci_addr_fmt(trid.traddr, sizeof(trid.traddr), &pci_addr); spdk_pci_addr_fmt(trid.traddr, sizeof(trid.traddr), &pci_addr);
/* Verify that this controller is not already attached */ /* Verify that this controller is not already attached */
TAILQ_FOREACH(ctrlr, &g_spdk_nvme_driver->attached_ctrlrs, tailq) { ctrlr = spdk_nvme_get_ctrlr_by_trid_unsafe(&trid);
/* NOTE: In the case like multi-process environment where the device handle is if (ctrlr) {
* different per each process, we compare by BDF to determine whether it is the if (spdk_process_is_primary()) {
* same controller. /* Already attached */
*/ return 0;
if (strcmp(trid.traddr, ctrlr->trid.traddr) == 0) { } else {
if (!spdk_process_is_primary()) { return nvme_ctrlr_add_process(ctrlr, pci_dev);
rc = nvme_ctrlr_add_process(ctrlr, pci_dev);
}
return rc;
} }
} }

View File

@ -268,6 +268,12 @@ nvme_qpair_enable(struct spdk_nvme_qpair *qpair)
abort(); abort();
} }
struct spdk_nvme_ctrlr *
spdk_nvme_get_ctrlr_by_trid_unsafe(const struct spdk_nvme_transport_id *trid)
{
return NULL;
}
#if 0 /* TODO: update PCIe-specific unit test */ #if 0 /* TODO: update PCIe-specific unit test */
static void static void