nvme/ctrlr: Remove Get Num Queues initialization step

NVMe specification in ch.7.6 "Controller Initialization" suggests to
use only Set Features "Number of queues" command and says nothing
about Get Features. All required information is available after Set
Num Queues step.

Fixes #1270

Signed-off-by: Evgeniy Kochetov <evgeniik@mellanox.com>
Change-Id: Ide38ba9c7f063f1d6b13bfce4232c588cc906784
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1271
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Evgeniy Kochetov 2020-03-14 16:38:06 +00:00 committed by Tomasz Zawadzki
parent 046bdc4abb
commit 2ca711694e
3 changed files with 32 additions and 74 deletions

View File

@ -903,10 +903,6 @@ nvme_ctrlr_state_string(enum nvme_ctrlr_state state)
return "set number of queues";
case NVME_CTRLR_STATE_WAIT_FOR_SET_NUM_QUEUES:
return "wait for set number of queues";
case NVME_CTRLR_STATE_GET_NUM_QUEUES:
return "get number of queues";
case NVME_CTRLR_STATE_WAIT_FOR_GET_NUM_QUEUES:
return "wait for get number of queues";
case NVME_CTRLR_STATE_CONSTRUCT_NS:
return "construct namespaces";
case NVME_CTRLR_STATE_IDENTIFY_ACTIVE_NS:
@ -1522,18 +1518,6 @@ nvme_ctrlr_identify_id_desc_namespaces(struct spdk_nvme_ctrlr *ctrlr)
return rc;
}
static void
nvme_ctrlr_set_num_queues_done(void *arg, const struct spdk_nvme_cpl *cpl)
{
struct spdk_nvme_ctrlr *ctrlr = (struct spdk_nvme_ctrlr *)arg;
if (spdk_nvme_cpl_is_error(cpl)) {
SPDK_ERRLOG("Set Features - Number of Queues failed!\n");
}
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_GET_NUM_QUEUES,
ctrlr->opts.admin_timeout_ms);
}
static void
nvme_ctrlr_update_nvmf_ioccsz(struct spdk_nvme_ctrlr *ctrlr)
{
@ -1551,41 +1535,14 @@ nvme_ctrlr_update_nvmf_ioccsz(struct spdk_nvme_ctrlr *ctrlr)
}
}
static int
nvme_ctrlr_set_num_queues(struct spdk_nvme_ctrlr *ctrlr)
{
int rc;
if (ctrlr->opts.num_io_queues > SPDK_NVME_MAX_IO_QUEUES) {
SPDK_NOTICELOG("Limiting requested num_io_queues %u to max %d\n",
ctrlr->opts.num_io_queues, SPDK_NVME_MAX_IO_QUEUES);
ctrlr->opts.num_io_queues = SPDK_NVME_MAX_IO_QUEUES;
} else if (ctrlr->opts.num_io_queues < 1) {
SPDK_NOTICELOG("Requested num_io_queues 0, increasing to 1\n");
ctrlr->opts.num_io_queues = 1;
}
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_WAIT_FOR_SET_NUM_QUEUES,
ctrlr->opts.admin_timeout_ms);
rc = nvme_ctrlr_cmd_set_num_queues(ctrlr, ctrlr->opts.num_io_queues,
nvme_ctrlr_set_num_queues_done, ctrlr);
if (rc != 0) {
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_ERROR, NVME_TIMEOUT_INFINITE);
return rc;
}
return 0;
}
static void
nvme_ctrlr_get_num_queues_done(void *arg, const struct spdk_nvme_cpl *cpl)
nvme_ctrlr_set_num_queues_done(void *arg, const struct spdk_nvme_cpl *cpl)
{
uint32_t cq_allocated, sq_allocated, min_allocated, i;
struct spdk_nvme_ctrlr *ctrlr = (struct spdk_nvme_ctrlr *)arg;
if (spdk_nvme_cpl_is_error(cpl)) {
SPDK_ERRLOG("Get Features - Number of Queues failed!\n");
SPDK_ERRLOG("Set Features - Number of Queues failed!\n");
ctrlr->opts.num_io_queues = 0;
} else {
/*
@ -1622,15 +1579,24 @@ nvme_ctrlr_get_num_queues_done(void *arg, const struct spdk_nvme_cpl *cpl)
}
static int
nvme_ctrlr_get_num_queues(struct spdk_nvme_ctrlr *ctrlr)
nvme_ctrlr_set_num_queues(struct spdk_nvme_ctrlr *ctrlr)
{
int rc;
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_WAIT_FOR_GET_NUM_QUEUES,
if (ctrlr->opts.num_io_queues > SPDK_NVME_MAX_IO_QUEUES) {
SPDK_NOTICELOG("Limiting requested num_io_queues %u to max %d\n",
ctrlr->opts.num_io_queues, SPDK_NVME_MAX_IO_QUEUES);
ctrlr->opts.num_io_queues = SPDK_NVME_MAX_IO_QUEUES;
} else if (ctrlr->opts.num_io_queues < 1) {
SPDK_NOTICELOG("Requested num_io_queues 0, increasing to 1\n");
ctrlr->opts.num_io_queues = 1;
}
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_WAIT_FOR_SET_NUM_QUEUES,
ctrlr->opts.admin_timeout_ms);
/* Obtain the number of queues allocated using Get Features. */
rc = nvme_ctrlr_cmd_get_num_queues(ctrlr, nvme_ctrlr_get_num_queues_done, ctrlr);
rc = nvme_ctrlr_cmd_set_num_queues(ctrlr, ctrlr->opts.num_io_queues,
nvme_ctrlr_set_num_queues_done, ctrlr);
if (rc != 0) {
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_ERROR, NVME_TIMEOUT_INFINITE);
return rc;
@ -2452,14 +2418,6 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr)
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
break;
case NVME_CTRLR_STATE_GET_NUM_QUEUES:
rc = nvme_ctrlr_get_num_queues(ctrlr);
break;
case NVME_CTRLR_STATE_WAIT_FOR_GET_NUM_QUEUES:
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
break;
case NVME_CTRLR_STATE_CONSTRUCT_NS:
rc = nvme_ctrlr_construct_namespaces(ctrlr);
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_IDENTIFY_ACTIVE_NS,

View File

@ -492,16 +492,6 @@ enum nvme_ctrlr_state {
*/
NVME_CTRLR_STATE_WAIT_FOR_SET_NUM_QUEUES,
/**
* Get Number of Queues of the controller.
*/
NVME_CTRLR_STATE_GET_NUM_QUEUES,
/**
* Waiting for Get Num of Queues command to be completed.
*/
NVME_CTRLR_STATE_WAIT_FOR_GET_NUM_QUEUES,
/**
* Construct Namespace data structures of the controller.
*/

View File

@ -362,8 +362,8 @@ int
nvme_ctrlr_cmd_get_num_queues(struct spdk_nvme_ctrlr *ctrlr,
spdk_nvme_cmd_cb cb_fn, void *cb_arg)
{
fake_cpl_success(cb_fn, cb_arg);
return 0;
CU_ASSERT(0);
return -1;
}
int
@ -1982,11 +1982,13 @@ test_nvme_ctrlr_init_set_nvmf_ioccsz(void)
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_SET_NUM_QUEUES);
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_GET_NUM_QUEUES);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_CONSTRUCT_NS);
CU_ASSERT(ctrlr.ioccsz_bytes == 0);
CU_ASSERT(ctrlr.icdoff == 0);
nvme_ctrlr_destruct(&ctrlr);
/* Check RDMA trtype, */
ctrlr.trid.trtype = SPDK_NVME_TRANSPORT_RDMA;
@ -1994,13 +1996,15 @@ test_nvme_ctrlr_init_set_nvmf_ioccsz(void)
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_SET_NUM_QUEUES);
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_GET_NUM_QUEUES);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_CONSTRUCT_NS);
CU_ASSERT(ctrlr.ioccsz_bytes == 4096);
CU_ASSERT(ctrlr.icdoff == 1);
ctrlr.ioccsz_bytes = 0;
ctrlr.icdoff = 0;
nvme_ctrlr_destruct(&ctrlr);
/* Check TCP trtype, */
ctrlr.trid.trtype = SPDK_NVME_TRANSPORT_TCP;
@ -2008,13 +2012,15 @@ test_nvme_ctrlr_init_set_nvmf_ioccsz(void)
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_SET_NUM_QUEUES);
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_GET_NUM_QUEUES);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_CONSTRUCT_NS);
CU_ASSERT(ctrlr.ioccsz_bytes == 4096);
CU_ASSERT(ctrlr.icdoff == 1);
ctrlr.ioccsz_bytes = 0;
ctrlr.icdoff = 0;
nvme_ctrlr_destruct(&ctrlr);
/* Check FC trtype, */
ctrlr.trid.trtype = SPDK_NVME_TRANSPORT_FC;
@ -2022,13 +2028,15 @@ test_nvme_ctrlr_init_set_nvmf_ioccsz(void)
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_SET_NUM_QUEUES);
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_GET_NUM_QUEUES);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_CONSTRUCT_NS);
CU_ASSERT(ctrlr.ioccsz_bytes == 4096);
CU_ASSERT(ctrlr.icdoff == 1);
ctrlr.ioccsz_bytes = 0;
ctrlr.icdoff = 0;
nvme_ctrlr_destruct(&ctrlr);
/* Check CUSTOM trtype, */
ctrlr.trid.trtype = SPDK_NVME_TRANSPORT_CUSTOM;
@ -2036,10 +2044,12 @@ test_nvme_ctrlr_init_set_nvmf_ioccsz(void)
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_SET_NUM_QUEUES);
CU_ASSERT(nvme_ctrlr_process_init(&ctrlr) == 0);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_GET_NUM_QUEUES);
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_CONSTRUCT_NS);
CU_ASSERT(ctrlr.ioccsz_bytes == 0);
CU_ASSERT(ctrlr.icdoff == 0);
nvme_ctrlr_destruct(&ctrlr);
}
int main(int argc, char **argv)