Hannes Reinecke 273b02
From: Alexey Dobriyan <adobriyan@gmail.com>
Hannes Reinecke 273b02
Date: Thu, 7 May 2020 23:07:04 +0300
Hannes Reinecke 273b02
Subject: [PATCH] nvme-pci: fix "slimmer CQ head update"
Hannes Reinecke 273b02
Git-commit: a8de6639169b90e3dc4f27e752a3c5abac5e90da
Hannes Reinecke 273b02
Patch-mainline: v5.7-rc5
Hannes Reinecke 273b02
References: git-fixes
Hannes Reinecke 273b02
Hannes Reinecke 273b02
Pre-incrementing ->cq_head can't be done in memory because OOB value
Hannes Reinecke 273b02
can be observed by another context.
Hannes Reinecke 273b02
Hannes Reinecke 273b02
This devalues space savings compared to original code :-\
Hannes Reinecke 273b02
Hannes Reinecke 273b02
	$ ./scripts/bloat-o-meter ../vmlinux-000 ../obj/vmlinux
Hannes Reinecke 273b02
	add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-32 (-32)
Hannes Reinecke 273b02
	Function                                     old     new   delta
Hannes Reinecke 273b02
	nvme_poll_irqdisable                         464     456      -8
Hannes Reinecke 273b02
	nvme_poll                                    455     447      -8
Hannes Reinecke 273b02
	nvme_irq                                     388     380      -8
Hannes Reinecke 273b02
	nvme_dev_disable                             955     947      -8
Hannes Reinecke 273b02
Hannes Reinecke 273b02
But the code is minimal now: one read for head, one read for q_depth,
Hannes Reinecke 273b02
one increment, one comparison, single instruction phase bit update and
Hannes Reinecke 273b02
one write for new head.
Hannes Reinecke 273b02
Hannes Reinecke 273b02
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Hannes Reinecke 273b02
Reported-by: John Garry <john.garry@huawei.com>
Hannes Reinecke 273b02
Tested-by: John Garry <john.garry@huawei.com>
Hannes Reinecke 273b02
Fixes: e2a366a4b0feaeb ("nvme-pci: slimmer CQ head update")
Hannes Reinecke 273b02
Signed-off-by: Christoph Hellwig <hch@lst.de>
Hannes Reinecke 273b02
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Hannes Reinecke 273b02
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke 273b02
---
Hannes Reinecke 273b02
 drivers/nvme/host/pci.c | 6 +++++-
Hannes Reinecke 273b02
 1 file changed, 5 insertions(+), 1 deletion(-)
Hannes Reinecke 273b02
Hannes Reinecke 273b02
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
Hannes Reinecke 273b02
index 4e79e412b276..e13c370de830 100644
Hannes Reinecke 273b02
--- a/drivers/nvme/host/pci.c
Hannes Reinecke 273b02
+++ b/drivers/nvme/host/pci.c
Hannes Reinecke 273b02
@@ -973,9 +973,13 @@ static inline void nvme_handle_cqe(struct nvme_queue *nvmeq, u16 idx)
Hannes Reinecke 273b02
 
Hannes Reinecke 273b02
 static inline void nvme_update_cq_head(struct nvme_queue *nvmeq)
Hannes Reinecke 273b02
 {
Hannes Reinecke 273b02
-	if (++nvmeq->cq_head == nvmeq->q_depth) {
Hannes Reinecke 273b02
+	u16 tmp = nvmeq->cq_head + 1;
Hannes Reinecke 273b02
+
Hannes Reinecke 273b02
+	if (tmp == nvmeq->q_depth) {
Hannes Reinecke 273b02
 		nvmeq->cq_head = 0;
Hannes Reinecke 273b02
 		nvmeq->cq_phase ^= 1;
Hannes Reinecke 273b02
+	} else {
Hannes Reinecke 273b02
+		nvmeq->cq_head = tmp;
Hannes Reinecke 273b02
 	}
Hannes Reinecke 273b02
 }
Hannes Reinecke 273b02
 
Hannes Reinecke 273b02
-- 
Hannes Reinecke 273b02
2.29.2
Hannes Reinecke 273b02