From 77290bfe6b4c95922940d5ba36d41cfce7fd4c25 Mon Sep 17 00:00:00 2001 From: JinYu Date: Thu, 13 Jun 2019 00:24:33 +0800 Subject: [PATCH] nvme: fix the endless loop of aborting trackers The completion cb of outstanding_tr may submit new requeset to the outstanding_tr list of the qpair, it's an endless loop. We only abort the remaining outstanding trackers. Fix #819 Change-Id: I342f52f4d1836f8ef620ef9e3add0b1986727282 Signed-off-by: JinYu Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/457755 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Reviewed-by: Darek Stojaczyk --- lib/nvme/nvme_pcie.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index cc1699619..a49e77107 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -967,7 +967,8 @@ nvme_pcie_qpair_reset(struct spdk_nvme_qpair *qpair) { struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair); - pqpair->last_sq_tail = pqpair->sq_tail = pqpair->cq_head = 0; + /* all head/tail vals are set to 0 */ + pqpair->last_sq_tail = pqpair->sq_tail = pqpair->sq_head = pqpair->cq_head = 0; /* * First time through the completion queue, HW will set phase @@ -1377,14 +1378,21 @@ static void nvme_pcie_qpair_abort_trackers(struct spdk_nvme_qpair *qpair, uint32_t dnr) { struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair); - struct nvme_tracker *tr, *temp; + struct nvme_tracker *tr, *temp, *last; + last = TAILQ_LAST(&pqpair->outstanding_tr, nvme_outstanding_tr_head); + + /* Abort previously submitted (outstanding) trs */ TAILQ_FOREACH_SAFE(tr, &pqpair->outstanding_tr, tq_list, temp) { if (!qpair->ctrlr->opts.disable_error_logging) { SPDK_ERRLOG("aborting outstanding command\n"); } nvme_pcie_qpair_manual_complete_tracker(qpair, tr, SPDK_NVME_SCT_GENERIC, SPDK_NVME_SC_ABORTED_BY_REQUEST, dnr, true); + + if (tr == last) { + break; + } } }