nvme: modify not to retry IOs on reset (#33)

When a controller reset is finished, all outstanding IOs and all queued
IOs which submitted before the reset are returned to the caller.
This commit is contained in:
Tsuyoshi Uchida 2016-08-15 10:01:02 -07:00 committed by Daniel Verkamp
parent 9dfc65b081
commit 81976ebd55
2 changed files with 18 additions and 32 deletions

View File

@ -251,7 +251,6 @@ nvme_completion_is_retry(const struct spdk_nvme_cpl *cpl)
switch ((int)cpl->status.sct) { switch ((int)cpl->status.sct) {
case SPDK_NVME_SCT_GENERIC: case SPDK_NVME_SCT_GENERIC:
switch ((int)cpl->status.sc) { switch ((int)cpl->status.sc) {
case SPDK_NVME_SC_ABORTED_BY_REQUEST:
case SPDK_NVME_SC_NAMESPACE_NOT_READY: case SPDK_NVME_SC_NAMESPACE_NOT_READY:
if (cpl->status.dnr) { if (cpl->status.dnr) {
return false; return false;
@ -264,6 +263,7 @@ nvme_completion_is_retry(const struct spdk_nvme_cpl *cpl)
case SPDK_NVME_SC_DATA_TRANSFER_ERROR: case SPDK_NVME_SC_DATA_TRANSFER_ERROR:
case SPDK_NVME_SC_ABORTED_POWER_LOSS: case SPDK_NVME_SC_ABORTED_POWER_LOSS:
case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR: case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR:
case SPDK_NVME_SC_ABORTED_BY_REQUEST:
case SPDK_NVME_SC_ABORTED_SQ_DELETION: case SPDK_NVME_SC_ABORTED_SQ_DELETION:
case SPDK_NVME_SC_ABORTED_FAILED_FUSED: case SPDK_NVME_SC_ABORTED_FAILED_FUSED:
case SPDK_NVME_SC_ABORTED_MISSING_FUSED: case SPDK_NVME_SC_ABORTED_MISSING_FUSED:
@ -640,13 +640,6 @@ _nvme_fail_request_bad_vtophys(struct spdk_nvme_qpair *qpair, struct nvme_tracke
1 /* do not retry */, true); 1 /* do not retry */, true);
} }
static void
_nvme_fail_request_ctrlr_failed(struct spdk_nvme_qpair *qpair, struct nvme_request *req)
{
nvme_qpair_manual_complete_request(qpair, req, SPDK_NVME_SCT_GENERIC,
SPDK_NVME_SC_ABORTED_BY_REQUEST, true);
}
/** /**
* Build PRP list describing physically contiguous payload buffer. * Build PRP list describing physically contiguous payload buffer.
*/ */
@ -991,37 +984,27 @@ _nvme_admin_qpair_enable(struct spdk_nvme_qpair *qpair)
static void static void
_nvme_io_qpair_enable(struct spdk_nvme_qpair *qpair) _nvme_io_qpair_enable(struct spdk_nvme_qpair *qpair)
{ {
STAILQ_HEAD(, nvme_request) temp;
struct nvme_tracker *tr; struct nvme_tracker *tr;
struct nvme_tracker *tr_temp; struct nvme_tracker *temp;
struct nvme_request *req; struct nvme_request *req;
qpair->is_enabled = true; qpair->is_enabled = true;
/*
* Manually abort each outstanding I/O. This normally results in a /* Manually abort each queued I/O. */
* retry, unless the retry count on the associated request has while (!STAILQ_EMPTY(&qpair->queued_req)) {
* reached its limit. req = STAILQ_FIRST(&qpair->queued_req);
*/ STAILQ_REMOVE_HEAD(&qpair->queued_req, stailq);
LIST_FOREACH_SAFE(tr, &qpair->outstanding_tr, list, tr_temp) { nvme_printf(qpair->ctrlr, "aborting queued i/o\n");
nvme_qpair_manual_complete_request(qpair, req, SPDK_NVME_SCT_GENERIC,
SPDK_NVME_SC_ABORTED_BY_REQUEST, true);
}
/* Manually abort each outstanding I/O. */
LIST_FOREACH_SAFE(tr, &qpair->outstanding_tr, list, temp) {
nvme_printf(qpair->ctrlr, "aborting outstanding i/o\n"); nvme_printf(qpair->ctrlr, "aborting outstanding i/o\n");
nvme_qpair_manual_complete_tracker(qpair, tr, SPDK_NVME_SCT_GENERIC, nvme_qpair_manual_complete_tracker(qpair, tr, SPDK_NVME_SCT_GENERIC,
SPDK_NVME_SC_ABORTED_BY_REQUEST, 0, true); SPDK_NVME_SC_ABORTED_BY_REQUEST, 0, true);
} }
STAILQ_INIT(&temp);
STAILQ_SWAP(&qpair->queued_req, &temp, nvme_request);
while (!STAILQ_EMPTY(&temp)) {
req = STAILQ_FIRST(&temp);
STAILQ_REMOVE_HEAD(&temp, stailq);
nvme_printf(qpair->ctrlr, "resubmitting queued i/o\n");
nvme_qpair_print_command(qpair, &req->cmd);
if (nvme_qpair_submit_request(qpair, req) != 0) {
_nvme_fail_request_ctrlr_failed(qpair, req);
}
}
} }
void void

View File

@ -668,7 +668,7 @@ static void test_nvme_completion_is_retry(void)
struct spdk_nvme_cpl cpl = {}; struct spdk_nvme_cpl cpl = {};
cpl.status.sct = SPDK_NVME_SCT_GENERIC; cpl.status.sct = SPDK_NVME_SCT_GENERIC;
cpl.status.sc = SPDK_NVME_SC_ABORTED_BY_REQUEST; cpl.status.sc = SPDK_NVME_SC_NAMESPACE_NOT_READY;
cpl.status.dnr = 0; cpl.status.dnr = 0;
CU_ASSERT_TRUE(nvme_completion_is_retry(&cpl)); CU_ASSERT_TRUE(nvme_completion_is_retry(&cpl));
@ -690,6 +690,9 @@ static void test_nvme_completion_is_retry(void)
cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
CU_ASSERT_FALSE(nvme_completion_is_retry(&cpl)); CU_ASSERT_FALSE(nvme_completion_is_retry(&cpl));
cpl.status.sc = SPDK_NVME_SC_ABORTED_BY_REQUEST;
CU_ASSERT_FALSE(nvme_completion_is_retry(&cpl));
cpl.status.sc = SPDK_NVME_SC_ABORTED_FAILED_FUSED; cpl.status.sc = SPDK_NVME_SC_ABORTED_FAILED_FUSED;
CU_ASSERT_FALSE(nvme_completion_is_retry(&cpl)); CU_ASSERT_FALSE(nvme_completion_is_retry(&cpl));