summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-10-10 01:30:04 +0200
committerLinus Torvalds <torvalds@linux-foundation.org>2026-10-10 01:30:04 +0200
commit3857c2fe5449541e24afc5efdb0f81a8a8f9a3a0 (patch)
tree9274ea2a042a38c82b47be3b6db224da687aa17d
parentb71ccf604fbdf78450d3b17b5d69365caba29061 (diff)
parent79c168e2aa957ed0054c93db17caba653b95e377 (diff)
Merge tag 'pci-v7.3-fixes-4' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci
Pull PCI fix from Bjorn Helgaas: "This fixes some GPU initialization regressions caused by eddba19b8b5f ("PCI/AER: Support Advisory Non-Fatal Errors"), which appeared in v7.3-rc1. That commit also caused a MacBookPro16,1 spontaneous power-off regression; I expect a fix for that next week" * tag 'pci-v7.3-fixes-4' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci: PCI/AER: Skip error recovery on false alarms
-rw-r--r--drivers/pci/pcie/aer.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index d8dcd238fda1..922a726a52a5 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1360,8 +1360,10 @@ static DEFINE_KFIFO(aer_recover_ring, struct aer_recover_entry,
static void aer_recover_work_func(struct work_struct *work)
{
+ struct aer_capability_regs *regs;
struct aer_recover_entry entry;
struct pci_dev *pdev;
+ u32 err;
while (kfifo_get(&aer_recover_ring, &entry)) {
pdev = pci_get_domain_bus_and_slot(entry.domain, entry.bus,
@@ -1375,6 +1377,12 @@ static void aer_recover_work_func(struct work_struct *work)
}
pci_print_aer(pdev, entry.severity, entry.regs);
+ regs = entry.regs;
+ if (entry.severity == AER_CORRECTABLE)
+ err = regs->cor_status & ~regs->cor_mask;
+ else
+ err = regs->uncor_status & ~regs->uncor_mask;
+
/*
* Memory for aer_capability_regs(entry.regs) is being
* allocated from the ghes_estatus_pool to protect it from
@@ -1385,12 +1393,14 @@ static void aer_recover_work_func(struct work_struct *work)
ghes_estatus_pool_region_free((unsigned long)entry.regs,
sizeof(struct aer_capability_regs));
- if (entry.severity == AER_NONFATAL)
- pcie_do_recovery(pdev, pci_channel_io_normal,
- aer_root_reset);
- else if (entry.severity == AER_FATAL)
- pcie_do_recovery(pdev, pci_channel_io_frozen,
- aer_root_reset);
+ if (err) {
+ if (entry.severity == AER_NONFATAL)
+ pcie_do_recovery(pdev, pci_channel_io_normal,
+ aer_root_reset);
+ else if (entry.severity == AER_FATAL)
+ pcie_do_recovery(pdev, pci_channel_io_frozen,
+ aer_root_reset);
+ }
pci_dev_put(pdev);
}
}