diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index bbc0591a9..80934a3a8 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -78,7 +78,8 @@ ctrlr_add_qpair_and_update_rsp(struct spdk_nvmf_qpair *qpair, struct spdk_nvmf_fabric_connect_rsp *rsp) { if (qpair->qid >= spdk_bit_array_capacity(ctrlr->qpair_mask)) { - SPDK_ERRLOG("qpair limit %d\n", ctrlr->num_qpairs); + SPDK_ERRLOG("Requested QID %u but Max QID is %u\n", + qpair->qid, spdk_bit_array_capacity(ctrlr->qpair_mask) - 1); rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC; rsp->status.sc = SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER; return; @@ -93,7 +94,6 @@ ctrlr_add_qpair_and_update_rsp(struct spdk_nvmf_qpair *qpair, } qpair->ctrlr = ctrlr; - ctrlr->num_qpairs++; spdk_bit_array_set(ctrlr->qpair_mask, qpair->qid); TAILQ_INSERT_HEAD(&ctrlr->qpairs, qpair, link); @@ -163,7 +163,6 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem, req->qpair->ctrlr = ctrlr; TAILQ_INIT(&ctrlr->qpairs); - ctrlr->num_qpairs = 0; ctrlr->subsys = subsystem; ctrlr->qpair_mask = spdk_bit_array_create(tgt->opts.max_qpairs_per_ctrlr); @@ -221,7 +220,6 @@ spdk_nvmf_ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr) struct spdk_nvmf_qpair *qpair = TAILQ_FIRST(&ctrlr->qpairs); TAILQ_REMOVE(&ctrlr->qpairs, qpair, link); - ctrlr->num_qpairs--; spdk_bit_array_clear(ctrlr->qpair_mask, qpair->qid); spdk_nvmf_transport_qpair_fini(qpair); } @@ -449,17 +447,15 @@ _spdk_nvmf_ctrlr_remove_qpair(void *ctx) struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr; assert(ctrlr != NULL); - assert(ctrlr->num_qpairs > 0); TAILQ_REMOVE(&ctrlr->qpairs, qpair, link); - ctrlr->num_qpairs--; spdk_bit_array_clear(ctrlr->qpair_mask, qpair->qid); /* Send a message to the thread that owns the qpair and destroy it. */ qpair->ctrlr = NULL; spdk_thread_send_msg(qpair->group->thread, _spdk_nvmf_qpair_destroy, qpair); - if (ctrlr->num_qpairs == 0) { + if (spdk_bit_array_count_set(ctrlr->qpair_mask) == 0) { /* If this was the last queue pair on the controller, also send a message * to the subsystem to remove the controller. */ spdk_thread_send_msg(ctrlr->subsys->thread, _spdk_nvmf_ctrlr_free, ctrlr); @@ -972,7 +968,7 @@ spdk_nvmf_ctrlr_set_features_number_of_queues(struct spdk_nvmf_request *req) req->cmd->nvme_cmd.cdw11); /* verify that the contoller is ready to process commands */ - if (ctrlr->num_qpairs > 1) { + if (spdk_bit_array_count_set(ctrlr->qpair_mask) > 1) { SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Queue pairs already active!\n"); rsp->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR; } else { diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index 26398d1cb..244bb8a8a 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -203,7 +203,6 @@ struct spdk_nvmf_ctrlr { struct spdk_nvmf_qpair *admin_qpair; TAILQ_HEAD(, spdk_nvmf_qpair) qpairs; - int num_qpairs; struct spdk_bit_array *qpair_mask; struct spdk_nvmf_request *aer_req; diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index 0b6ee6ba6..d5fd7aa5a 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -459,7 +459,6 @@ test_connect(void) CU_ASSERT(nvme_status_success(&rsp.nvme_cpl.status)); CU_ASSERT(qpair.ctrlr == &ctrlr); qpair.ctrlr = NULL; - ctrlr.num_qpairs = 0; TAILQ_INIT(&ctrlr.qpairs); /* Non-existent controller */ @@ -524,13 +523,17 @@ test_connect(void) /* I/O connect with too many existing qpairs */ memset(&rsp, 0, sizeof(rsp)); - ctrlr.num_qpairs = 3; + spdk_bit_array_set(ctrlr.qpair_mask, 0); + spdk_bit_array_set(ctrlr.qpair_mask, 1); + spdk_bit_array_set(ctrlr.qpair_mask, 2); rc = spdk_nvmf_ctrlr_connect(&req); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_COMMAND_SPECIFIC); CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER); CU_ASSERT(qpair.ctrlr == NULL); - ctrlr.num_qpairs = 0; + spdk_bit_array_clear(ctrlr.qpair_mask, 0); + spdk_bit_array_clear(ctrlr.qpair_mask, 1); + spdk_bit_array_clear(ctrlr.qpair_mask, 2); /* I/O connect with duplicate queue ID */ memset(&rsp, 0, sizeof(rsp));