| From dfad76628972046f65f45f11beb624a1d6d20e26 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 20 Sep 2018 10:27:09 -0600 |
| Subject: PCI/AER: Take reference on error devices |
| |
| From: Keith Busch <keith.busch@intel.com> |
| |
| [ 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> |
| --- |
| drivers/pci/pcie/aer.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c |
| index 637d638f73da5..ffbbd759683c5 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 |
| -- |
| 2.20.1 |
| |