Skip to content

Commit 770597e

Browse files
committed
nvme-pci: Free tagset if no IO queues
If a controller becomes degraded after a reset, we will not be able to perform any IO. We currently teardown previously created request queues and namespaces, but we had kept the unusable tagset. Free it after all queues using it have been released. Tested-by: Edmund Nadolski <[email protected]> Reviewed-by: James Smart <[email protected]> Reviewed-by: Sagi Grimberg <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Keith Busch <[email protected]>
1 parent 3a8ecc9 commit 770597e

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

drivers/nvme/host/pci.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2490,14 +2490,20 @@ static void nvme_release_prp_pools(struct nvme_dev *dev)
24902490
dma_pool_destroy(dev->prp_small_pool);
24912491
}
24922492

2493+
static void nvme_free_tagset(struct nvme_dev *dev)
2494+
{
2495+
if (dev->tagset.tags)
2496+
blk_mq_free_tag_set(&dev->tagset);
2497+
dev->ctrl.tagset = NULL;
2498+
}
2499+
24932500
static void nvme_pci_free_ctrl(struct nvme_ctrl *ctrl)
24942501
{
24952502
struct nvme_dev *dev = to_nvme_dev(ctrl);
24962503

24972504
nvme_dbbuf_dma_free(dev);
24982505
put_device(dev->dev);
2499-
if (dev->tagset.tags)
2500-
blk_mq_free_tag_set(&dev->tagset);
2506+
nvme_free_tagset(dev);
25012507
if (dev->ctrl.admin_q)
25022508
blk_put_queue(dev->ctrl.admin_q);
25032509
kfree(dev->queues);
@@ -2616,6 +2622,7 @@ static void nvme_reset_work(struct work_struct *work)
26162622
nvme_kill_queues(&dev->ctrl);
26172623
nvme_remove_namespaces(&dev->ctrl);
26182624
new_state = NVME_CTRL_ADMIN_ONLY;
2625+
nvme_free_tagset(dev);
26192626
} else {
26202627
nvme_start_queues(&dev->ctrl);
26212628
nvme_wait_freeze(&dev->ctrl);

0 commit comments

Comments
 (0)