Skip to contentSkip to conversation

NVMe: Memory barrier before queue_count is incremented

PATCH New Jon Derrick 3 participants 4 messages May 27, 2015 – Jun 5, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 NVMe: Memory barrier before queue_count is incremented

Protects against reordering and/or preempting which would allow the kthread to access the queue descriptor before it is set up

Signed-off-by Jon Derrick <jonathan.derrick at intel.com>
---
 drivers/block/nvme-core.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/block/nvme-core.c +4 -1
index c42bc53..2b0c817 100644
@@ -1463,9 +1463,12 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid,
 	nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride];
 	nvmeq->q_depth = depth;
 	nvmeq->qid = qid;
-	dev->queue_count++;
 	dev->queues[qid] = nvmeq;
 
+	/* make sure queue descriptor is set before queue count, for kthread */
+	mb();
+	dev->queue_count++;
+
 	return nvmeq;
 
  free_cqdma:
Signature · 1 line
2.1.4
#1 lore raw

PATCH 1/1 NVMe: Memory barrier before queue_count is incremented

Quoted 2 lines · Jon Derrick

Protects against reordering and/or preempting which would allow the kthread to access the queue descriptor before it is set up

Looks good to me.

Acked-by Keith Busch <keith.busch at intel.com>
Quoted 27 lines
Signed-off-by Jon Derrick <jonathan.derrick at intel.com>

---
drivers/block/nvme-core.c | 5 ++++-

1 file changed, 4 insertions(+), 1 deletion(-)
drivers/block/nvme-core.c +4 -1
index c42bc53..2b0c817 100644
@@ -1463,9 +1463,12 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid,
 	nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride];
 	nvmeq->q_depth = depth;
 	nvmeq->qid = qid;
-	dev->queue_count++;
 	dev->queues[qid] = nvmeq;
 
+	/* make sure queue descriptor is set before queue count, for kthread */
+	mb();
+	dev->queue_count++;
+
 	return nvmeq;
 
 free_cqdma:
Signature · 1 line
2.1.4
maintainer
#2 lore raw

PATCH 1/1 NVMe: Memory barrier before queue_count is incremented

Quoted 7 lines · Keith Busch
Quoted 2 lines · Jon Derrick

Protects against reordering and/or preempting which would allow the kthread to access the queue descriptor before it is set up

Looks good to me.

Acked-by Keith Busch <keith.busch at intel.com>

Ditto, merged.

Signature · 1 line
Jens Axboe
#3 lore raw

PATCH 1/1 NVMe: Memory barrier before queue_count is incremented

In reply to Jon Derrick

Ping?

Quoted 29 lines · Jon Derrick

Protects against reordering and/or preempting which would allow the kthread to access the queue descriptor before it is set up

Signed-off-by Jon Derrick <jonathan.derrick at intel.com>
---
 drivers/block/nvme-core.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/block/nvme-core.c +4 -1
index c42bc53..2b0c817 100644
@@ -1463,9 +1463,12 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid,
 	nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride];
 	nvmeq->q_depth = depth;
 	nvmeq->qid = qid;
-	dev->queue_count++;
 	dev->queues[qid] = nvmeq;
 
+	/* make sure queue descriptor is set before queue count, for kthread */
+	mb();
+	dev->queue_count++;
+
 	return nvmeq;
 
  free_cqdma:
Signature · 1 line
2.1.4