diff options
author | Keith Busch <keith.busch@intel.com> | 2018-09-20 10:27:09 -0600 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-11-20 18:47:12 +0100 |
commit | f3f55d83ea0d7fa5dddfb5a51f3eb92345919da3 (patch) | |
tree | 9b9d438a59dff3f970ea19f27b92ba3a27b1ed09 | |
parent | 40ebd8b31feaf0e78991656eb7659e115fb902dd (diff) | |
download | linux-stable-f3f55d83ea0d7fa5dddfb5a51f3eb92345919da3.tar.gz linux-stable-f3f55d83ea0d7fa5dddfb5a51f3eb92345919da3.tar.bz2 linux-stable-f3f55d83ea0d7fa5dddfb5a51f3eb92345919da3.zip |
PCI/AER: Take reference on error devices
[ Upstream commit 60271ab044a53edb9dcbe76bebea2221c4ff04d9 ]
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>
Signed-off-by: Sasha Levin <sashal@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, 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 |