Regression in 3.2.9 for omap-serial (at least)

Enrico Scholz enrico.scholz at sigma-chemnitz.de
Thu Mar 8 05:55:13 EST 2012


Hi,

the commit "genirq: Unmask oneshot irqs when thread was not woken"[1]
breaks at least the omap-serial driver which requests a shared interrupt
as

 --- arch/arm/mach-omap2/serial.c ---
	ret = request_threaded_irq(uart->irq, NULL, omap_uart_interrupt,
				   IRQF_SHARED, "serial idle", (void *)uart);

 --- drivers/tty/serial/omap-serial.c
	retval = request_irq(up->port.irq, serial_omap_irq, up->port.irqflags,
				up->name, up);


(note the missing IRQF_ONESHOT in the first piece of code)


Where previously 

  if (!irqd_irq_disabled(&desc->irq_data) && !(desc->istate & IRQS_ONESHOT))
          unmask_irq(desc);

was checked in kernel/irq/chip.c, now

  if (!irqd_irq_disabled(&desc->irq_data) &&
  	    irqd_irq_masked(&desc->irq_data) && !desc->threads_oneshot)
  		unmask_irq(desc);

will be done.

Because the threaded irq was requested without IRQF_ONESHOT, IRQS_ONESHOT
is not set but 'desc->threads_oneshot' is 1 due to the threaded irq. So,
irq was unmasked with old code but stays masked with the new one.  The new
behavior renders systems unusable because console becomes disfunctional.




Enrico

Footnotes: 
[1]  aa0eb3474beae8f6d9dcc2311dc02bea50cfd7b7



More information about the linux-arm-kernel mailing list