Skip to content

Commit 09113ab

Browse files
lztoChristoph Hellwig
authored andcommitted
nvme-pci: fix error handling in nvme_pci_enable()
There are two issues in nvme_pci_enable(): 1) If pci_alloc_irq_vectors() fails, device is left enabled. Fix this by adding a goto disable statement. 2) nvme_pci_configure_admin_queue could return -ENODEV, in this case, we will need to free IRQ properly. Otherwise the following warning could be triggered: [ 5.286752] WARNING: CPU: 0 PID: 33 at kernel/irq/irqdomain.c:253 irq_domain_remove+0x12d/0x140 [ 5.290547] Call Trace: [ 5.290626] <TASK> [ 5.290695] msi_remove_device_irq_domain+0xc9/0xf0 [ 5.290843] msi_device_data_release+0x15/0x80 [ 5.290978] release_nodes+0x58/0x90 [ 5.293788] WARNING: CPU: 0 PID: 33 at kernel/irq/msi.c:276 msi_device_data_release+0x76/0x80 [ 5.297573] Call Trace: [ 5.297651] <TASK> [ 5.297719] release_nodes+0x58/0x90 [ 5.297831] devres_release_all+0xef/0x140 [ 5.298339] device_unbind_cleanup+0x11/0xc0 [ 5.298479] really_probe+0x296/0x320 Fixes: a6ee7f1 ("nvme-pci: call nvme_pci_configure_admin_queue from nvme_pci_enable") Co-developed-by: Keith Busch <[email protected]> Signed-off-by: Tong Zhang <[email protected]> Reviewed-by: Keith Busch <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]>
1 parent 453116a commit 09113ab

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

drivers/nvme/host/pci.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2533,7 +2533,7 @@ static int nvme_pci_enable(struct nvme_dev *dev)
25332533
*/
25342534
result = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
25352535
if (result < 0)
2536-
return result;
2536+
goto disable;
25372537

25382538
dev->ctrl.cap = lo_hi_readq(dev->bar + NVME_REG_CAP);
25392539

@@ -2586,8 +2586,13 @@ static int nvme_pci_enable(struct nvme_dev *dev)
25862586
pci_enable_pcie_error_reporting(pdev);
25872587
pci_save_state(pdev);
25882588

2589-
return nvme_pci_configure_admin_queue(dev);
2589+
result = nvme_pci_configure_admin_queue(dev);
2590+
if (result)
2591+
goto free_irq;
2592+
return result;
25902593

2594+
free_irq:
2595+
pci_free_irq_vectors(pdev);
25912596
disable:
25922597
pci_disable_device(pdev);
25932598
return result;

0 commit comments

Comments
 (0)