Skip to contentSkip to conversation

nvme/pci: Don't free queues on error

PATCH New Keith Busch 4 participants 5 messages Nov 15, 2016 – Nov 16, 2016 NVMe

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 nvme/pci: Don't free queues on error

The nvme_remove function tears down all allocated resources in the correct order, so no need to free queues on error during initialization. This fixes possible use-after-free errors when queues are still associated with a blk-mq hctx.

Reported-by Scott Bauer <scott.bauer at intel.com>
Tested-by Scott Bauer <scott.bauer at intel.com>
Signed-off-by Keith Busch <keith.busch at intel.com>
---
 drivers/nvme/host/pci.c | 18 ++++--------------
 1 file changed, 4 insertions(+), 14 deletions(-)
drivers/nvme/host/pci.c +4 -14
index 0248d0e..5e52034 100644
@@ -1242,20 +1242,16 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
 
 	result = nvme_enable_ctrl(&dev->ctrl, cap);
 	if (result)
-		goto free_nvmeq;
+		return result;
 
 	nvmeq->cq_vector = 0;
 	result = queue_request_irq(nvmeq);
 	if (result) {
 		nvmeq->cq_vector = -1;
-		goto free_nvmeq;
+		return result;
 	}
 
 	return result;
-
- free_nvmeq:
-	nvme_free_queues(dev, 0);
-	return result;
 }
 
 static bool nvme_should_reset(struct nvme_dev *dev, u32 csts)
@@ -1317,10 +1313,8 @@ static int nvme_create_io_queues(struct nvme_dev *dev)
 	max = min(dev->max_qid, dev->queue_count - 1);
 	for (i = dev->online_queues; i <= max; i++) {
 		ret = nvme_create_queue(dev->queues[i], i);
-		if (ret) {
-			nvme_free_queues(dev, i);
+		if (ret)
 			break;
-		}
 	}
 
 	/*
@@ -1460,13 +1454,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
 	result = queue_request_irq(adminq);
 	if (result) {
 		adminq->cq_vector = -1;
-		goto free_queues;
+		return result;
 	}
 	return nvme_create_io_queues(dev);
-
- free_queues:
-	nvme_free_queues(dev, 1);
-	return result;
 }
 
 static void nvme_del_queue_end(struct request *req, int error)
Signature · 1 line
2.7.2
maintainer
#1 lore raw

PATCH 1/1 nvme/pci: Don't free queues on error

Looks good,

Reviewed-by Sagi Grimberg <sagi at grimbeg.me>
#2 lore raw

PATCH 1/1 nvme/pci: Don't free queues on error

In reply to Keith Busch
Quoted 8 lines · Keith Busch

The nvme_remove function tears down all allocated resources in the correct order, so no need to free queues on error during initialization. This fixes possible use-after-free errors when queues are still associated with a blk-mq hctx.

Reported-by Scott Bauer <scott.bauer at intel.com>
Tested-by Scott Bauer <scott.bauer at intel.com>
Signed-off-by Keith Busch <keith.busch at intel.com>

Looks good,

Reviewed-by Christoph Hellwig <hch at lst.de>

should this get a Cc to stable?

#3 lore raw

PATCH 1/1 nvme/pci: Don't free queues on error

Quoted 1 line · Christoph Hellwig

should this get a Cc to stable?

Sure thing, but it'll have be a different patch going back to just stable-4.8.y. I'll follow "option 3" from the Stable Kernel Rules once this is applied.

#4 lore raw

PATCH 1/1 nvme/pci: Don't free queues on error

In reply to Keith Busch
Quoted 4 lines · Keith Busch

The nvme_remove function tears down all allocated resources in the correct order, so no need to free queues on error during initialization. This fixes possible use-after-free errors when queues are still associated with a blk-mq hctx.

Added for 4.9, thanks Keith.

Signature · 1 line
Jens Axboe