Re: [PATCH v7 3/5] PCI/AER: Report fatal errors of RCiEP and EP if link recoverd
From: Jonathan Cameron <hidden>
Date: 2026-01-27 10:36:47
Also in:
linux-pci, lkml
On Sat, 24 Jan 2026 15:45:55 +0800 Shuai Xue [off-list ref] wrote:
The AER driver has historically avoided reading the configuration space of an endpoint or RCiEP that reported a fatal error, considering the link to that device unreliable. Consequently, when a fatal error occurs, the AER and DPC drivers do not report specific error types, resulting in logs like: pcieport 0015:00:00.0: EDR: EDR event received pcieport 0015:00:00.0: EDR: Reported EDR dev: 0015:00:00.0 pcieport 0015:00:00.0: DPC: containment event, status:0x200d, ERR_FATAL received from 0015:01:00.0 pcieport 0015:00:00.0: AER: broadcast error_detected message pcieport 0015:00:00.0: AER: broadcast mmio_enabled message pcieport 0015:00:00.0: AER: broadcast resume message pcieport 0015:00:00.0: pciehp: Slot(21): Link Down/Up ignored pcieport 0015:00:00.0: AER: device recovery successful pcieport 0015:00:00.0: EDR: DPC port successfully recovered pcieport 0015:00:00.0: EDR: Status for 0015:00:00.0: 0x80 AER status registers are sticky and Write-1-to-clear. If the link recovered after hot reset, we can still safely access AER status and TLP header of the error device. In such case, report fatal errors which helps to figure out the error root case. After this patch, the logs like: pcieport 0015:00:00.0: EDR: EDR event received pcieport 0015:00:00.0: EDR: Reported EDR dev: 0015:00:00.0 pcieport 0015:00:00.0: DPC: containment event, status:0x200d, ERR_FATAL received from 0015:01:00.0 pcieport 0015:00:00.0: AER: broadcast error_detected message + vfio-pci 0015:01:00.0: AER: Errors reported prior to reset + vfio-pci 0015:01:00.0: PCIe Bus Error: severity=Uncorrectable (Fatal), type=Transaction Layer, (Receiver ID) + vfio-pci 0015:01:00.0: device [144d:a80a] error status/mask=00001000/00400000 + vfio-pci 0015:01:00.0: [12] TLP (First) + vfio-pci 0015:01:00.0: AER: TLP Header: 0x4a004010 0x00000040 0x01000000 0xffffffff pcieport 0015:00:00.0: AER: broadcast mmio_enabled message pcieport 0015:00:00.0: AER: broadcast resume message pcieport 0015:00:00.0: pciehp: Slot(21): Link Down/Up ignored pcieport 0015:00:00.0: AER: device recovery successful pcieport 0015:00:00.0: EDR: DPC port successfully recovered pcieport 0015:00:00.0: EDR: Status for 0015:00:00.0: 0x80 Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
Hi Shuai, With the structure zeroed below (just to make this easier to review, not because there is a bug as far as I can see) Reviewed-by: Jonathan Cameron <redacted>
quoted hunk ↗ jump to hunk
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c index e0bcaa896803..4c0a2bbe9197 100644 --- a/drivers/pci/pcie/aer.c +++ b/drivers/pci/pcie/aer.c
quoted hunk ↗ jump to hunk
@@ -1447,17 +1450,38 @@ int aer_get_device_error_info(struct aer_err_info *info, int i) return 1; } +void aer_report_frozen_error(struct pci_dev *dev) +{ + struct aer_err_info info; + int type = pci_pcie_type(dev); + + if (type != PCI_EXP_TYPE_ENDPOINT && type != PCI_EXP_TYPE_RC_END) + return; +
struct aer_err_info has a bunch of fields. I'd just make sure it's zeroed
to avoid us having to check that they are all filled in. = {};
or do it with the initial values being assigned.
info = (struct aer_err_info) {
.err_dev_num = 0,
.severity = AER_FATAL,
.level = KERN_ERR,
};
add_error_device(&info, dev);
+ info.error_dev_num = 0;
+ info.severity = AER_FATAL;
+ info.level = KERN_ERR;
+ add_error_device(&info, dev);
+
+ if (aer_get_device_error_info(&info, 0, true)) {
+ pci_err(dev, "Errors reported prior to reset\n");
+ aer_print_error(&info, 0);
+ }
+
+ pci_dev_put(dev); /* pairs with pci_dev_get() in add_error_device() */
+}