nvmf: use Set/Get Features structure types

No functionality change, just a cleanup.  This will help with future
simplification patches.

Change-Id: Id2efd851ed0add664e516725ab98b5e1f8cafff5
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/403900
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Daniel Verkamp 2018-03-14 16:46:16 -07:00 committed by Jim Harris
parent 50d738b447
commit 0f56183728
2 changed files with 36 additions and 27 deletions

View File

@ -146,12 +146,18 @@ 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->kato = connect_cmd->kato;
ctrlr->async_event_config.raw = 0;
ctrlr->num_qpairs = 0; ctrlr->num_qpairs = 0;
ctrlr->subsys = subsystem; ctrlr->subsys = subsystem;
ctrlr->max_qpairs_allowed = tgt->opts.max_qpairs_per_ctrlr; ctrlr->max_qpairs_allowed = tgt->opts.max_qpairs_per_ctrlr;
ctrlr->feat.keep_alive_timer.bits.kato = connect_cmd->kato;
ctrlr->feat.volatile_write_cache.bits.wce = 1;
/* Subtract 1 for admin queue, 1 for 0's based */
ctrlr->feat.number_of_queues.bits.ncqr = ctrlr->max_qpairs_allowed - 1 - 1;
ctrlr->feat.number_of_queues.bits.nsqr = ctrlr->max_qpairs_allowed - 1 - 1;
memcpy(ctrlr->hostid, connect_data->hostid, sizeof(ctrlr->hostid)); memcpy(ctrlr->hostid, connect_data->hostid, sizeof(ctrlr->hostid));
ctrlr->vcprop.cap.raw = 0; ctrlr->vcprop.cap.raw = 0;
@ -687,9 +693,12 @@ spdk_nvmf_ctrlr_get_features_host_identifier(struct spdk_nvmf_request *req)
struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr; struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr;
struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd; struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl; struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
union spdk_nvme_feat_host_identifier opts;
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Host Identifier\n"); SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Host Identifier\n");
if (!(cmd->cdw11 & 1)) {
opts.raw = cmd->cdw11;
if (!opts.bits.exhid) {
/* NVMe over Fabrics requires EXHID=1 (128-bit/16-byte host ID) */ /* NVMe over Fabrics requires EXHID=1 (128-bit/16-byte host ID) */
SPDK_ERRLOG("Get Features - Host Identifier with EXHID=0 not allowed\n"); SPDK_ERRLOG("Get Features - Host Identifier with EXHID=0 not allowed\n");
response->status.sc = SPDK_NVME_SC_INVALID_FIELD; response->status.sc = SPDK_NVME_SC_INVALID_FIELD;
@ -718,12 +727,13 @@ spdk_nvmf_ctrlr_set_features_keep_alive_timer(struct spdk_nvmf_request *req)
if (cmd->cdw11 == 0) { if (cmd->cdw11 == 0) {
rsp->status.sc = SPDK_NVME_SC_KEEP_ALIVE_INVALID; rsp->status.sc = SPDK_NVME_SC_KEEP_ALIVE_INVALID;
} else if (cmd->cdw11 < MIN_KEEP_ALIVE_TIMEOUT) { } else if (cmd->cdw11 < MIN_KEEP_ALIVE_TIMEOUT) {
ctrlr->kato = MIN_KEEP_ALIVE_TIMEOUT; ctrlr->feat.keep_alive_timer.bits.kato = MIN_KEEP_ALIVE_TIMEOUT;
} else { } else {
ctrlr->kato = cmd->cdw11; ctrlr->feat.keep_alive_timer.bits.kato = cmd->cdw11;
} }
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Set Features - Keep Alive Timer set to %u ms\n", ctrlr->kato); SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Set Features - Keep Alive Timer set to %u ms\n",
ctrlr->feat.keep_alive_timer.bits.kato);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }
@ -735,7 +745,7 @@ spdk_nvmf_ctrlr_get_features_keep_alive_timer(struct spdk_nvmf_request *req)
struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Keep Alive Timer\n"); SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Keep Alive Timer\n");
rsp->cdw0 = ctrlr->kato; rsp->cdw0 = ctrlr->feat.keep_alive_timer.bits.kato;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }
@ -744,22 +754,20 @@ spdk_nvmf_ctrlr_set_features_number_of_queues(struct spdk_nvmf_request *req)
{ {
struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr; struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr;
struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
uint32_t nr_io_queues;
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Set Features - Number of Queues, cdw11 0x%x\n", SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Set Features - Number of Queues, cdw11 0x%x\n",
req->cmd->nvme_cmd.cdw11); req->cmd->nvme_cmd.cdw11);
/* Extra 1 connection for Admin queue */
nr_io_queues = ctrlr->max_qpairs_allowed - 1;
/* verify that the contoller is ready to process commands */ /* verify that the contoller is ready to process commands */
if (ctrlr->num_qpairs > 1) { if (ctrlr->num_qpairs > 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 {
/* Number of IO queues has a zero based value */ /*
rsp->cdw0 = ((nr_io_queues - 1) << 16) | * Ignore the value requested by the host -
(nr_io_queues - 1); * always return the pre-configured value based on max_qpairs_allowed.
*/
rsp->cdw0 = ctrlr->feat.number_of_queues.raw;
} }
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
@ -770,26 +778,20 @@ spdk_nvmf_ctrlr_get_features_number_of_queues(struct spdk_nvmf_request *req)
{ {
struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr; struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr;
struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
uint32_t nr_io_queues;
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Number of Queues\n"); SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Number of Queues\n");
rsp->cdw0 = ctrlr->feat.number_of_queues.raw;
nr_io_queues = ctrlr->max_qpairs_allowed - 1;
/* Number of IO queues has a zero based value */
rsp->cdw0 = ((nr_io_queues - 1) << 16) |
(nr_io_queues - 1);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }
static int static int
spdk_nvmf_ctrlr_get_features_write_cache(struct spdk_nvmf_request *req) spdk_nvmf_ctrlr_get_features_write_cache(struct spdk_nvmf_request *req)
{ {
struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr;
struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Write Cache\n"); SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Write Cache\n");
rsp->cdw0 = 1; rsp->cdw0 = ctrlr->feat.volatile_write_cache.raw;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }
@ -801,7 +803,7 @@ spdk_nvmf_ctrlr_set_features_async_event_configuration(struct spdk_nvmf_request
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Set Features - Async Event Configuration, cdw11 0x%08x\n", SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Set Features - Async Event Configuration, cdw11 0x%08x\n",
cmd->cdw11); cmd->cdw11);
ctrlr->async_event_config.raw = cmd->cdw11; ctrlr->feat.async_event_configuration.raw = cmd->cdw11;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }
@ -812,7 +814,7 @@ spdk_nvmf_ctrlr_get_features_async_event_configuration(struct spdk_nvmf_request
struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Async Event Configuration\n"); SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Get Features - Async Event Configuration\n");
rsp->cdw0 = ctrlr->async_event_config.raw; rsp->cdw0 = ctrlr->feat.async_event_configuration.raw;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }

