Hannes Reinecke 9cf669
From: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 9cf669
Date: Mon, 27 Apr 2020 11:54:46 -0700
Hannes Reinecke 9cf669
Subject: [PATCH] nvme-pci: remove last_sq_tail
Hannes Reinecke 9cf669
Git-commit: 54b2fcee1db041a83b52b51752dade6090cf952f
Hannes Reinecke 9cf669
Patch-mainline: v5.8-rc1
Hannes Reinecke 9cf669
References: git-fixes
Hannes Reinecke 9cf669
Hannes Reinecke 9cf669
The nvme driver does not have enough tags to wrap the queue, and blk-mq
Hannes Reinecke 9cf669
will no longer call commit_rqs() when there are no new submissions to
Hannes Reinecke 9cf669
notify.
Hannes Reinecke 9cf669
Hannes Reinecke 9cf669
Signed-off-by: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 9cf669
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke 9cf669
Signed-off-by: Christoph Hellwig <hch@lst.de>
Hannes Reinecke 9cf669
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Hannes Reinecke 9cf669
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke 9cf669
---
Hannes Reinecke 9cf669
 drivers/nvme/host/pci.c | 23 ++++-------------------
Hannes Reinecke 9cf669
 1 file changed, 4 insertions(+), 19 deletions(-)
Hannes Reinecke 9cf669
Hannes Reinecke 9cf669
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
Hannes Reinecke 9cf669
index e95c7465c7bd..b945e9a89883 100644
Hannes Reinecke 9cf669
--- a/drivers/nvme/host/pci.c
Hannes Reinecke 9cf669
+++ b/drivers/nvme/host/pci.c
Hannes Reinecke 9cf669
@@ -173,7 +173,6 @@ struct nvme_queue {
Hannes Reinecke 9cf669
 	u16 q_depth;
Hannes Reinecke 9cf669
 	u16 cq_vector;
Hannes Reinecke 9cf669
 	u16 sq_tail;
Hannes Reinecke 9cf669
-	u16 last_sq_tail;
Hannes Reinecke 9cf669
 	u16 cq_head;
Hannes Reinecke 9cf669
 	u16 qid;
Hannes Reinecke 9cf669
 	u8 cq_phase;
Hannes Reinecke 9cf669
@@ -446,24 +445,11 @@ static int nvme_pci_map_queues(struct blk_mq_tag_set *set)
Hannes Reinecke 9cf669
 	return 0;
Hannes Reinecke 9cf669
 }
Hannes Reinecke 9cf669
 
Hannes Reinecke 9cf669
-/*
Hannes Reinecke 9cf669
- * Write sq tail if we are asked to, or if the next command would wrap.
Hannes Reinecke 9cf669
- */
Hannes Reinecke 9cf669
-static inline void nvme_write_sq_db(struct nvme_queue *nvmeq, bool write_sq)
Hannes Reinecke 9cf669
+static inline void nvme_write_sq_db(struct nvme_queue *nvmeq)
Hannes Reinecke 9cf669
 {
Hannes Reinecke 9cf669
-	if (!write_sq) {
Hannes Reinecke 9cf669
-		u16 next_tail = nvmeq->sq_tail + 1;
Hannes Reinecke 9cf669
-
Hannes Reinecke 9cf669
-		if (next_tail == nvmeq->q_depth)
Hannes Reinecke 9cf669
-			next_tail = 0;
Hannes Reinecke 9cf669
-		if (next_tail != nvmeq->last_sq_tail)
Hannes Reinecke 9cf669
-			return;
Hannes Reinecke 9cf669
-	}
Hannes Reinecke 9cf669
-
Hannes Reinecke 9cf669
 	if (nvme_dbbuf_update_and_check_event(nvmeq->sq_tail,
Hannes Reinecke 9cf669
 			nvmeq->dbbuf_sq_db, nvmeq->dbbuf_sq_ei))
Hannes Reinecke 9cf669
 		writel(nvmeq->sq_tail, nvmeq->q_db);
Hannes Reinecke 9cf669
-	nvmeq->last_sq_tail = nvmeq->sq_tail;
Hannes Reinecke 9cf669
 }
Hannes Reinecke 9cf669
 
Hannes Reinecke 9cf669
 /**
Hannes Reinecke 9cf669
@@ -480,7 +466,8 @@ static void nvme_submit_cmd(struct nvme_queue *nvmeq, struct nvme_command *cmd,
Hannes Reinecke 9cf669
 	       cmd, sizeof(*cmd));
Hannes Reinecke 9cf669
 	if (++nvmeq->sq_tail == nvmeq->q_depth)
Hannes Reinecke 9cf669
 		nvmeq->sq_tail = 0;
Hannes Reinecke 9cf669
-	nvme_write_sq_db(nvmeq, write_sq);
Hannes Reinecke 9cf669
+	if (write_sq)
Hannes Reinecke 9cf669
+		nvme_write_sq_db(nvmeq);
Hannes Reinecke 9cf669
 	spin_unlock(&nvmeq->sq_lock);
Hannes Reinecke 9cf669
 }
Hannes Reinecke 9cf669
 
Hannes Reinecke 9cf669
@@ -489,8 +476,7 @@ static void nvme_commit_rqs(struct blk_mq_hw_ctx *hctx)
Hannes Reinecke 9cf669
 	struct nvme_queue *nvmeq = hctx->driver_data;
Hannes Reinecke 9cf669
 
Hannes Reinecke 9cf669
 	spin_lock(&nvmeq->sq_lock);
Hannes Reinecke 9cf669
-	if (nvmeq->sq_tail != nvmeq->last_sq_tail)
Hannes Reinecke 9cf669
-		nvme_write_sq_db(nvmeq, true);
Hannes Reinecke 9cf669
+	nvme_write_sq_db(nvmeq);
Hannes Reinecke 9cf669
 	spin_unlock(&nvmeq->sq_lock);
Hannes Reinecke 9cf669
 }
Hannes Reinecke 9cf669
 
Hannes Reinecke 9cf669
@@ -1494,7 +1480,6 @@ static void nvme_init_queue(struct nvme_queue *nvmeq, u16 qid)
Hannes Reinecke 9cf669
 	struct nvme_dev *dev = nvmeq->dev;
Hannes Reinecke 9cf669
 
Hannes Reinecke 9cf669
 	nvmeq->sq_tail = 0;
Hannes Reinecke 9cf669
-	nvmeq->last_sq_tail = 0;
Hannes Reinecke 9cf669
 	nvmeq->cq_head = 0;
Hannes Reinecke 9cf669
 	nvmeq->cq_phase = 1;
Hannes Reinecke 9cf669
 	nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride];
Hannes Reinecke 9cf669
-- 
Hannes Reinecke 9cf669
2.29.2
Hannes Reinecke 9cf669