Commit 60271ab0 authored by Keith Busch's avatar Keith Busch Committed by Bjorn Helgaas

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: default avatarKeith Busch <keith.busch@intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarSinan Kaya <okaya@kernel.org>
parent 4f802170
...@@ -866,7 +866,7 @@ void cper_print_aer(struct pci_dev *dev, int aer_severity, ...@@ -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) 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) { 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++; e_info->error_dev_num++;
return 0; return 0;
} }
...@@ -1013,6 +1013,7 @@ static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info) ...@@ -1013,6 +1013,7 @@ static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info)
pcie_do_nonfatal_recovery(dev); pcie_do_nonfatal_recovery(dev);
else if (info->severity == AER_FATAL) else if (info->severity == AER_FATAL)
pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER); pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER);
pci_dev_put(dev);
} }
#ifdef CONFIG_ACPI_APEI_PCIEAER #ifdef CONFIG_ACPI_APEI_PCIEAER
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment