linux/drivers/pci/pcie/aer
Gabriele Paoloni 86acc79071 PCI/AER: Report non-fatal errors only to the affected endpoint
Previously, if an non-fatal error was reported by an endpoint, we
called report_error_detected() for the endpoint, every sibling on the
bus, and their descendents.  If any of them did not implement the
.error_detected() method, do_recovery() failed, leaving all these
devices unrecovered.

For example, the system described in the bugzilla below has two devices:

  0000:74:02.0 [19e5:a230] SAS controller, driver has .error_detected()
  0000:74:03.0 [19e5:a235] SATA controller, driver lacks .error_detected()

When a device such as 74:02.0 reported a non-fatal error, do_recovery()
failed because 74:03.0 lacked an .error_detected() method.  But per PCIe
r3.1, sec 6.2.2.2.2, such an error does not compromise the Link and
does not affect 74:03.0:

  Non-fatal errors are uncorrectable errors which cause a particular
  transaction to be unreliable but the Link is otherwise fully functional.
  Isolating Non-fatal from Fatal errors provides Requester/Receiver logic
  in a device or system management software the opportunity to recover from
  the error without resetting the components on the Link and disturbing
  other transactions in progress.  Devices not associated with the
  transaction in error are not impacted by the error.

Report non-fatal errors only to the endpoint that reported them.  We really
want to check for AER_NONFATAL here, but the current code structure doesn't
allow that.  Looking for pci_channel_io_normal is the best we can do now.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=197055
Fixes: 6c2b374d74 ("PCI-Express AER implemetation: AER core and aerdriver")
Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
[bhelgaas: changelog]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2017-10-05 15:49:31 -05:00
..
aer_inject.c PCI: Export pcie_find_root_port 2016-11-23 16:23:23 -06:00
aerdrv_acpi.c PCI/AER: Support ACPI HEST AER error sources for PCI domains other than 0 2014-01-13 12:18:55 -07:00
aerdrv_core.c PCI/AER: Report non-fatal errors only to the affected endpoint 2017-10-05 15:49:31 -05:00
aerdrv_errprint.c PCI/AER: Remove duplicate AER severity translation 2016-09-20 14:35:59 -05:00
aerdrv.c PCI/portdrv: Move error handler methods to struct pcie_port_service_driver 2017-07-31 14:29:17 -05:00
aerdrv.h PCI/AER: Avoid memory allocation in interrupt handling path 2016-09-27 14:30:36 -05:00
ecrc.c PCIe AER: use pci_is_pcie() 2009-11-24 15:25:17 -08:00
Kconfig kconfig: use bool instead of boolean for type definition attributes 2015-01-07 13:08:04 +01:00
Kconfig.debug PCI: change PCI nomenclature in drivers/pci/ (non-comment changes) 2009-12-16 13:37:54 -08:00
Makefile PCI AER: software error injection 2009-06-16 14:30:14 -07:00