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:
parent
55c39cd008
commit
315d47da4b
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user