From 6564bd94baa1fe710320200677ae5854a540b0c0 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Tue, 8 Jun 2021 07:30:53 -0700 Subject: [PATCH] nvme: fix DEFAULT_IO_QUEUE_SIZE_FOR_QUIRK handling We need to wait to process this quirk until after we have a valid CAP register value. Before this fix, controllers with this quirk would get their io_queue_size always capped at 2 (min io queue size) because CAP hadn't actually been read yet. Fixes: f5ba8a5e (nvme: add NVME_CTRLR_STATE_READ_CAP) Signed-off-by: Jim Harris Change-Id: I4df87b5dfb0faa21db5b4cf6fc667d80621d1691 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8211 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Karol Latecki Reviewed-by: Tomasz Zawadzki Reviewed-by: Aleksey Marchuk Reviewed-by: Changpeng Liu Reviewed-by: Reviewed-by: Ziye Yang --- lib/nvme/nvme.c | 10 ---------- lib/nvme/nvme_ctrlr.c | 9 +++++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index 1c92ea9e5f..9ef781e2bc 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -678,16 +678,6 @@ nvme_ctrlr_probe(const struct spdk_nvme_transport_id *trid, ctrlr->remove_cb = probe_ctx->remove_cb; ctrlr->cb_ctx = probe_ctx->cb_ctx; - if (ctrlr->quirks & NVME_QUIRK_MINIMUM_IO_QUEUE_SIZE && - ctrlr->opts.io_queue_size == DEFAULT_IO_QUEUE_SIZE) { - /* If the user specifically set an IO queue size different than the - * default, use that value. Otherwise overwrite with the quirked value. - * This allows this quirk to be overridden when necessary. - * However, cap.mqes still needs to be respected. - */ - ctrlr->opts.io_queue_size = spdk_min(DEFAULT_IO_QUEUE_SIZE_FOR_QUIRK, ctrlr->cap.bits.mqes + 1u); - } - nvme_qpair_set_state(ctrlr->adminq, NVME_QPAIR_ENABLED); TAILQ_INSERT_TAIL(&probe_ctx->init_ctrlrs, ctrlr, tailq); return 0; diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 5588ca41f6..199e425563 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -3522,6 +3522,15 @@ nvme_ctrlr_init_cap(struct spdk_nvme_ctrlr *ctrlr) ctrlr->opts.io_queue_size = spdk_max(ctrlr->opts.io_queue_size, SPDK_NVME_IO_QUEUE_MIN_ENTRIES); ctrlr->opts.io_queue_size = spdk_min(ctrlr->opts.io_queue_size, MAX_IO_QUEUE_ENTRIES); + if (ctrlr->quirks & NVME_QUIRK_MINIMUM_IO_QUEUE_SIZE && + ctrlr->opts.io_queue_size == DEFAULT_IO_QUEUE_SIZE) { + /* If the user specifically set an IO queue size different than the + * default, use that value. Otherwise overwrite with the quirked value. + * This allows this quirk to be overridden when necessary. + * However, cap.mqes still needs to be respected. + */ + ctrlr->opts.io_queue_size = DEFAULT_IO_QUEUE_SIZE_FOR_QUIRK; + } ctrlr->opts.io_queue_size = spdk_min(ctrlr->opts.io_queue_size, ctrlr->cap.bits.mqes + 1u); ctrlr->opts.io_queue_requests = spdk_max(ctrlr->opts.io_queue_requests, ctrlr->opts.io_queue_size);