diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 3d93360bf..7d901fbd3 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1032,7 +1032,8 @@ nvme_pcie_qpair_construct(struct spdk_nvme_qpair *qpair, uint16_t i; volatile uint32_t *doorbell_base; uint16_t num_trackers; - size_t page_align = VALUE_2MB; + size_t page_align = sysconf(_SC_PAGESIZE); + size_t queue_align, queue_len; uint32_t flags = SPDK_MALLOC_DMA; uint64_t sq_paddr = 0; uint64_t cq_paddr = 0; @@ -1070,7 +1071,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); + page_align, &pqpair->cmd_bus_addr); if (pqpair->cmd != NULL) { pqpair->sq_in_cmb = true; } @@ -1083,9 +1084,9 @@ nvme_pcie_qpair_construct(struct spdk_nvme_qpair *qpair, /* To ensure physical address contiguity we make each ring occupy * a single hugepage only. See MAX_IO_QUEUE_ENTRIES. */ - pqpair->cmd = spdk_zmalloc(pqpair->num_entries * sizeof(struct spdk_nvme_cmd), - page_align, NULL, - SPDK_ENV_SOCKET_ID_ANY, flags); + queue_len = pqpair->num_entries * sizeof(struct spdk_nvme_cmd); + queue_align = spdk_max(spdk_align32pow2(queue_len), page_align); + pqpair->cmd = spdk_zmalloc(queue_len, queue_align, NULL, SPDK_ENV_SOCKET_ID_ANY, flags); if (pqpair->cmd == NULL) { SPDK_ERRLOG("alloc qpair_cmd failed\n"); return -ENOMEM; @@ -1106,9 +1107,9 @@ nvme_pcie_qpair_construct(struct spdk_nvme_qpair *qpair, if (pqpair->cq_vaddr) { pqpair->cpl = pqpair->cq_vaddr; } else { - pqpair->cpl = spdk_zmalloc(pqpair->num_entries * sizeof(struct spdk_nvme_cpl), - page_align, NULL, - SPDK_ENV_SOCKET_ID_ANY, flags); + queue_len = pqpair->num_entries * sizeof(struct spdk_nvme_cpl); + queue_align = spdk_max(spdk_align32pow2(queue_len), page_align); + pqpair->cpl = spdk_zmalloc(queue_len, queue_align, NULL, SPDK_ENV_SOCKET_ID_ANY, flags); if (pqpair->cpl == NULL) { SPDK_ERRLOG("alloc qpair_cpl failed\n"); return -ENOMEM;