Messages in this thread | | | Date | Wed, 30 Oct 2013 10:44:32 +0800 | Subject | BUG_ON(irq_has_action(entry->irq + i)) in free_msi_irqs() | From | "LF.Tan" <> |
| |
Hi all
I am new in PCI and now working on MSI support on our PCIe host driver. I have an endpoint driver requests for a MSI interrupt. When the endpoint driver try to free the interrupt, it cause the kernel BUG_ON() message is printed out.
The software flow: Endpoint driver --> pci_disable_msi -->free_msi_irqs --> BUG_ON(irq_has_action(entry->irq + i));
I have checked desc->action in irq_has_action(), it is non-zero. It is running on ARM platform. CONFIG_GENERIC_HARDIRQS is turn on by default.
Anyone how to fix this issue? Thanks.
static void free_msi_irqs(struct pci_dev *dev) { struct msi_desc *entry, *tmp;
list_for_each_entry(entry, &dev->msi_list, list) { int i, nvec;
if (!entry->irq) continue; nvec = 1 << entry->msi_attrib.multiple; #ifdef CONFIG_GENERIC_HARDIRQS for (i = 0; i < nvec; i++) BUG_ON(irq_has_action(entry->irq + i)); #endif } ..................... }
static inline int irq_has_action(unsigned int irq) { struct irq_desc *desc = irq_to_desc(irq); return desc->action != NULL; }
Regards LF Tan
| |