Hannes Reinecke a48a49
From: Keith Busch <kbusch@kernel.org>
Hannes Reinecke a48a49
Date: Tue, 28 Apr 2020 07:21:56 -0700
Hannes Reinecke a48a49
Subject: [PATCH] nvme-pci: remove volatile cqes
Hannes Reinecke a48a49
Git-commit: 74943d45eef4db64b1e5c9f7ad1d018576e113c5
Hannes Reinecke a48a49
Patch-mainline: v5.8-rc1
Hannes Reinecke a48a49
References: git-fixes
Hannes Reinecke a48a49
Hannes Reinecke a48a49
The completion queue entry is not volatile once the phase is confirmed.
Hannes Reinecke a48a49
Remove the volatile keywords and check the phase using the appropriate
Hannes Reinecke a48a49
READ_ONCE() accessor, allowing the compiler to optimize the remaining
Hannes Reinecke a48a49
completion path.
Hannes Reinecke a48a49
Hannes Reinecke a48a49
Signed-off-by: Keith Busch <kbusch@kernel.org>
Hannes Reinecke a48a49
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke a48a49
Signed-off-by: Christoph Hellwig <hch@lst.de>
Hannes Reinecke a48a49
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Hannes Reinecke a48a49
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke a48a49
---
Hannes Reinecke a48a49
 drivers/nvme/host/pci.c | 9 +++++----
Hannes Reinecke a48a49
 1 file changed, 5 insertions(+), 4 deletions(-)
Hannes Reinecke a48a49
Hannes Reinecke a48a49
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
Hannes Reinecke a48a49
index e13c370de830..e95c7465c7bd 100644
Hannes Reinecke a48a49
--- a/drivers/nvme/host/pci.c
Hannes Reinecke a48a49
+++ b/drivers/nvme/host/pci.c
Hannes Reinecke a48a49
@@ -166,7 +166,7 @@ struct nvme_queue {
Hannes Reinecke a48a49
 	void *sq_cmds;
Hannes Reinecke a48a49
 	 /* only used for poll queues: */
Hannes Reinecke a48a49
 	spinlock_t cq_poll_lock ____cacheline_aligned_in_smp;
Hannes Reinecke a48a49
-	volatile struct nvme_completion *cqes;
Hannes Reinecke a48a49
+	struct nvme_completion *cqes;
Hannes Reinecke a48a49
 	dma_addr_t sq_dma_addr;
Hannes Reinecke a48a49
 	dma_addr_t cq_dma_addr;
Hannes Reinecke a48a49
 	u32 __iomem *q_db;
Hannes Reinecke a48a49
@@ -922,8 +922,9 @@ static void nvme_pci_complete_rq(struct request *req)
Hannes Reinecke a48a49
 /* We read the CQE phase first to check if the rest of the entry is valid */
Hannes Reinecke a48a49
 static inline bool nvme_cqe_pending(struct nvme_queue *nvmeq)
Hannes Reinecke a48a49
 {
Hannes Reinecke a48a49
-	return (le16_to_cpu(nvmeq->cqes[nvmeq->cq_head].status) & 1) ==
Hannes Reinecke a48a49
-			nvmeq->cq_phase;
Hannes Reinecke a48a49
+	struct nvme_completion *hcqe = &nvmeq->cqes[nvmeq->cq_head];
Hannes Reinecke a48a49
+
Hannes Reinecke a48a49
+	return (le16_to_cpu(READ_ONCE(hcqe->status)) & 1) == nvmeq->cq_phase;
Hannes Reinecke a48a49
 }
Hannes Reinecke a48a49
 
Hannes Reinecke a48a49
 static inline void nvme_ring_cq_doorbell(struct nvme_queue *nvmeq)
Hannes Reinecke a48a49
@@ -944,7 +945,7 @@ static inline struct blk_mq_tags *nvme_queue_tagset(struct nvme_queue *nvmeq)
Hannes Reinecke a48a49
 
Hannes Reinecke a48a49
 static inline void nvme_handle_cqe(struct nvme_queue *nvmeq, u16 idx)
Hannes Reinecke a48a49
 {
Hannes Reinecke a48a49
-	volatile struct nvme_completion *cqe = &nvmeq->cqes[idx];
Hannes Reinecke a48a49
+	struct nvme_completion *cqe = &nvmeq->cqes[idx];
Hannes Reinecke a48a49
 	struct request *req;
Hannes Reinecke a48a49
 
Hannes Reinecke a48a49
 	if (unlikely(cqe->command_id >= nvmeq->q_depth)) {
Hannes Reinecke a48a49
-- 
Hannes Reinecke a48a49
2.29.2
Hannes Reinecke a48a49