From f3e197ff18e5dfbeb92d805355ba4d71f3578f82 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 24 Nov 2022 20:04:53 +0000 Subject: [PATCH] nvmf: add qpair->connect_received Currently we use qpair->ctrlr at qpair destroy time to decide if we need to decrement the qpair's poll group's qpair count. But this is not correct - these counters get incremented when the CONNECT is received, but qpair->ctrlr doesn't get set until later. So add a new connect_received bool to the spdk_nvmf_qpair. Use this instead to determine when we should decrement the poll group qpair counters. Signed-off-by: Jim Harris Change-Id: I174a0fda36c4558171953bf58f2f5117bc074f76 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15692 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Tomasz Zawadzki Reviewed-by: Ben Walker Reviewed-by: Konrad Sztyber --- include/spdk/nvmf_transport.h | 1 + lib/nvmf/ctrlr.c | 1 + lib/nvmf/nvmf.c | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/spdk/nvmf_transport.h b/include/spdk/nvmf_transport.h index ef041cc43..d3597d3f7 100644 --- a/include/spdk/nvmf_transport.h +++ b/include/spdk/nvmf_transport.h @@ -123,6 +123,7 @@ struct spdk_nvmf_qpair { uint16_t qid; uint16_t sq_head; uint16_t sq_head_max; + bool connect_received; bool disconnect_started; struct spdk_nvmf_request *first_fused_req; diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 4c3e2ca1c..6f9b61d79 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -727,6 +727,7 @@ _nvmf_ctrlr_connect(struct spdk_nvmf_request *req) qpair->sq_head_max = cmd->sqsize; qpair->qid = cmd->qid; + qpair->connect_received = true; if (0 == qpair->qid) { qpair->group->stat.admin_qpairs++; diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index dc00ddca9..1658d6d5a 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -1046,7 +1046,7 @@ _nvmf_qpair_destroy(void *ctx, int status) assert(qpair->state == SPDK_NVMF_QPAIR_DEACTIVATING); qpair_ctx->qid = qpair->qid; - if (ctrlr) { + if (qpair->connect_received) { if (0 == qpair->qid) { assert(qpair->group->stat.current_admin_qpairs > 0); qpair->group->stat.current_admin_qpairs--; @@ -1054,7 +1054,9 @@ _nvmf_qpair_destroy(void *ctx, int status) assert(qpair->group->stat.current_io_qpairs > 0); qpair->group->stat.current_io_qpairs--; } + } + if (ctrlr) { sgroup = &qpair->group->sgroups[ctrlr->subsys->id]; TAILQ_FOREACH_SAFE(req, &sgroup->queued, link, tmp) { if (req->qpair == qpair) {