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

Commit d1b758eb authored by Konrad Rzeszutek Wilk's avatar Konrad Rzeszutek Wilk
Browse files

xen/irq: Cleanup the find_unbound_irq



The "find_unbound_irq" is a bit unusual - it allocates
virtual IRQ (event channels) in reverse order. This means
starting at the "top" of the available IRQs (nr_irqs) down
to the GSI/MSI IRQs (nr_irqs_gsi). Lets document this and
also make the variables easier to understand.

Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent cf7d7e5a
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -405,15 +405,21 @@ static int find_unbound_irq(void)
{
	struct irq_data *data;
	int irq, res;
	int start = get_nr_hw_irqs();
	int bottom = get_nr_hw_irqs();
	int top = nr_irqs-1;

	if (start == nr_irqs)
	if (bottom == nr_irqs)
		goto no_irqs;

	/* nr_irqs is a magic value. Must not use it.*/
	for (irq = nr_irqs-1; irq > start; irq--) {
	/* This loop starts from the top of IRQ space and goes down.
	 * We need this b/c if we have a PCI device in a Xen PV guest
	 * we do not have an IO-APIC (though the backend might have them)
	 * mapped in. To not have a collision of physical IRQs with the Xen
	 * event channels start at the top of the IRQ space for virtual IRQs.
	 */
	for (irq = top; irq > bottom; irq--) {
		data = irq_get_irq_data(irq);
		/* only 0->15 have init'd desc; handle irq > 16 */
		/* only 15->0 have init'd desc; handle irq > 16 */
		if (!data)
			break;
		if (data->chip == &no_irq_chip)
@@ -424,7 +430,7 @@ static int find_unbound_irq(void)
			return irq;
	}

	if (irq == start)
	if (irq == bottom)
		goto no_irqs;

	res = irq_alloc_desc_at(irq, -1);