irq_alloc() returns zero on failure, but build_irq() then configures IRQ 0, which is reserved for the timer, as a device interrupt.
Halt before publishing the IRQ or changing its descriptor, matching the existing fatal handler-data allocation path. Returning zero would let callers continue treating the timer IRQ as a valid device interrupt. Signed-off-by: Magnus Lindholm <[email protected]> --- arch/sparc/kernel/irq_64.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 3f55c69d5f3b..4cceeba726ab 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -619,6 +619,10 @@ unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap) irq = bucket_get_irq(__pa(bucket)); if (!irq) { irq = irq_alloc(0, ino); + if (!irq) { + prom_printf("IRQ: cannot allocate interrupt descriptor.\n"); + prom_halt(); + } bucket_set_irq(__pa(bucket), irq); irq_set_chip_and_handler_name(irq, &sun4u_irq, handle_fasteoi_irq, "IVEC");
