summaryrefslogtreecommitdiffstats
path: root/drivers/s390/net/qeth_core.h
diff options
context:
space:
mode:
authorJulian Wiedmann2019-08-12 16:44:35 +0200
committerJakub Kicinski2019-08-14 04:26:47 +0200
commit072f79400032f74917726cf76f4248367ea2b5b8 (patch)
tree7e4f8f96847681fe921c7f38067c464c8a2f4498 /drivers/s390/net/qeth_core.h
parentsctp: fix the transport error_count check (diff)
downloadkernel-qcow2-linux-072f79400032f74917726cf76f4248367ea2b5b8.tar.gz
kernel-qcow2-linux-072f79400032f74917726cf76f4248367ea2b5b8.tar.xz
kernel-qcow2-linux-072f79400032f74917726cf76f4248367ea2b5b8.zip
s390/qeth: serialize cmd reply with concurrent timeout
Callbacks for a cmd reply run outside the protection of card->lock, to allow for additional cmds to be issued & enqueued in parallel. When qeth_send_control_data() bails out for a cmd without having received a reply (eg. due to timeout), its callback may concurrently be processing a reply that just arrived. In this case, the callback potentially accesses a stale reply->reply_param area that eg. was on-stack and has already been released. To avoid this race, add some locking so that qeth_send_control_data() can (1) wait for a concurrently running callback, and (2) zap any pending callback that still wants to run. Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Diffstat (limited to 'drivers/s390/net/qeth_core.h')
-rw-r--r--drivers/s390/net/qeth_core.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index c7ee07ce3615..28db887d38ed 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -629,6 +629,7 @@ struct qeth_seqno {
struct qeth_reply {
struct list_head list;
struct completion received;
+ spinlock_t lock;
int (*callback)(struct qeth_card *, struct qeth_reply *,
unsigned long);
u32 seqno;