genirq: Allow check_wakeup_irqs to notice level-triggered interrupts
authorThomas Gleixner <tglx@linutronix.de>
Wed, 25 Apr 2012 10:54:54 +0000 (12:54 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 4 May 2012 21:38:50 +0000 (23:38 +0200)
commitd4dc0f90d243fb54cfbca6601c9a7c5a758e437f
treec868d2debe4a4f8d802ad6bbaa257bb5be83dd22
parentf5d89470f91f2e67eeaf350c730ae8412c3a98e3
genirq: Allow check_wakeup_irqs to notice level-triggered interrupts

Level triggered interrupts do not cause IRQS_PENDING to be set when
they fire while "disabled" as the 'pending' state is always present in
the level - they automatically refire where re-enabled.

However the IRQS_PENDING flag is also used to abort a suspend cycle -
if any 'is_wakeup_set' interrupt is PENDING, check_wakeup_irqs() will
cause suspend to abort. Without IRQS_PENDING, suspend won't abort.

Consequently, level-triggered interrupts that fire during the 'noirq'
phase of suspend do not currently abort suspend.

So set IRQS_PENDING even for level triggered interrupts, and make sure
to clear the flag in check_irq_resend.

[ Changelog by courtesy of Neil ]

Tested-by: NeilBrown <neilb@suse.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
kernel/irq/chip.c
kernel/irq/resend.c