PCI/AER: Take reference on error devices
authorKeith Busch <keith.busch@intel.com>
Thu, 20 Sep 2018 16:27:09 +0000 (10:27 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 21 Sep 2018 17:18:08 +0000 (12:18 -0500)
Error handling may be running in parallel with a hot removal.  Reference
count the device during AER handling so the device can not be freed while
AER wants to reference it.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Sinan Kaya <okaya@kernel.org>
drivers/pci/pcie/aer.c

index 637d638f73da5edf1f327e1bc81892df29ec3147..ffbbd759683c57f779806d115e2e7d2c03e38179 100644 (file)
@@ -866,7 +866,7 @@ void cper_print_aer(struct pci_dev *dev, int aer_severity,
 static int add_error_device(struct aer_err_info *e_info, struct pci_dev *dev)
 {
        if (e_info->error_dev_num < AER_MAX_MULTI_ERR_DEVICES) {
-               e_info->dev[e_info->error_dev_num] = dev;
+               e_info->dev[e_info->error_dev_num] = pci_dev_get(dev);
                e_info->error_dev_num++;
                return 0;
        }
@@ -1013,6 +1013,7 @@ static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info)
                pcie_do_nonfatal_recovery(dev);
        else if (info->severity == AER_FATAL)
                pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER);
+       pci_dev_put(dev);
 }
 
 #ifdef CONFIG_ACPI_APEI_PCIEAER