1
0
Fork 0
alistair23-linux/drivers/s390
Julian Wiedmann 465b10fee9 s390/qeth: fix dangling IO buffers after halt/clear
[ Upstream commit f9e50b02a9 ]

The cio layer's intparm logic does not align itself well with how qeth
manages cmd IOs. When an active IO gets terminated via halt/clear, the
corresponding IRQ's intparm does not reflect the cmd buffer but rather
the intparm that was passed to ccw_device_halt() / ccw_device_clear().
This behaviour was recently clarified in
commit b91d9e67e5 ("s390/cio: fix intparm documentation").

As a result, qeth_irq() currently doesn't cancel a cmd that was
terminated via halt/clear. This primarily causes us to leak
card->read_cmd after the qeth device is removed, since our IO path still
holds a refcount for this cmd.

For qeth this means that we need to keep track of which IO is pending on
a device ('active_cmd'), and use this as the intparm when calling
halt/clear. Otherwise qeth_irq() can't match the subsequent IRQ to its
cmd buffer.
Since we now keep track of the _expected_ intparm, we can also detect
any mismatch; this would constitute a bug somewhere in the lower layers.
In this case cancel the active cmd - we effectively "lost" the IRQ and
should not expect any further notification for this IO.

Fixes: 405548959c ("s390/qeth: add support for dynamically allocated cmds")
Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-01-26 10:01:09 +01:00
..
block s390/dasd: fix memleak in path handling error case 2020-01-12 12:21:43 +01:00
char s390 updates for the 5.4 merge window 2019-09-17 14:04:43 -07:00
cio s390/dasd/cio: Interpret ccw_device_get_mdc return value correctly 2020-01-12 12:21:43 +01:00
crypto s390/pkey: fix memory leak within _copy_apqns_from_user() 2020-01-26 10:01:01 +01:00
net s390/qeth: fix dangling IO buffers after halt/clear 2020-01-26 10:01:09 +01:00
scsi scsi: zfcp: trace channel log even for FCP command responses 2019-12-17 19:55:26 +01:00
virtio virtio/s390: fix race on airq_areas[] 2019-07-26 13:36:18 +02:00
Makefile s390: remove pointless drivers-y in drivers/s390/Makefile 2019-09-16 13:21:51 +02:00