• Julian Wiedmann's avatar
    s390/qdio: add tighter controls for IRQ polling · 13099824
    Julian Wiedmann authored
    Once the call to qdio_establish() has completed, qdio is free to deliver
    data IRQs to the device driver's IRQ poll handler.
    
    For qeth (the only qdio driver that currently uses IRQ polling) this is
    problematic, since the IRQs can arrive before its NAPI instance is
    even registered. Calling napi_schedule() from qeth_qdio_start_poll()
    then crashes in various nasty ways.
    
    Until recently qeth checked for IFF_UP to drop such early interrupts,
    but that's fragile as well since it doesn't enforce any ordering.
    
    Fix this properly by bringing up the qdio device in IRQS_DISABLED mode,
    and have the driver explicitly opt-in to receive data IRQs.
    qeth does so from qeth_open(), which kick-starts a NAPI poll and then
    calls qdio_start_irq() from qeth_poll().
    
    Also add a matching qdio_stop_irq() in qeth_stop() to switch the qdio
    dataplane back into a disabled state.
    
    Fixes: 3d35dbe6 ("s390/qeth: don't check for IFF_UP when scheduling napi")
    CC: Qian Cai <cai@lca.pw>
    Reported-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
    Acked-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    13099824
qeth_core_main.c 176 KB