Hannes Reinecke 9de10a
From: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 9de10a
Date: Thu, 5 Sep 2019 08:09:33 -0600
Hannes Reinecke 9de10a
Subject: [PATCH] nvme: Restart request timers in resetting state
Hannes Reinecke 9de10a
Git-commit: 92b98e88d59ab17e65f261fbb5db272143ccf414
Hannes Reinecke 9de10a
Patch-mainline: v5.4-rc4
Hannes Reinecke 9de10a
References: bsc#1169045
Hannes Reinecke 9de10a
Hannes Reinecke 9de10a
A controller in the resetting state has not yet completed its recovery
Hannes Reinecke 9de10a
actions. The pci and fc transports were already handling this, so update
Hannes Reinecke 9de10a
the remaining transports to not attempt additional recovery in this
Hannes Reinecke 9de10a
state. Instead, just restart the request timer.
Hannes Reinecke 9de10a
Hannes Reinecke 9de10a
Tested-by: Edmund Nadolski <edmund.nadolski@intel.com>
Hannes Reinecke 9de10a
Reviewed-by: James Smart <james.smart@broadcom.com>
Hannes Reinecke 9de10a
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke 9de10a
Reviewed-by: Christoph Hellwig <hch@lst.de>
Hannes Reinecke 9de10a
Signed-off-by: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 9de10a
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke 9de10a
---
Hannes Reinecke 9de10a
 drivers/nvme/host/rdma.c | 8 ++++++++
Hannes Reinecke 9de10a
 drivers/nvme/host/tcp.c  | 8 ++++++++
Hannes Reinecke 9de10a
 2 files changed, 16 insertions(+)
Hannes Reinecke 9de10a
Hannes Reinecke 9de10a
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
Hannes Reinecke 9de10a
index 4d280160dd3f..f19a28b4e997 100644
Hannes Reinecke 9de10a
--- a/drivers/nvme/host/rdma.c
Hannes Reinecke 9de10a
+++ b/drivers/nvme/host/rdma.c
Hannes Reinecke 9de10a
@@ -1701,6 +1701,14 @@ nvme_rdma_timeout(struct request *rq, bool reserved)
Hannes Reinecke 9de10a
 	dev_warn(ctrl->ctrl.device, "I/O %d QID %d timeout\n",
Hannes Reinecke 9de10a
 		 rq->tag, nvme_rdma_queue_idx(queue));
Hannes Reinecke 9de10a
 
Hannes Reinecke 9de10a
+	/*
Hannes Reinecke 9de10a
+	 * Restart the timer if a controller reset is already scheduled. Any
Hannes Reinecke 9de10a
+	 * timed out commands would be handled before entering the connecting
Hannes Reinecke 9de10a
+	 * state.
Hannes Reinecke 9de10a
+	 */
Hannes Reinecke 9de10a
+	if (ctrl->ctrl.state == NVME_CTRL_RESETTING)
Hannes Reinecke 9de10a
+		return BLK_EH_RESET_TIMER;
Hannes Reinecke 9de10a
+
Hannes Reinecke 9de10a
 	if (ctrl->ctrl.state != NVME_CTRL_LIVE) {
Hannes Reinecke 9de10a
 		/*
Hannes Reinecke 9de10a
 		 * Teardown immediately if controller times out while starting
Hannes Reinecke 9de10a
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
Hannes Reinecke 9de10a
index 385a5212c10f..33de2fddfbb2 100644
Hannes Reinecke 9de10a
--- a/drivers/nvme/host/tcp.c
Hannes Reinecke 9de10a
+++ b/drivers/nvme/host/tcp.c
Hannes Reinecke 9de10a
@@ -2044,6 +2044,14 @@ nvme_tcp_timeout(struct request *rq, bool reserved)
Hannes Reinecke 9de10a
 	struct nvme_tcp_ctrl *ctrl = req->queue->ctrl;
Hannes Reinecke 9de10a
 	struct nvme_tcp_cmd_pdu *pdu = req->pdu;
Hannes Reinecke 9de10a
 
Hannes Reinecke 9de10a
+	/*
Hannes Reinecke 9de10a
+	 * Restart the timer if a controller reset is already scheduled. Any
Hannes Reinecke 9de10a
+	 * timed out commands would be handled before entering the connecting
Hannes Reinecke 9de10a
+	 * state.
Hannes Reinecke 9de10a
+	 */
Hannes Reinecke 9de10a
+	if (ctrl->ctrl.state == NVME_CTRL_RESETTING)
Hannes Reinecke 9de10a
+		return BLK_EH_RESET_TIMER;
Hannes Reinecke 9de10a
+
Hannes Reinecke 9de10a
 	dev_warn(ctrl->ctrl.device,
Hannes Reinecke 9de10a
 		"queue %d: timeout request %#x type %d\n",
Hannes Reinecke 9de10a
 		nvme_tcp_queue_id(req->queue), rq->tag, pdu->hdr.type);
Hannes Reinecke 9de10a
-- 
Hannes Reinecke 9de10a
2.16.4
Hannes Reinecke 9de10a