From 163eba9565ee47506369d8b00ad8b99766e5200e Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Mon, 20 Apr 2020 02:22:52 -0400 Subject: [PATCH] nvme: return the physical address in nvme_pcie_ctrlr_alloc_cmb() Commit 9ad044c4 remove the offset parameter in nvme_pcie_ctrlr_alloc_cmb() and uses spdk_vtophys() to get the physical address of the submission queue, however, the memory isn't registered to SPDK yet, so use the offset to get the physical address again. Change-Id: Ida0f4a8bf1e72d6446fba442a1b71f0ddaab4bb8 Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1933 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/nvme/nvme_pcie.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 6a058c61b..73150c4af 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -991,7 +991,8 @@ nvme_pcie_qpair_reset(struct spdk_nvme_qpair *qpair) } static void * -nvme_pcie_ctrlr_alloc_cmb(struct spdk_nvme_ctrlr *ctrlr, uint64_t size, uint64_t alignment) +nvme_pcie_ctrlr_alloc_cmb(struct spdk_nvme_ctrlr *ctrlr, uint64_t size, uint64_t alignment, + uint64_t *phys_addr) { struct nvme_pcie_ctrlr *pctrlr = nvme_pcie_ctrlr(ctrlr); uintptr_t addr; @@ -1009,6 +1010,7 @@ nvme_pcie_ctrlr_alloc_cmb(struct spdk_nvme_ctrlr *ctrlr, uint64_t size, uint64_t SPDK_ERRLOG("Tried to allocate past valid CMB range!\n"); return NULL; } + *phys_addr = pctrlr->cmb.bar_pa + addr - (uintptr_t)pctrlr->cmb.bar_va; pctrlr->cmb.current_offset = (addr + size) - (uintptr_t)pctrlr->cmb.bar_va; @@ -1064,8 +1066,7 @@ nvme_pcie_qpair_construct(struct spdk_nvme_qpair *qpair, /* cmd and cpl rings must be aligned on page size boundaries. */ if (ctrlr->opts.use_cmb_sqs) { pqpair->cmd = nvme_pcie_ctrlr_alloc_cmb(ctrlr, pqpair->num_entries * sizeof(struct spdk_nvme_cmd), - sysconf(_SC_PAGESIZE)); - pqpair->cmd_bus_addr = spdk_vtophys(pqpair->cmd, NULL); + sysconf(_SC_PAGESIZE), &pqpair->cmd_bus_addr); if (pqpair->cmd != NULL) { pqpair->sq_in_cmb = true; }