Skip to content

Commit 9f9cafc

Browse files
Jianchao WangChristoph Hellwig
authored andcommitted
nvme-pci: move nvme_kill_queues to nvme_remove_dead_ctrl
There is race between nvme_remove and nvme_reset_work that can lead to io hang. nvme_remove nvme_reset_work -> nvme_remove_dead_ctrl -> nvme_dev_disable -> quiesce request_queue -> queue remove_work -> cancel_work_sync reset_work -> nvme_remove_namespaces -> splice ctrl->namespaces nvme_remove_dead_ctrl_work -> nvme_kill_queues -> nvme_ns_remove do nothing -> blk_cleanup_queue -> blk_freeze_queue Finally, the request_queue is quiesced state when wait freeze, we will get io hang here. To fix it, move the nvme_kill_queues from nvme_remove_dead_ctrl_work to nvme_remove_dead_ctrl. Suggested-by: Keith Busch <[email protected]> Signed-off-by: Jianchao Wang <[email protected]> Reviewed-by: Keith Busch <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]>
1 parent 02d62a8 commit 9f9cafc

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/nvme/host/pci.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2289,6 +2289,7 @@ static void nvme_remove_dead_ctrl(struct nvme_dev *dev, int status)
22892289

22902290
nvme_get_ctrl(&dev->ctrl);
22912291
nvme_dev_disable(dev, false);
2292+
nvme_kill_queues(&dev->ctrl);
22922293
if (!queue_work(nvme_wq, &dev->remove_work))
22932294
nvme_put_ctrl(&dev->ctrl);
22942295
}
@@ -2405,7 +2406,6 @@ static void nvme_remove_dead_ctrl_work(struct work_struct *work)
24052406
struct nvme_dev *dev = container_of(work, struct nvme_dev, remove_work);
24062407
struct pci_dev *pdev = to_pci_dev(dev->dev);
24072408

2408-
nvme_kill_queues(&dev->ctrl);
24092409
if (pci_get_drvdata(pdev))
24102410
device_release_driver(&pdev->dev);
24112411
nvme_put_ctrl(&dev->ctrl);

0 commit comments

Comments
 (0)