Messages in this thread Patch in this message | | | Date | Fri, 11 May 2007 13:26:44 -0700 (PDT) | Subject | [PATCH]: Fix assertion failure with MSI on sparc64 | From | David Miller <> |
| |
Hi Michael, I'm still working through the various regressions on sparc64 added by your MSI changes :-)
The one I fixed the other day was a missed switch over to alloc_pci_dev() in the sparc64 PCI probing code which caused an OOPS in pci_enable_msi() because the list head of the pci dev was not initialized. PowerPC's OBP firmware tree based PCI probing code was updated, sparc64's wasnt.
Today's find is a triggered assertion in msi_free_irqs() when the system doesn't support MSI, in which case arch_setup_msi_irqs() always returns an error.
The problem is that when this happens we branch into msi_free_irqs(), to which you added the following assertion loop:
list_for_each_entry(entry, &dev->msi_list, list) BUG_ON(irq_has_action(entry->irq));
Well, if arch_setup_msi_irqs() fails, entry->irq will be zero and although that's never assigned to any normal devices we use that IRQ number for the timer interrupt on sparc64 so this assertion triggers.
Better to test for zero before doing the irq_has_action() assertion thing.
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index e6740d1..d9cbd58 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -549,8 +549,10 @@ static int msi_free_irqs(struct pci_dev* dev) { struct msi_desc *entry, *tmp; - list_for_each_entry(entry, &dev->msi_list, list) - BUG_ON(irq_has_action(entry->irq)); + list_for_each_entry(entry, &dev->msi_list, list) { + if (entry->irq) + BUG_ON(irq_has_action(entry->irq)); + } arch_teardown_msi_irqs(dev); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |