ionic: check before releasing pci regions
authorShannon Nelson <shannon.nelson@amd.com>
Fri, 23 Feb 2024 22:27:40 +0000 (14:27 -0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 27 Feb 2024 12:03:32 +0000 (13:03 +0100)
AER recovery handler can trigger a PCI Reset after tearing
down the device setup in the error detection handler.  The PCI
Reset handler will also attempt to tear down the device setup,
and this second tear down needs to know that it doesn't need
to call pci_release_regions() a second time.  We can clear
num_bars on tear down and use that to decide later if we need
to clear the resources.  This prevents a harmless but disturbing
warning message
    resource: Trying to free nonexistent resource <0xXXXXXXXXXX-0xXXXXXXXXXX>

Fixes: c3a910e1c47a ("ionic: fill out pci error handlers")
Reviewed-by: Brett Creeley <brett.creeley@amd.com>
Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c

index 10a9d80..6ba8d4a 100644 (file)
@@ -93,6 +93,7 @@ static void ionic_unmap_bars(struct ionic *ionic)
                        bars[i].len = 0;
                }
        }
+       ionic->num_bars = 0;
 }
 
 void __iomem *ionic_bus_map_dbpage(struct ionic *ionic, int page_num)
@@ -215,13 +216,15 @@ out:
 
 static void ionic_clear_pci(struct ionic *ionic)
 {
-       ionic->idev.dev_info_regs = NULL;
-       ionic->idev.dev_cmd_regs = NULL;
-       ionic->idev.intr_status = NULL;
-       ionic->idev.intr_ctrl = NULL;
-
-       ionic_unmap_bars(ionic);
-       pci_release_regions(ionic->pdev);
+       if (ionic->num_bars) {
+               ionic->idev.dev_info_regs = NULL;
+               ionic->idev.dev_cmd_regs = NULL;
+               ionic->idev.intr_status = NULL;
+               ionic->idev.intr_ctrl = NULL;
+
+               ionic_unmap_bars(ionic);
+               pci_release_regions(ionic->pdev);
+       }
 
        if (pci_is_enabled(ionic->pdev))
                pci_disable_device(ionic->pdev);