• Julian Wiedmann's avatar
    s390/qeth: wake up all waiters from qeth_irq() · 7359393f
    Julian Wiedmann authored
    card->wait_q is shared by different users, for different wake-up
    conditions. qeth_irq() can potentially trigger multiple of these
    conditions:
    1) A change to channel->irq_pending, which qeth_send_control_data() is
       waiting for.
    2) A change to card->state, which qeth_clear_channel() and
       qeth_halt_channel() are waiting for.
    
    As qeth_irq() does only a single wake_up(), we might miss to wake up
    a second eligible waiter. Luckily all waiters are guarded with a
    timeout, so this situation should recover on its own eventually.
    
    To make things work robustly, add an additional wake_up() for changes
    to channel->state. And extract a helper that updates
    channel->irq_pending along with the needed wake_up().
    Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    7359393f
qeth_core.h 29.8 KB