View File

@ -153,6 +153,13 @@ struct spdk_nvmf_qpair {
TAILQ_ENTRY(spdk_nvmf_qpair) link; TAILQ_ENTRY(spdk_nvmf_qpair) link;
}; };
struct spdk_nvmf_ctrlr_feat {
union spdk_nvme_feat_volatile_write_cache volatile_write_cache;
union spdk_nvme_feat_number_of_queues number_of_queues;
union spdk_nvme_feat_async_event_configuration async_event_configuration;
union spdk_nvme_feat_keep_alive_timer keep_alive_timer;
};
/* /*
* This structure represents an NVMe-oF controller, * This structure represents an NVMe-oF controller,
* which is like a "session" in networking terms. * which is like a "session" in networking terms.
@ -168,12 +175,12 @@ struct spdk_nvmf_ctrlr {
union spdk_nvme_csts_register csts; union spdk_nvme_csts_register csts;
} vcprop; /* virtual controller properties */ } vcprop; /* virtual controller properties */
struct spdk_nvmf_ctrlr_feat feat;
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; int num_qpairs;
int max_qpairs_allowed; int max_qpairs_allowed;
uint32_t kato;
union spdk_nvme_async_event_config async_event_config;
struct spdk_nvmf_request *aer_req; struct spdk_nvmf_request *aer_req;
uint8_t hostid[16]; uint8_t hostid[16];