Hannes Reinecke eb46a8
From: Keith Busch <kbusch@kernel.org>
Hannes Reinecke eb46a8
Date: Mon, 2 Mar 2020 08:45:04 -0800
Hannes Reinecke eb46a8
Subject: [PATCH] nvme-pci: Remove tag from process cq
Hannes Reinecke eb46a8
Git-commit: bf392a5dc02a9b796f3da89fc5bb42856aca64cb
Hannes Reinecke eb46a8
Patch-mainline: v5.7-rc1
Hannes Reinecke eb46a8
References: git-fixes
Hannes Reinecke eb46a8
Hannes Reinecke eb46a8
The only user for tagged completion was for timeout handling. That user,
Hannes Reinecke eb46a8
though, really only cares if the timed out command is completed, which
Hannes Reinecke eb46a8
we can safely check within the timeout handler.
Hannes Reinecke eb46a8
Hannes Reinecke eb46a8
Remove the tag check to simplify completion handling.
Hannes Reinecke eb46a8
Hannes Reinecke eb46a8
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke eb46a8
Reviewed-by: Christoph Hellwig <hch@lst.de>
Hannes Reinecke eb46a8
Signed-off-by: Keith Busch <kbusch@kernel.org>
Hannes Reinecke eb46a8
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke eb46a8
---
Hannes Reinecke eb46a8
 drivers/nvme/host/pci.c | 23 +++++++++++------------
Hannes Reinecke eb46a8
 1 file changed, 11 insertions(+), 12 deletions(-)
