nvmf/ctrlr: introduce request exec backdoor

It allows to property set (e.g. cc) when subsystem and qpair are not
active.

Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com>
Change-Id: I0b0d150fbdac5bdf0d20762337f0a811f4d6d243
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/481494
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Alexey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Jacek Kalwas 2020-01-13 12:44:09 +01:00 committed by Tomasz Zawadzki
parent fcca8ea6a9
commit aaa9630aeb
2 changed files with 46 additions and 19 deletions

View File

@ -2748,15 +2748,56 @@ nvmf_trace_command(union nvmf_h2c_msg *h2c_msg, bool is_admin_queue)
}
}
static void
_nvmf_request_exec(struct spdk_nvmf_request *req,
struct spdk_nvmf_subsystem_poll_group *sgroup)
{
struct spdk_nvmf_qpair *qpair = req->qpair;
spdk_nvmf_request_exec_status status;
nvmf_trace_command(req->cmd, spdk_nvmf_qpair_is_admin_queue(qpair));
if (sgroup) {
sgroup->io_outstanding++;
}
/* Place the request on the outstanding list so we can keep track of it */
TAILQ_INSERT_TAIL(&qpair->outstanding, req, link);
if (spdk_unlikely(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC)) {
status = spdk_nvmf_ctrlr_process_fabrics_cmd(req);
} else if (spdk_unlikely(spdk_nvmf_qpair_is_admin_queue(qpair))) {
status = spdk_nvmf_ctrlr_process_admin_cmd(req);
} else {
status = spdk_nvmf_ctrlr_process_io_cmd(req);
}
if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) {
spdk_nvmf_request_complete(req);
}
}
void
spdk_nvmf_request_exec_fabrics(struct spdk_nvmf_request *req)
{
struct spdk_nvmf_qpair *qpair = req->qpair;
struct spdk_nvmf_subsystem_poll_group *sgroup = NULL;
assert(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC);
if (qpair->ctrlr) {
sgroup = &qpair->group->sgroups[qpair->ctrlr->subsys->id];
}
_nvmf_request_exec(req, sgroup);
}
void
spdk_nvmf_request_exec(struct spdk_nvmf_request *req)
{
struct spdk_nvmf_qpair *qpair = req->qpair;
spdk_nvmf_request_exec_status status;
struct spdk_nvmf_subsystem_poll_group *sgroup = NULL;
nvmf_trace_command(req->cmd, spdk_nvmf_qpair_is_admin_queue(qpair));
if (qpair->ctrlr) {
sgroup = &qpair->group->sgroups[qpair->ctrlr->subsys->id];
}
@ -2781,24 +2822,9 @@ spdk_nvmf_request_exec(struct spdk_nvmf_request *req)
TAILQ_INSERT_TAIL(&sgroup->queued, req, link);
return;
}
sgroup->io_outstanding++;
}
/* Place the request on the outstanding list so we can keep track of it */
TAILQ_INSERT_TAIL(&qpair->outstanding, req, link);
if (spdk_unlikely(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC)) {
status = spdk_nvmf_ctrlr_process_fabrics_cmd(req);
} else if (spdk_unlikely(spdk_nvmf_qpair_is_admin_queue(qpair))) {
status = spdk_nvmf_ctrlr_process_admin_cmd(req);
} else {
status = spdk_nvmf_ctrlr_process_io_cmd(req);
}
if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) {
spdk_nvmf_request_complete(req);
}
_nvmf_request_exec(req, sgroup);
}
static bool

View File

@ -387,6 +387,7 @@ void spdk_nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group,
void spdk_nvmf_poll_group_resume_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem, spdk_nvmf_poll_group_mod_done cb_fn, void *cb_arg);
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req);
void spdk_nvmf_request_exec_fabrics(struct spdk_nvmf_request *req);
int spdk_nvmf_request_free(struct spdk_nvmf_request *req);
int spdk_nvmf_request_complete(struct spdk_nvmf_request *req);