summaryrefslogtreecommitdiffstats
path: root/drivers/pci/pcie
diff options
context:
space:
mode:
authorTyler Baicar2017-08-28 19:09:44 +0200
committerBjorn Helgaas2017-12-19 06:02:21 +0100
commitb9f80fdc4244b417154ec30d3bc7ec3e76085634 (patch)
tree864aa1a99473699dbb0503b89f90f7769655b062 /drivers/pci/pcie
parentLinux 4.15-rc4 (diff)
downloadkernel-qcow2-linux-b9f80fdc4244b417154ec30d3bc7ec3e76085634.tar.gz
kernel-qcow2-linux-b9f80fdc4244b417154ec30d3bc7ec3e76085634.tar.xz
kernel-qcow2-linux-b9f80fdc4244b417154ec30d3bc7ec3e76085634.zip
PCI/AER: Skip recovery callbacks for correctable errors from ACPI APEI
PCIe correctable errors are corrected by hardware. Software may log them, but no other software intervention is required. There are two paths to enter the AER recovery code: (1) the native path where Linux fields the AER interrupt and reads the AER registers directly, and (2) the ACPI path where firmware reads the AER registers and hands them off to Linux via the ACPI APEI path. The AER do_recovery() function calls driver error reporting callbacks (error_detected(), mmio_enabled(), resume(), etc), attempts recovery (for fatal errors), and logs a "AER: Device recovery successful" message. Since there's nothing to recover for correctable errors, the native path already skips do_recovery(), so it doesn't call the driver callbacks and or emit the message. Make the APEI path do the same. Signed-off-by: Tyler Baicar <tbaicar@codeaurora.org> [bhelgaas: changelog] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/pcie')
-rw-r--r--drivers/pci/pcie/aer/aerdrv_core.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/pci/pcie/aer/aerdrv_core.c b/drivers/pci/pcie/aer/aerdrv_core.c
index 744805232155..3e354f224422 100644
--- a/drivers/pci/pcie/aer/aerdrv_core.c
+++ b/drivers/pci/pcie/aer/aerdrv_core.c
@@ -633,7 +633,8 @@ static void aer_recover_work_func(struct work_struct *work)
continue;
}
cper_print_aer(pdev, entry.severity, entry.regs);
- do_recovery(pdev, entry.severity);
+ if (entry.severity != AER_CORRECTABLE)
+ do_recovery(pdev, entry.severity);
pci_dev_put(pdev);
}
}