From cf3c54bc03978631dbf5ef2e906b9aeed47d3831 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 27 Jun 2019 14:55:08 +0900 Subject: [PATCH] nvme: Ensure max_sges not to exceed what controller supports in generic layer Previously comparing the transport supported value and the target value was done in RDMA transport layer. However this comparison should be done in the generic layer like the maximum IO transfer size. Hence change the comparison to do in the generic layer in this patch. Besides, for MSDBD, the value 0 indicates no limit but we had handled this as maximum number of SGS entries was 0 by mistake. This patch fixes the bug together. Signed-off-by: Shuhei Matsumoto Change-Id: I54365cf114169b10180ec2c659f9c7302672674c Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/459574 Tested-by: SPDK CI Jenkins Reviewed-by: Paul Luse Reviewed-by: Changpeng Liu --- lib/nvme/nvme_ctrlr.c | 10 ++++++++++ lib/nvme/nvme_rdma.c | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 2ec26c46e..27b5731b7 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -982,7 +982,17 @@ nvme_ctrlr_identify_done(void *arg, const struct spdk_nvme_cpl *cpl) if (ctrlr->cdata.sgls.supported) { ctrlr->flags |= SPDK_NVME_CTRLR_SGL_SUPPORTED; + /* + * Use MSDBD to ensure our max_sges doesn't exceed what the + * controller supports. + */ ctrlr->max_sges = nvme_transport_ctrlr_get_max_sges(ctrlr); + if (ctrlr->cdata.nvmf_specific.msdbd != 0) { + ctrlr->max_sges = spdk_min(ctrlr->cdata.nvmf_specific.msdbd, ctrlr->max_sges); + } else { + /* A value 0 indicates no limit. */ + } + SPDK_DEBUGLOG(SPDK_LOG_NVME, "transport max_sges %u\n", ctrlr->max_sges); } if (ctrlr->cdata.oacs.security) { diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index fd9598b97..4ae4768f7 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1770,7 +1770,7 @@ nvme_rdma_ctrlr_get_max_xfer_size(struct spdk_nvme_ctrlr *ctrlr) uint16_t nvme_rdma_ctrlr_get_max_sges(struct spdk_nvme_ctrlr *ctrlr) { - return spdk_min(ctrlr->cdata.nvmf_specific.msdbd, NVME_RDMA_MAX_SGL_DESCRIPTORS); + return NVME_RDMA_MAX_SGL_DESCRIPTORS; } volatile struct spdk_nvme_registers *