lib/nvmf: Clean up abort AER request operation

Include completion operation into nvmf_qpair_abort() and rename
it by nvmf_qpair_abort_aer() for clarification. Update unit test
accordingly.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I763cc7d24b979e27e8775f4e69730466a2351bdf
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2712
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Shuhei Matsumoto 2020-06-01 12:52:51 +09:00 committed by Tomasz Zawadzki
parent 55c39cd008
commit 315d47da4b
2 changed files with 37 additions and 32 deletions

View File

@ -2050,34 +2050,40 @@ invalid_cns:
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
static struct spdk_nvmf_request *
nvmf_qpair_abort(struct spdk_nvmf_qpair *qpair, uint16_t cid)
static bool
nvmf_qpair_abort_aer(struct spdk_nvmf_qpair *qpair, uint16_t cid)
{
struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr;
struct spdk_nvmf_request *req = NULL;
struct spdk_nvmf_request *req;
int i;
if (nvmf_qpair_is_admin_queue(qpair)) {
for (i = 0; i < ctrlr->nr_aer_reqs; i++) {
if (ctrlr->aer_req[i]->cmd->nvme_cmd.cid == cid) {
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Aborting AER request\n");
req = ctrlr->aer_req[i];
ctrlr->aer_req[i] = NULL;
ctrlr->nr_aer_reqs--;
break;
}
}
if (!nvmf_qpair_is_admin_queue(qpair)) {
return false;
}
/* Move the last req to the aborting position for making aer_reqs in continuous */
if (i < ctrlr->nr_aer_reqs) {
ctrlr->aer_req[i] = ctrlr->aer_req[ctrlr->nr_aer_reqs];
ctrlr->aer_req[ctrlr->nr_aer_reqs] = NULL;
for (i = 0; i < ctrlr->nr_aer_reqs; i++) {
if (ctrlr->aer_req[i]->cmd->nvme_cmd.cid == cid) {
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Aborting AER request\n");
req = ctrlr->aer_req[i];
ctrlr->aer_req[i] = NULL;
ctrlr->nr_aer_reqs--;
/* Move the last req to the aborting position for making aer_reqs
* in continuous
*/
if (i < ctrlr->nr_aer_reqs) {
ctrlr->aer_req[i] = ctrlr->aer_req[ctrlr->nr_aer_reqs];
ctrlr->aer_req[ctrlr->nr_aer_reqs] = NULL;
}
req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC;
req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_ABORTED_BY_REQUEST;
_nvmf_request_complete(req);
return true;
}
}
/* TODO: track list of outstanding requests in qpair? */
return req;
return false;
}
static void
@ -2101,13 +2107,12 @@ nvmf_ctrlr_abort_on_pg(struct spdk_io_channel_iter *i)
TAILQ_FOREACH(qpair, &group->qpairs, link) {
if (qpair->ctrlr == req->qpair->ctrlr && qpair->qid == sqid) {
struct spdk_nvmf_request *req_to_abort;
uint16_t cid = cmd->cdw10_bits.abort.cid;
/* Found the qpair */
req_to_abort = nvmf_qpair_abort(qpair, cid);
if (req_to_abort == NULL) {
if (!nvmf_qpair_abort_aer(qpair, cid)) {
/* TODO: track list of outstanding requests in qpair? */
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "cid %u not found\n", cid);
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
rsp->status.sc = SPDK_NVME_SC_INVALID_FIELD;
@ -2115,13 +2120,8 @@ nvmf_ctrlr_abort_on_pg(struct spdk_io_channel_iter *i)
return;
}
/* Complete the request with aborted status */
req_to_abort->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC;
req_to_abort->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_ABORTED_BY_REQUEST;
_nvmf_request_complete(req_to_abort);
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "abort ctrlr=%p req=%p sqid=%u cid=%u successful\n",
qpair->ctrlr, req_to_abort, sqid, cid);
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "abort ctrlr=%p sqid=%u cid=%u successful\n",
qpair->ctrlr, sqid, cid);
rsp->cdw0 = 0; /* Command successfully aborted */
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
rsp->status.sc = SPDK_NVME_SC_SUCCESS;

View File

@ -1619,6 +1619,7 @@ test_multi_async_event_reqs(void)
qpair.ctrlr = &ctrlr;
qpair.group = &group;
TAILQ_INIT(&qpair.outstanding);
ctrlr.subsys = &subsystem;
ctrlr.vcprop.cc.bits.en = 1;
@ -1631,6 +1632,7 @@ test_multi_async_event_reqs(void)
req[i].qpair = &qpair;
req[i].cmd = &cmd[i];
req[i].rsp = &rsp[i];
TAILQ_INSERT_TAIL(&qpair.outstanding, &req[i], link);
}
/* Target can store NVMF_MAX_ASYNC_EVENTS reqs */
@ -1648,16 +1650,19 @@ test_multi_async_event_reqs(void)
CU_ASSERT(rsp[4].nvme_cpl.status.sc = SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED);
/* Test if the aer_reqs keep continuous when abort a req in the middle */
CU_ASSERT(nvmf_qpair_abort(&qpair, 2) == &req[2]);
CU_ASSERT(nvmf_qpair_abort_aer(&qpair, 2) == true);
CU_ASSERT(ctrlr.aer_req[0] == &req[0]);
CU_ASSERT(ctrlr.aer_req[1] == &req[1]);
CU_ASSERT(ctrlr.aer_req[2] == &req[3]);
CU_ASSERT(nvmf_qpair_abort(&qpair, 3) == &req[3]);
CU_ASSERT(nvmf_qpair_abort_aer(&qpair, 3) == true);
CU_ASSERT(ctrlr.aer_req[0] == &req[0]);
CU_ASSERT(ctrlr.aer_req[1] == &req[1]);
CU_ASSERT(ctrlr.aer_req[2] == NULL);
CU_ASSERT(ctrlr.nr_aer_reqs == 2);
TAILQ_REMOVE(&qpair.outstanding, &req[0], link);
TAILQ_REMOVE(&qpair.outstanding, &req[1], link);
}
int main(int argc, char **argv)