nvmf: Eliminate num_qpairs counter in controller struct
The qpair mask can be used instead. Change-Id: I9063e656c7c44663dc96adfd5ef52a5a1065d2ba Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/413860 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
parent
f08cea7169
commit
f4f839ecd3
@ -78,7 +78,8 @@ ctrlr_add_qpair_and_update_rsp(struct spdk_nvmf_qpair *qpair,
|
|||||||
struct spdk_nvmf_fabric_connect_rsp *rsp)
|
struct spdk_nvmf_fabric_connect_rsp *rsp)
|
||||||
{
|
{
|
||||||
if (qpair->qid >= spdk_bit_array_capacity(ctrlr->qpair_mask)) {
|
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.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
|
||||||
rsp->status.sc = SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER;
|
rsp->status.sc = SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER;
|
||||||
return;
|
return;
|
||||||
@ -93,7 +94,6 @@ ctrlr_add_qpair_and_update_rsp(struct spdk_nvmf_qpair *qpair,
|
|||||||
}
|
}
|
||||||
|
|
||||||
qpair->ctrlr = ctrlr;
|
qpair->ctrlr = ctrlr;
|
||||||
ctrlr->num_qpairs++;
|
|
||||||
spdk_bit_array_set(ctrlr->qpair_mask, qpair->qid);
|
spdk_bit_array_set(ctrlr->qpair_mask, qpair->qid);
|
||||||
TAILQ_INSERT_HEAD(&ctrlr->qpairs, qpair, link);
|
TAILQ_INSERT_HEAD(&ctrlr->qpairs, qpair, link);
|
||||||
|
|
||||||
@ -163,7 +163,6 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
|
|||||||
|
|
||||||
req->qpair->ctrlr = ctrlr;
|
req->qpair->ctrlr = ctrlr;
|
||||||
TAILQ_INIT(&ctrlr->qpairs);
|
TAILQ_INIT(&ctrlr->qpairs);
|
||||||
ctrlr->num_qpairs = 0;
|
|
||||||
ctrlr->subsys = subsystem;
|
ctrlr->subsys = subsystem;
|
||||||
|
|
||||||
ctrlr->qpair_mask = spdk_bit_array_create(tgt->opts.max_qpairs_per_ctrlr);
|
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);
|
struct spdk_nvmf_qpair *qpair = TAILQ_FIRST(&ctrlr->qpairs);
|
||||||
|
|
||||||
TAILQ_REMOVE(&ctrlr->qpairs, qpair, link);
|
TAILQ_REMOVE(&ctrlr->qpairs, qpair, link);
|
||||||
ctrlr->num_qpairs--;
|
|
||||||
spdk_bit_array_clear(ctrlr->qpair_mask, qpair->qid);
|
spdk_bit_array_clear(ctrlr->qpair_mask, qpair->qid);
|
||||||
spdk_nvmf_transport_qpair_fini(qpair);
|
spdk_nvmf_transport_qpair_fini(qpair);
|
||||||
}
|
}
|
||||||
@ -449,17 +447,15 @@ _spdk_nvmf_ctrlr_remove_qpair(void *ctx)
|
|||||||
struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr;
|
struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr;
|
||||||
|
|
||||||
assert(ctrlr != NULL);
|
assert(ctrlr != NULL);
|
||||||
assert(ctrlr->num_qpairs > 0);
|
|
||||||
|
|
||||||
TAILQ_REMOVE(&ctrlr->qpairs, qpair, link);
|
TAILQ_REMOVE(&ctrlr->qpairs, qpair, link);
|
||||||
ctrlr->num_qpairs--;
|
|
||||||
spdk_bit_array_clear(ctrlr->qpair_mask, qpair->qid);
|
spdk_bit_array_clear(ctrlr->qpair_mask, qpair->qid);
|
||||||
|
|
||||||
/* Send a message to the thread that owns the qpair and destroy it. */
|
/* Send a message to the thread that owns the qpair and destroy it. */
|
||||||
qpair->ctrlr = NULL;
|
qpair->ctrlr = NULL;
|
||||||
spdk_thread_send_msg(qpair->group->thread, _spdk_nvmf_qpair_destroy, qpair);
|
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
|
/* If this was the last queue pair on the controller, also send a message
|
||||||
* to the subsystem to remove the controller. */
|
* to the subsystem to remove the controller. */
|
||||||
spdk_thread_send_msg(ctrlr->subsys->thread, _spdk_nvmf_ctrlr_free, ctrlr);
|
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);
|
req->cmd->nvme_cmd.cdw11);
|
||||||
|
|
||||||
/* verify that the contoller is ready to process commands */
|
/* 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");
|
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Queue pairs already active!\n");
|
||||||
rsp->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
|
rsp->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
|
||||||
} else {
|
} else {
|
||||||
|
@ -203,7 +203,6 @@ struct spdk_nvmf_ctrlr {
|
|||||||
struct spdk_nvmf_qpair *admin_qpair;
|
struct spdk_nvmf_qpair *admin_qpair;
|
||||||
|
|
||||||
TAILQ_HEAD(, spdk_nvmf_qpair) qpairs;
|
TAILQ_HEAD(, spdk_nvmf_qpair) qpairs;
|
||||||
int num_qpairs;
|
|
||||||
struct spdk_bit_array *qpair_mask;
|
struct spdk_bit_array *qpair_mask;
|
||||||
|
|
||||||
struct spdk_nvmf_request *aer_req;
|
struct spdk_nvmf_request *aer_req;
|
||||||
|
@ -459,7 +459,6 @@ test_connect(void)
|
|||||||
CU_ASSERT(nvme_status_success(&rsp.nvme_cpl.status));
|
CU_ASSERT(nvme_status_success(&rsp.nvme_cpl.status));
|
||||||
CU_ASSERT(qpair.ctrlr == &ctrlr);
|
CU_ASSERT(qpair.ctrlr == &ctrlr);
|
||||||
qpair.ctrlr = NULL;
|
qpair.ctrlr = NULL;
|
||||||
ctrlr.num_qpairs = 0;
|
|
||||||
TAILQ_INIT(&ctrlr.qpairs);
|
TAILQ_INIT(&ctrlr.qpairs);
|
||||||
|
|
||||||
/* Non-existent controller */
|
/* Non-existent controller */
|
||||||
@ -524,13 +523,17 @@ test_connect(void)
|
|||||||
|
|
||||||
/* I/O connect with too many existing qpairs */
|
/* I/O connect with too many existing qpairs */
|
||||||
memset(&rsp, 0, sizeof(rsp));
|
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);
|
rc = spdk_nvmf_ctrlr_connect(&req);
|
||||||
CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS);
|
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.sct == SPDK_NVME_SCT_COMMAND_SPECIFIC);
|
||||||
CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER);
|
CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER);
|
||||||
CU_ASSERT(qpair.ctrlr == NULL);
|
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 */
|
/* I/O connect with duplicate queue ID */
|
||||||
memset(&rsp, 0, sizeof(rsp));
|
memset(&rsp, 0, sizeof(rsp));
|
||||||
|
Loading…
Reference in New Issue
Block a user