Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'please-pull-aertracefix' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras

Pull aer error logging fix from Tony Luck:
"Can't call pci_get_domain_bus_and_slot() from interupt context"

* tag 'please-pull-aertracefix' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras:
aerdrv: Move cper_print_aer() call out of interrupt context

+12 -24
-18
drivers/acpi/apei/cper.c
··· 250 250 static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie, 251 251 const struct acpi_hest_generic_data *gdata) 252 252 { 253 - #ifdef CONFIG_ACPI_APEI_PCIEAER 254 - struct pci_dev *dev; 255 - #endif 256 - 257 253 if (pcie->validation_bits & CPER_PCIE_VALID_PORT_TYPE) 258 254 printk("%s""port_type: %d, %s\n", pfx, pcie->port_type, 259 255 pcie->port_type < ARRAY_SIZE(cper_pcie_port_type_strs) ? ··· 281 285 printk( 282 286 "%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n", 283 287 pfx, pcie->bridge.secondary_status, pcie->bridge.control); 284 - #ifdef CONFIG_ACPI_APEI_PCIEAER 285 - dev = pci_get_domain_bus_and_slot(pcie->device_id.segment, 286 - pcie->device_id.bus, pcie->device_id.function); 287 - if (!dev) { 288 - pr_err("PCI AER Cannot get PCI device %04x:%02x:%02x.%d\n", 289 - pcie->device_id.segment, pcie->device_id.bus, 290 - pcie->device_id.slot, pcie->device_id.function); 291 - return; 292 - } 293 - if (pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) 294 - cper_print_aer(pfx, dev, gdata->error_severity, 295 - (struct aer_capability_regs *) pcie->aer_info); 296 - pci_dev_put(dev); 297 - #endif 298 288 } 299 289 300 290 static const char *apei_estatus_section_flag_strs[] = {
+3 -1
drivers/acpi/apei/ghes.c
··· 454 454 aer_severity = cper_severity_to_aer(sev); 455 455 aer_recover_queue(pcie_err->device_id.segment, 456 456 pcie_err->device_id.bus, 457 - devfn, aer_severity); 457 + devfn, aer_severity, 458 + (struct aer_capability_regs *) 459 + pcie_err->aer_info); 458 460 } 459 461 460 462 }
+4 -1
drivers/pci/pcie/aer/aerdrv_core.c
··· 580 580 u8 devfn; 581 581 u16 domain; 582 582 int severity; 583 + struct aer_capability_regs *regs; 583 584 }; 584 585 585 586 static DEFINE_KFIFO(aer_recover_ring, struct aer_recover_entry, ··· 594 593 static DECLARE_WORK(aer_recover_work, aer_recover_work_func); 595 594 596 595 void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn, 597 - int severity) 596 + int severity, struct aer_capability_regs *aer_regs) 598 597 { 599 598 unsigned long flags; 600 599 struct aer_recover_entry entry = { ··· 602 601 .devfn = devfn, 603 602 .domain = domain, 604 603 .severity = severity, 604 + .regs = aer_regs, 605 605 }; 606 606 607 607 spin_lock_irqsave(&aer_recover_ring_lock, flags); ··· 629 627 PCI_SLOT(entry.devfn), PCI_FUNC(entry.devfn)); 630 628 continue; 631 629 } 630 + cper_print_aer(pdev, entry.severity, entry.regs); 632 631 do_recovery(pdev, entry.severity); 633 632 pci_dev_put(pdev); 634 633 }
+2 -2
drivers/pci/pcie/aer/aerdrv_errprint.c
··· 220 220 } 221 221 EXPORT_SYMBOL_GPL(cper_severity_to_aer); 222 222 223 - void cper_print_aer(const char *prefix, struct pci_dev *dev, int cper_severity, 223 + void cper_print_aer(struct pci_dev *dev, int cper_severity, 224 224 struct aer_capability_regs *aer) 225 225 { 226 226 int aer_severity, layer, agent, status_strs_size, tlp_header_valid = 0; ··· 244 244 agent = AER_GET_AGENT(aer_severity, status); 245 245 dev_err(&dev->dev, "aer_status: 0x%08x, aer_mask: 0x%08x\n", 246 246 status, mask); 247 - cper_print_bits(prefix, status, status_strs, status_strs_size); 247 + cper_print_bits("", status, status_strs, status_strs_size); 248 248 dev_err(&dev->dev, "aer_layer=%s, aer_agent=%s\n", 249 249 aer_error_layer[layer], aer_agent_string[agent]); 250 250 if (aer_severity != AER_CORRECTABLE)
+3 -2
include/linux/aer.h
··· 49 49 } 50 50 #endif 51 51 52 - extern void cper_print_aer(const char *prefix, struct pci_dev *dev, 52 + extern void cper_print_aer(struct pci_dev *dev, 53 53 int cper_severity, struct aer_capability_regs *aer); 54 54 extern int cper_severity_to_aer(int cper_severity); 55 55 extern void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn, 56 - int severity); 56 + int severity, 57 + struct aer_capability_regs *aer_regs); 57 58 #endif //_AER_H_ 58 59