Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99ad198c authored by Stefano Stabellini's avatar Stefano Stabellini Committed by Jeremy Fitzhardinge
Browse files

xen: Fix find_unbound_irq in presence of ioapic irqs.



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: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
parent 016b6f5f
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -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");
@@ -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;
}