lkml.org 
[lkml]   [2008]   [Aug]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 1/2] pci: add misrouted interrupt error handling
On Sun, Aug 03, 2008 at 01:02:12PM -0500, James Bottomley wrote:
> +static void pci_note_irq_problem(struct pci_dev *pdev, const char *reason)
> +{
> + struct pci_dev *parent = to_pci_dev(pdev->dev.parent);
> +
> + dev_printk(KERN_ERR, &pdev->dev,
> + "Potentially misrouted IRQ (Bridge %s %04x:%04x)\n",
> + parent->dev.bus_id, parent->vendor, parent->device);
> + dev_printk(KERN_ERR, &pdev->dev, "%s\n", reason);
> + dev_printk(KERN_ERR, &pdev->dev, "Please report to linux-kernel@vger.kernel.org\n");
> + WARN_ON(1);
> +}

Will the dev_printk() strings be included in the kerneloops report? And
what if there is no parent of the device? Consider device 00:02.0 on my
laptop:

00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 03)
Subsystem: Fujitsu Limited. Device 13fe
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin A routed to IRQ 16

> +enum pci_lost_interrupt_reason pci_lost_interrupt(struct pci_dev *pdev)
> +{
> + if (pdev->msi_enabled || pdev->msix_enabled) {
> + enum pci_lost_interrupt_reason ret;
> +
> + if (pdev->msix_enabled) {
> + pci_note_irq_problem(pdev, "MSIX routing failure");
> + ret = PCI_LOST_IRQ_DISABLE_MSIX;
> + } else {
> + pci_note_irq_problem(pdev, "MSI routing failure");
> + ret = PCI_LOST_IRQ_DISABLE_MSI;
> + }
> + return ret;
> + }

Couldn't this be written more concisely as:

if (pdev->msix_enabled) {
pci_note_irq_problem(pdev, "MSIX routing failure");
return PCI_LOST_IRQ_DISABLE_MSIX;
}
if (pdev->msi_enabled) {
pci_note_irq_problem(pdev, "MSI routing failure");
return PCI_LOST_IRQ_DISABLE_MSI;
}

> +#ifdef CONFIG_ACPI
> + if (!(acpi_disabled || acpi_noirq)) {
> + pci_note_irq_problem(pdev, "Potential ACPI misrouting please reboot with acpi=noirq");
> + /* currently no way to fix acpi on the fly */
> + return PCI_LOST_IRQ_DISABLE_ACPI;
> + }
> +#endif
> + pci_note_irq_problem(pdev, "unknown cause (not MSI or ACPI)");
> + return PCI_LOST_IRQ_NO_INFORMATION;
> +}
> +EXPORT_SYMBOL(pci_lost_interrupt);


\
 
 \ /
  Last update: 2008-08-04 04:55    [W:0.111 / U:0.024 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site