lguest: fix for CONFIG_SPARSE_IRQ=y
Impact: remove lots of lguest boot WARN_ON() when CONFIG_SPARSE_IRQ=y We now need to call irq_to_desc_alloc_cpu() before set_irq_chip_and_handler_name(), but we can't do that from init_IRQ (no kmalloc available). So do it as we use interrupts instead. Also means we only alloc for irqs we use, which was the intent of CONFIG_SPARSE_IRQ anyway. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Cc: Ingo Molnar <mingo@redhat.com>
This commit is contained in:
@@ -594,19 +594,21 @@ static void __init lguest_init_IRQ(void)
|
||||
/* Some systems map "vectors" to interrupts weirdly. Lguest has
|
||||
* a straightforward 1 to 1 mapping, so force that here. */
|
||||
__get_cpu_var(vector_irq)[vector] = i;
|
||||
if (vector != SYSCALL_VECTOR) {
|
||||
set_intr_gate(vector,
|
||||
interrupt[vector-FIRST_EXTERNAL_VECTOR]);
|
||||
set_irq_chip_and_handler_name(i, &lguest_irq_controller,
|
||||
handle_level_irq,
|
||||
"level");
|
||||
}
|
||||
if (vector != SYSCALL_VECTOR)
|
||||
set_intr_gate(vector, interrupt[i]);
|
||||
}
|
||||
/* This call is required to set up for 4k stacks, where we have
|
||||
* separate stacks for hard and soft interrupts. */
|
||||
irq_ctx_init(smp_processor_id());
|
||||
}
|
||||
|
||||
void lguest_setup_irq(unsigned int irq)
|
||||
{
|
||||
irq_to_desc_alloc_cpu(irq, 0);
|
||||
set_irq_chip_and_handler_name(irq, &lguest_irq_controller,
|
||||
handle_level_irq, "level");
|
||||
}
|
||||
|
||||
/*
|
||||
* Time.
|
||||
*
|
||||
|
Reference in New Issue
Block a user