linux/drivers/pci
Gabriele Paoloni fbb2d72a54 PCI/AER: Report non-fatal errors only to the affected endpoint
[ Upstream commit 86acc79071 ]

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>

Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2017-12-25 14:23:44 +01:00
..
host PCI: mvebu: Handle changes to the bridge windows while enabled 2017-11-15 15:53:11 +01:00
hotplug PCI: pciehp: Report power fault only once until we clear it 2017-09-27 14:39:24 +02:00
pcie PCI/AER: Report non-fatal errors only to the affected endpoint 2017-12-25 14:23:44 +01:00
access.c PCI: Avoid possible deadlock on pci_lock and p->pi_lock 2017-11-08 10:08:37 +01:00
ats.c PCI: Remove pci_ats_enabled() 2015-08-13 15:59:59 -05:00
bus.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
ecam.c tree-wide: replace config_enabled() with IS_ENABLED() 2016-08-04 08:50:07 -04:00
host-bridge.c cxl: use pcibios_free_controller_deferred() when removing vPHBs 2016-08-22 11:09:33 +10:00
hotplug-pci.c PCI: Remove unnecessary __ref annotations 2014-04-29 17:36:44 -06:00
htirq.c x86/htirq: Use hierarchical irqdomain to manage Hypertransport interrupts 2015-04-24 15:36:50 +02:00
iov.c PCI: Create SR-IOV virtfn/physfn links before attaching driver 2017-12-25 14:23:44 +01:00
irq.c PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
Kconfig PCI/MSI: Enable PCI_MSI_IRQ_DOMAIN support for ARC 2016-09-06 10:53:32 -05:00
Makefile x86/platform/intel-mid: Add Power Management Unit driver 2016-06-15 10:10:49 +02:00
msi.c PCI/MSI: Return failure when msix_setup_entries() fails 2017-11-08 10:08:34 +01:00
of.c PCI/MSI: Use of_msi_get_domain instead of open-coded "msi-parent" parsing 2015-10-16 13:07:14 +01:00
pci-acpi.c PCI: Query platform firmware for device power state 2016-09-28 11:46:51 -05:00
pci-driver.c PCI/PM: Restore the status of PCI devices across hibernation 2017-07-27 15:08:00 -07:00
pci-label.c PCI: Fix broken URL for Dell biosdevname 2016-02-29 12:03:19 -06:00
pci-mid.c x86/platform/intel-mid: Retrofit pci_platform_pm_ops ->get_state hook 2016-11-07 13:06:59 +01:00
pci-stub.c PCI: Whitespace cleanup 2014-06-10 20:20:19 -06:00
pci-sysfs.c PCI: Fix race condition with driver_override 2017-10-05 09:44:03 +02:00
pci.c PCI: Avoid bus reset if bridge itself is broken 2017-12-25 14:23:44 +01:00
pci.h PCI: Remove pci_resource_bar() and pci_iov_resource_bar() 2017-03-22 12:43:36 +01:00
probe.c PCI: Do not allocate more buses than available in parent 2017-12-20 10:07:28 +01:00
proc.c PCI: Only allow WC mmap on prefetchable resources 2017-05-25 15:44:47 +02:00
quirks.c PCI: Set Cavium ACS capability quirk flags to assert RR/CR/SV/UF 2017-11-30 08:39:02 +00:00
remove.c PCI: Detach driver before procfs & sysfs teardown on device remove 2017-12-20 10:07:31 +01:00
rom.c PCI: Add comments about ROM BAR updating 2017-03-22 12:43:36 +01:00
search.c PCI: Add support for multiple DMA aliases 2016-04-11 14:34:32 -05:00
setup-bus.c x86/ioapic: Ignore root bridges without a companion ACPI device 2016-09-10 20:30:31 +02:00
setup-irq.c PCI: Export symbols required for loadable host driver modules 2015-04-08 14:17:10 -05:00
setup-res.c PCI: Ignore BAR updates on virtual functions 2017-03-22 12:43:37 +01:00
slot.c PCI: Hold pci_slot_mutex while searching bus->slots list 2015-07-30 16:19:53 -05:00
syscall.c PCI: Whitespace cleanup 2014-06-10 20:20:19 -06:00
vc.c PCI: Fix unaligned accesses in VC code 2016-06-20 13:24:20 -05:00
vpd.c pci: Fix files needing export.h for EXPORT_SYMBOL/THIS_MODULE 2011-10-31 19:31:22 -04:00
xen-pcifront.c treewide: replace obsolete _refok by __ref 2016-08-02 17:31:41 -04:00