All of lore.kernel.org
 help / color / mirror / Atom feed
From: hch@lst.de (Christoph Hellwig)
Subject: [PATCH 06/26] nvme: merge nvme_abort_req and nvme_timeout
Date: Tue,  1 Dec 2015 19:52:41 +0100	[thread overview]
Message-ID: <1448995981-11982-7-git-send-email-hch@lst.de> (raw)
In-Reply-To: <1448995981-11982-1-git-send-email-hch@lst.de>

We want to be able to return bettern error values frmo nvme_timeout, which
is significantly easier if the two functions are merged.  Also clean up and
reduce the printk spew so that we only get one message per abort.

Signed-off-by: Christoph Hellwig <hch at lst.de>
Signed-off-by: Keith Busch <keith.busch at intel.com>
---
 drivers/nvme/host/pci.c | 47 ++++++++++++++++++-----------------------------
 1 file changed, 18 insertions(+), 29 deletions(-)

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index d4fef81..99c5b63 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -1078,13 +1078,7 @@ static int adapter_delete_sq(struct nvme_dev *dev, u16 sqid)
 	return adapter_delete_queue(dev, nvme_admin_delete_sq, sqid);
 }
 
-/**
- * nvme_abort_req - Attempt aborting a request
- *
- * Schedule controller reset if the command was already aborted once before and
- * still hasn't been returned to the driver, or if this is the admin queue.
- */
-static void nvme_abort_req(struct request *req)
+static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
 {
 	struct nvme_cmd_info *cmd_rq = blk_mq_rq_to_pdu(req);
 	struct nvme_queue *nvmeq = cmd_rq->nvmeq;
@@ -1093,6 +1087,11 @@ static void nvme_abort_req(struct request *req)
 	struct nvme_cmd_info *abort_cmd;
 	struct nvme_command cmd;
 
+	/*
+	 * Schedule controller reset if the command was already aborted once
+	 * before and still hasn't been returned to the driver, or if this is
+	 * the admin queue.
+	 */
 	if (!nvmeq->qid || cmd_rq->aborted) {
 		spin_lock_irq(&dev_list_lock);
 		if (!__nvme_reset(dev)) {
@@ -1101,16 +1100,16 @@ static void nvme_abort_req(struct request *req)
 				 req->tag, nvmeq->qid);
 		}
 		spin_unlock_irq(&dev_list_lock);
-		return;
+		return BLK_EH_RESET_TIMER;
 	}
 
 	if (!dev->ctrl.abort_limit)
-		return;
+		return BLK_EH_RESET_TIMER;
 
 	abort_req = blk_mq_alloc_request(dev->ctrl.admin_q, WRITE,
 			BLK_MQ_REQ_NOWAIT);
 	if (IS_ERR(abort_req))
-		return;
+		return BLK_EH_RESET_TIMER;
 
 	abort_cmd = blk_mq_rq_to_pdu(abort_req);
 	nvme_set_info(abort_cmd, abort_req, abort_completion);
@@ -1124,9 +1123,16 @@ static void nvme_abort_req(struct request *req)
 	--dev->ctrl.abort_limit;
 	cmd_rq->aborted = 1;
 
-	dev_warn(nvmeq->q_dmadev, "Aborting I/O %d QID %d\n", req->tag,
-							nvmeq->qid);
+	dev_warn(nvmeq->q_dmadev, "I/O %d QID %d timeout, aborting\n",
+				 req->tag, nvmeq->qid);
 	nvme_submit_cmd(dev->queues[0], &cmd);
+
+	/*
+	 * The aborted req will be completed on receiving the abort req.
+	 * We enable the timer again. If hit twice, it'll cause a device reset,
+	 * as the device then is in a faulty state.
+	 */
+	return BLK_EH_RESET_TIMER;
 }
 
 static void nvme_cancel_queue_ios(struct request *req, void *data, bool reserved)
@@ -1157,23 +1163,6 @@ static void nvme_cancel_queue_ios(struct request *req, void *data, bool reserved
 	fn(nvmeq, ctx, &cqe);
 }
 
-static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
-{
-	struct nvme_cmd_info *cmd = blk_mq_rq_to_pdu(req);
-	struct nvme_queue *nvmeq = cmd->nvmeq;
-
-	dev_warn(nvmeq->q_dmadev, "Timeout I/O %d QID %d\n", req->tag,
-							nvmeq->qid);
-	nvme_abort_req(req);
-
-	/*
-	 * The aborted req will be completed on receiving the abort req.
-	 * We enable the timer again. If hit twice, it'll cause a device reset,
-	 * as the device then is in a faulty state.
-	 */
-	return BLK_EH_RESET_TIMER;
-}
-
 static void nvme_free_queue(struct nvme_queue *nvmeq)
 {
 	dma_free_coherent(nvmeq->q_dmadev, CQ_SIZE(nvmeq->q_depth),
-- 
1.9.1

  parent reply	other threads:[~2015-12-01 18:52 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-01 18:52 NVMe reset fixes and completion path optimizations Christoph Hellwig
2015-12-01 18:52 ` [PATCH 01/26] block: defer timeouts to a workqueue Christoph Hellwig
2015-12-01 18:52 ` [PATCH 02/26] nvme: only ignore hardware errors in nvme_create_io_queues Christoph Hellwig
2015-12-01 18:52 ` [PATCH 03/26] nvme: only add a controller to dev_list after it's been fully initialized Christoph Hellwig
2015-12-01 18:52 ` [PATCH 04/26] nvme: protect against simultaneous shutdown invocations Christoph Hellwig
2015-12-01 18:52 ` [PATCH 05/26] nvme: don't take the I/O queue q_lock in nvme_timeout Christoph Hellwig
2015-12-01 18:52 ` Christoph Hellwig [this message]
2015-12-01 18:52 ` [PATCH 07/26] nvme: add NVME_SC_CANCELLED Christoph Hellwig
2015-12-01 18:52 ` [PATCH 08/26] nvme: simplify resets Christoph Hellwig
2015-12-01 18:52 ` [PATCH 09/26] nvme: do not restart the request timeout if we're resetting the controller Christoph Hellwig
2015-12-01 18:52 ` [PATCH 10/26] nvme: merge probe_work and reset_work Christoph Hellwig
2015-12-01 18:52 ` [PATCH 11/26] nvme: remove dead controllers from a work item Christoph Hellwig
2015-12-01 18:52 ` [PATCH 12/26] nvme: switch abort_limit to an atomic_t Christoph Hellwig
2015-12-01 18:52 ` [PATCH 13/26] NVMe: Implement namespace list scanning Christoph Hellwig
2015-12-01 18:52 ` [PATCH 14/26] NVMe: Use unbounded work queue for all work Christoph Hellwig
2015-12-01 18:52 ` [PATCH 15/26] NVMe: Remove device management handles on remove Christoph Hellwig
2015-12-01 18:52 ` [PATCH 16/26] NVMe: Simplify metadata setup Christoph Hellwig
2015-12-01 18:52 ` [PATCH 17/26] nvme: fix admin queue depth Christoph Hellwig
2015-12-01 18:52 ` [PATCH 18/26] nvme: factor out a few helpers from req_completion Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1448995981-11982-7-git-send-email-hch@lst.de \
    --to=hch@lst.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.