aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2018-09-20 12:27:09 -0400
committerBjorn Helgaas <bhelgaas@google.com>2018-09-21 13:18:08 -0400
commit60271ab044a53edb9dcbe76bebea2221c4ff04d9 (patch)
tree08fb7f1367b8f72f6dda95b78b5a1cd5d734fd08
parent4f802170a861265680cad03f47b19c4c3a137052 (diff)
PCI/AER: Take reference on error devices
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>
-rw-r--r--drivers/pci/pcie/aer.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index 637d638f73da..ffbbd759683c 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -866,7 +866,7 @@ void cper_print_aer(struct pci_dev *dev, int aer_severity,
866static int add_error_device(struct aer_err_info *e_info, struct pci_dev *dev) 866static int add_error_device(struct aer_err_info *e_info, struct pci_dev *dev)
867{ 867{
868 if (e_info->error_dev_num < AER_MAX_MULTI_ERR_DEVICES) { 868 if (e_info->error_dev_num < AER_MAX_MULTI_ERR_DEVICES) {
869 e_info->dev[e_info->error_dev_num] = dev; 869 e_info->dev[e_info->error_dev_num] = pci_dev_get(dev);
870 e_info->error_dev_num++; 870 e_info->error_dev_num++;
871 return 0; 871 return 0;
872 } 872 }
@@ -1013,6 +1013,7 @@ static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info)
1013 pcie_do_nonfatal_recovery(dev); 1013 pcie_do_nonfatal_recovery(dev);
1014 else if (info->severity == AER_FATAL) 1014 else if (info->severity == AER_FATAL)
1015 pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER); 1015 pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER);
1016 pci_dev_put(dev);
1016} 1017}
1017 1018
1018#ifdef CONFIG_ACPI_APEI_PCIEAER 1019#ifdef CONFIG_ACPI_APEI_PCIEAER