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

Commit c4fa0bbf authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Linus Torvalds
Browse files

[PATCH] genirq: x86_64 irq: Dynamic irq support



The current implementation of create_irq() is a hack but it is the current
hack that msi.c uses, and unfortunately the ``generic'' apic msi ops depend on
this hack.  Thus we are this hack of assuming irq == vector until the
depencencies in the generic irq code are removed.

Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Rajesh Shah <rajesh.shah@intel.com>
Cc: Andi Kleen <ak@muc.de>
Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 3fc471ed
Loading
Loading
Loading
Loading
+46 −5
Original line number Diff line number Diff line
@@ -1254,11 +1254,6 @@ static int ioapic_retrigger_vector(unsigned int vector)
 * races.
 */

static void ack_apic(unsigned int irq)
{
	ack_APIC_irq();
}

static void ack_apic_edge(unsigned int irq)
{
	move_native_irq(irq);
@@ -1698,6 +1693,52 @@ static int __init ioapic_init_sysfs(void)

device_initcall(ioapic_init_sysfs);

#ifdef CONFIG_PCI_MSI
/*
 * Dynamic irq allocate and deallocation for MSI
 */
int create_irq(void)
{
	/* Hack of the day: irq == vector.
	 *
	 * Ultimately this will be be more general,
	 * and not depend on the irq to vector identity mapping.
	 * But this version is needed until msi.c can cope with
	 * the more general form.
	 */
	int irq, vector;
	unsigned long flags;
	vector = assign_irq_vector(AUTO_ASSIGN);
	irq = vector;

	if (vector >= 0) {
		spin_lock_irqsave(&vector_lock, flags);
		vector_irq[vector] = irq;
		irq_vector[irq] = vector;
		spin_unlock_irqrestore(&vector_lock, flags);

		set_intr_gate(vector, interrupt[irq]);

		dynamic_irq_init(irq);
	}
	return irq;
}

void destroy_irq(unsigned int irq)
{
	unsigned long flags;
	unsigned int vector;

	dynamic_irq_cleanup(irq);

	spin_lock_irqsave(&vector_lock, flags);
	vector = irq_vector[irq];
	vector_irq[vector] = -1;
	irq_vector[irq] = 0;
	spin_unlock_irqrestore(&vector_lock, flags);
}
#endif

/* --------------------------------------------------------------------------
                          ACPI-based IOAPIC Configuration
   -------------------------------------------------------------------------- */