diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 849664d60..15f688522 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -784,6 +784,23 @@ nvme_ctrlr_identify(struct spdk_nvme_ctrlr *ctrlr) SPDK_DEBUGLOG(SPDK_LOG_NVME, "MDTS max_xfer_size %u\n", ctrlr->max_xfer_size); } + SPDK_DEBUGLOG(SPDK_LOG_NVME, "CNTLID 0x%04" PRIx16 "\n", ctrlr->cdata.cntlid); + if (ctrlr->trid.trtype == SPDK_NVME_TRANSPORT_PCIE) { + ctrlr->cntlid = ctrlr->cdata.cntlid; + } else { + /* + * Fabrics controllers should already have CNTLID from the Connect command. + * + * If CNTLID from Connect doesn't match CNTLID in the Identify Controller data, + * trust the one from Connect. + */ + if (ctrlr->cntlid != ctrlr->cdata.cntlid) { + SPDK_DEBUGLOG(SPDK_LOG_NVME, + "Identify CNTLID 0x%04" PRIx16 " != Connect CNTLID 0x%04" PRIx16 "\n", + ctrlr->cdata.cntlid, ctrlr->cntlid); + } + } + return 0; } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 767b4dabb..ac1e09945 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -464,6 +464,8 @@ struct spdk_nvme_ctrlr { uint16_t max_sges; + uint16_t cntlid; + /** Controller support flags */ uint64_t flags; diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 99bcafc3b..2293b847f 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -74,8 +74,6 @@ struct spdk_nvme_rdma_mr_map { /* NVMe RDMA transport extensions for spdk_nvme_ctrlr */ struct nvme_rdma_ctrlr { struct spdk_nvme_ctrlr ctrlr; - - uint16_t cntlid; }; /* NVMe RDMA qpair extensions for spdk_nvme_qpair */ @@ -516,7 +514,6 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair) int ret; struct rdma_cm_event *event; struct spdk_nvme_ctrlr *ctrlr; - struct nvme_rdma_ctrlr *rctrlr; ret = ibv_query_device(rqpair->cm_id->verbs, &attr); if (ret != 0) { @@ -531,12 +528,10 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair) return -1; } - rctrlr = nvme_rdma_ctrlr(ctrlr); - request_data.qid = rqpair->qpair.id; request_data.hrqsize = rqpair->num_entries; request_data.hsqsize = rqpair->num_entries - 1; - request_data.cntlid = rctrlr->cntlid; + request_data.cntlid = ctrlr->cntlid; param.private_data = &request_data; param.private_data_len = sizeof(request_data); @@ -608,7 +603,6 @@ nvme_rdma_qpair_fabric_connect(struct nvme_rdma_qpair *rqpair) struct spdk_nvmf_fabric_connect_cmd cmd; struct spdk_nvmf_fabric_connect_data *nvmf_data; struct spdk_nvme_ctrlr *ctrlr; - struct nvme_rdma_ctrlr *rctrlr; int rc = 0; ctrlr = rqpair->qpair.ctrlr; @@ -616,8 +610,6 @@ nvme_rdma_qpair_fabric_connect(struct nvme_rdma_qpair *rqpair) return -1; } - rctrlr = nvme_rdma_ctrlr(ctrlr); - nvmf_data = spdk_dma_zmalloc(sizeof(*nvmf_data), 0, NULL); if (!nvmf_data) { SPDK_ERRLOG("nvmf_data allocation error\n"); @@ -636,7 +628,7 @@ nvme_rdma_qpair_fabric_connect(struct nvme_rdma_qpair *rqpair) if (nvme_qpair_is_admin_queue(&rqpair->qpair)) { nvmf_data->cntlid = 0xFFFF; } else { - nvmf_data->cntlid = rctrlr->cntlid; + nvmf_data->cntlid = ctrlr->cntlid; } SPDK_STATIC_ASSERT(sizeof(nvmf_data->hostid) == sizeof(ctrlr->opts.extended_host_id), @@ -662,7 +654,8 @@ nvme_rdma_qpair_fabric_connect(struct nvme_rdma_qpair *rqpair) if (nvme_qpair_is_admin_queue(&rqpair->qpair)) { rsp = (struct spdk_nvmf_fabric_connect_rsp *)&status.cpl; - rctrlr->cntlid = rsp->status_code_specific.success.cntlid; + ctrlr->cntlid = rsp->status_code_specific.success.cntlid; + SPDK_DEBUGLOG(SPDK_LOG_NVME, "CNTLID 0x%04" PRIx16 "\n", ctrlr->cntlid); } ret: spdk_dma_free(nvmf_data);