Skip to content

Commit

Permalink
xen: Fix find_unbound_irq in presence of ioapic irqs.
Browse files Browse the repository at this point in the history
Don't break the assumption that the first 16 irqs are ISA irqs;
make sure that the irq is actually free before using it.

Use dynamic_irq_init_keep_chip_data instead of
dynamic_irq_init so that chip_data is not NULL (a NULL chip_data breaks
setup_vector_irq).

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
  • Loading branch information
Stefano Stabellini authored and Jeremy Fitzhardinge committed Jul 22, 2010
1 parent 016b6f5 commit 99ad198
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions drivers/xen/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,9 +340,18 @@ static int find_unbound_irq(void)
int irq;
struct irq_desc *desc;

for (irq = 0; irq < nr_irqs; irq++)
for (irq = 0; irq < nr_irqs; irq++) {
desc = irq_to_desc(irq);
/* only 0->15 have init'd desc; handle irq > 16 */
if (desc == NULL)
break;
if (desc->chip == &no_irq_chip)
break;
if (desc->chip != &xen_dynamic_chip)
continue;
if (irq_info[irq].type == IRQT_UNBOUND)
break;
}

if (irq == nr_irqs)
panic("No available IRQ to bind to: increase nr_irqs!\n");
Expand All @@ -351,7 +360,7 @@ static int find_unbound_irq(void)
if (WARN_ON(desc == NULL))
return -1;

dynamic_irq_init(irq);
dynamic_irq_init_keep_chip_data(irq);

return irq;
}
Expand Down

0 comments on commit 99ad198

Please sign in to comment.