• Ido Yariv's avatar
    genirq: Flush the irq thread on synchronization · 7140ea19
    Ido Yariv authored
    The current implementation does not always flush the threaded handler
    when disabling the irq. In case the irq handler was called, but the
    threaded handler hasn't started running yet, the interrupt will be
    flagged as pending, and the handler will not run. This implementation
    has some issues:
    
    First, if the interrupt is a wake source and flagged as pending, the
    system will not be able to suspend.
    
    Second, when quickly disabling and re-enabling the irq, the threaded
    handler might continue to run after the irq is re-enabled without the
    irq handler being called first. This might be an unexpected behavior.
    
    In addition, it might be counter-intuitive that the threaded handler
    will not be called even though the irq handler was called and returned
    IRQ_WAKE_THREAD.
    
    Fix this by always waiting for the threaded handler to complete in
    synchronize_irq().
    
    [ tglx: Massaged comments, added WARN_ONs and the missing
      	IRQTF_RUNTHREAD check in exit_irq_thread() ]
    Signed-off-by: default avatarIdo Yariv <ido@wizery.com>
    Link: http://lkml.kernel.org/r/1322843052-7166-1-git-send-email-ido@wizery.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    7140ea19
handle.c 5.08 KB