From: David Miller Date: Fri, 11 May 2007 20:26:44 +0000 (-0700) Subject: Fix assertion failure with MSI on sparc64 X-Git-Tag: v2.6.22-rc1~21 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3b7cc7b4138f4171da5813b5ec2a14835e02482;p=linux-2.6 Fix assertion failure with MSI on sparc64 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 Signed-off-by: Linus Torvalds --- diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index e6740d1a08..d9cbd586ae 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);