Hannes Reinecke eb46a8
Hannes Reinecke eb46a8
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
Hannes Reinecke eb46a8
index cdc9b6149d38..98d8ddd7aa0f 100644
Hannes Reinecke eb46a8
--- a/drivers/nvme/host/pci.c
Hannes Reinecke eb46a8
+++ b/drivers/nvme/host/pci.c
Hannes Reinecke eb46a8
@@ -989,14 +989,13 @@ static inline void nvme_update_cq_head(struct nvme_queue *nvmeq)
Hannes Reinecke eb46a8
 }
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
 static inline int nvme_process_cq(struct nvme_queue *nvmeq, u16 *start,
Hannes Reinecke eb46a8
-				  u16 *end, unsigned int tag)
Hannes Reinecke eb46a8
+				  u16 *end)
Hannes Reinecke eb46a8
 {
Hannes Reinecke eb46a8
 	int found = 0;
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
 	*start = nvmeq->cq_head;
Hannes Reinecke eb46a8
 	while (nvme_cqe_pending(nvmeq)) {
Hannes Reinecke eb46a8
-		if (tag == -1U || nvmeq->cqes[nvmeq->cq_head].command_id == tag)
Hannes Reinecke eb46a8
-			found++;
Hannes Reinecke eb46a8
+		found++;
Hannes Reinecke eb46a8
 		nvme_update_cq_head(nvmeq);
Hannes Reinecke eb46a8
 	}
Hannes Reinecke eb46a8
 	*end = nvmeq->cq_head;
Hannes Reinecke eb46a8
@@ -1017,7 +1016,7 @@ static irqreturn_t nvme_irq(int irq, void *data)
Hannes Reinecke eb46a8
 	 * the irq handler, even if that was on another CPU.
Hannes Reinecke eb46a8
 	 */
Hannes Reinecke eb46a8
 	rmb();
Hannes Reinecke eb46a8
-	nvme_process_cq(nvmeq, &start, &end, -1);
Hannes Reinecke eb46a8
+	nvme_process_cq(nvmeq, &start, &end;;
Hannes Reinecke eb46a8
 	wmb();
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
 	if (start != end) {
Hannes Reinecke eb46a8
@@ -1040,7 +1039,7 @@ static irqreturn_t nvme_irq_check(int irq, void *data)
Hannes Reinecke eb46a8
  * Poll for completions any queue, including those not dedicated to polling.
Hannes Reinecke eb46a8
  * Can be called from any context.
Hannes Reinecke eb46a8
  */
Hannes Reinecke eb46a8
-static int nvme_poll_irqdisable(struct nvme_queue *nvmeq, unsigned int tag)
Hannes Reinecke eb46a8
+static int nvme_poll_irqdisable(struct nvme_queue *nvmeq)
Hannes Reinecke eb46a8
 {
Hannes Reinecke eb46a8
 	struct pci_dev *pdev = to_pci_dev(nvmeq->dev->dev);
Hannes Reinecke eb46a8
 	u16 start, end;
Hannes Reinecke eb46a8
@@ -1053,11 +1052,11 @@ static int nvme_poll_irqdisable(struct nvme_queue *nvmeq, unsigned int tag)
Hannes Reinecke eb46a8
 	 */
Hannes Reinecke eb46a8
 	if (test_bit(NVMEQ_POLLED, &nvmeq->flags)) {
Hannes Reinecke eb46a8
 		spin_lock(&nvmeq->cq_poll_lock);
Hannes Reinecke eb46a8
-		found = nvme_process_cq(nvmeq, &start, &end, tag);
Hannes Reinecke eb46a8
+		found = nvme_process_cq(nvmeq, &start, &end;;
Hannes Reinecke eb46a8
 		spin_unlock(&nvmeq->cq_poll_lock);
Hannes Reinecke eb46a8
 	} else {
Hannes Reinecke eb46a8
 		disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
Hannes Reinecke eb46a8
-		found = nvme_process_cq(nvmeq, &start, &end, tag);
Hannes Reinecke eb46a8
+		found = nvme_process_cq(nvmeq, &start, &end;;
Hannes Reinecke eb46a8
 		enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
Hannes Reinecke eb46a8
 	}
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
@@ -1075,8 +1074,7 @@ static int nvme_poll(struct blk_mq_hw_ctx *hctx)
Hannes Reinecke eb46a8
 		return 0;
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
 	spin_lock(&nvmeq->cq_poll_lock);
Hannes Reinecke eb46a8
-	found = nvme_process_cq(nvmeq, &start, &end, -1);
Hannes Reinecke eb46a8
-	nvme_complete_cqes(nvmeq, start, end);
Hannes Reinecke eb46a8
+	found = nvme_process_cq(nvmeq, &start, &end;;
Hannes Reinecke eb46a8
 	spin_unlock(&nvmeq->cq_poll_lock);
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
 	return found;
Hannes Reinecke eb46a8
@@ -1253,7 +1251,8 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
Hannes Reinecke eb46a8
 	/*
Hannes Reinecke eb46a8
 	 * Did we miss an interrupt?
Hannes Reinecke eb46a8
 	 */
Hannes Reinecke eb46a8
-	if (nvme_poll_irqdisable(nvmeq, req->tag)) {
Hannes Reinecke eb46a8
+	nvme_poll_irqdisable(nvmeq);
Hannes Reinecke eb46a8
+	if (blk_mq_request_completed(req)) {
Hannes Reinecke eb46a8
 		dev_warn(dev->ctrl.device,
Hannes Reinecke eb46a8
 			 "I/O %d QID %d timeout, completion polled\n",
Hannes Reinecke eb46a8
 			 req->tag, nvmeq->qid);
Hannes Reinecke eb46a8
@@ -1396,7 +1395,7 @@ static void nvme_disable_admin_queue(struct nvme_dev *dev, bool shutdown)
Hannes Reinecke eb46a8
 	else
Hannes Reinecke eb46a8
 		nvme_disable_ctrl(&dev->ctrl);
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
-	nvme_poll_irqdisable(nvmeq, -1);
Hannes Reinecke eb46a8
+	nvme_poll_irqdisable(nvmeq);
Hannes Reinecke eb46a8
 }
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
 /*
Hannes Reinecke eb46a8
@@ -1411,7 +1410,7 @@ static void nvme_reap_pending_cqes(struct nvme_dev *dev)
Hannes Reinecke eb46a8
 	int i;
Hannes Reinecke eb46a8
 
Hannes Reinecke eb46a8
 	for (i = dev->ctrl.queue_count - 1; i > 0; i--) {
Hannes Reinecke eb46a8
-		nvme_process_cq(&dev->queues[i], &start, &end, -1);
Hannes Reinecke eb46a8
+		nvme_process_cq(&dev->queues[i], &start, &end;;
Hannes Reinecke eb46a8
 		nvme_complete_cqes(&dev->queues[i], start, end);
Hannes Reinecke eb46a8
 	}
Hannes Reinecke eb46a8
 }
Hannes Reinecke eb46a8
-- 
Hannes Reinecke eb46a8
2.29.2
Hannes Reinecke eb46a8