diff options
author | Keith Busch <keith.busch@intel.com> | 2018-09-20 12:27:09 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2018-09-21 13:18:08 -0400 |
commit | 60271ab044a53edb9dcbe76bebea2221c4ff04d9 (patch) | |
tree | 08fb7f1367b8f72f6dda95b78b5a1cd5d734fd08 | |
parent | 4f802170a861265680cad03f47b19c4c3a137052 (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.c | 3 |
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, | |||
866 | static int add_error_device(struct aer_err_info *e_info, struct pci_dev *dev) | 866 | static 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 |