diff options
author | Julian Wiedmann <jwi@linux.vnet.ibm.com> | 2018-04-19 12:52:10 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-04-22 14:42:32 -0400 |
commit | db71bbbd11a4d314f0fa3fbf3369b71cf33ce33c (patch) | |
tree | b4d33d750b092082be8932b91608b68be84aafa1 /drivers/s390/net/qeth_core_mpc.h | |
parent | bcacfcbc82b4235d280ed9b067aa4567f4a0c756 (diff) | |
download | linux-db71bbbd11a4d314f0fa3fbf3369b71cf33ce33c.tar.gz linux-db71bbbd11a4d314f0fa3fbf3369b71cf33ce33c.tar.bz2 linux-db71bbbd11a4d314f0fa3fbf3369b71cf33ce33c.zip |
s390/qeth: fix request-side race during cmd IO timeout
Submitting a cmd IO request (usually on the WRITE device, but for IDX
also on the READ device) is currently done with ccw_device_start()
and a manual timeout in the caller.
On timeout, the caller cleans up the related resources (eg. IO buffer).
But 1) the IO might still be active and utilize those resources, and
2) when the IO completes, qeth_irq() will attempt to clean up the
same resources again.
Instead of introducing additional resource locking, switch to
ccw_device_start_timeout() to ensure IO termination after timeout, and
let the IRQ handler alone deal with cleaning up after a request.
This also removes a stray write->irq_pending reset from
clear_ipacmd_list(). The routine doesn't terminate any pending IO on
the WRITE device, so this should be handled properly via IO timeout
in the IRQ handler.
Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390/net/qeth_core_mpc.h')
-rw-r--r-- | drivers/s390/net/qeth_core_mpc.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h index 619f897b4bb0..f4d1ec0b8f5a 100644 --- a/drivers/s390/net/qeth_core_mpc.h +++ b/drivers/s390/net/qeth_core_mpc.h @@ -35,6 +35,18 @@ extern unsigned char IPA_PDU_HEADER[]; #define QETH_HALT_CHANNEL_PARM -11 #define QETH_RCD_PARM -12 +static inline bool qeth_intparm_is_iob(unsigned long intparm) +{ + switch (intparm) { + case QETH_CLEAR_CHANNEL_PARM: + case QETH_HALT_CHANNEL_PARM: + case QETH_RCD_PARM: + case 0: + return false; + } + return true; +} + /*****************************************************************************/ /* IP Assist related definitions */ /*****************************************************************************/ |