summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorNiklas Schnelle <schnelle@linux.ibm.com>2023-07-07 12:56:20 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-07-23 13:53:42 +0200
commit32b055e05ce17886b51cc0247ab3eb9cd9decfa7 (patch)
treea1ad811318441424ff868613f7337812c6924e55 /include
parent7a59f29961cf97b98b02acaadf5a0b1f8dde938c (diff)
downloadlinux-stable-32b055e05ce17886b51cc0247ab3eb9cd9decfa7.tar.gz
linux-stable-32b055e05ce17886b51cc0247ab3eb9cd9decfa7.tar.bz2
linux-stable-32b055e05ce17886b51cc0247ab3eb9cd9decfa7.zip
s390/ism: Fix locking for forwarding of IRQs and events to clients
[ Upstream commit 6b5c13b591d753c6022fbd12f8c0c0a9a07fc065 ] The clients array references all registered clients and is protected by the clients_lock. Besides its use as general list of clients the clients array is accessed in ism_handle_irq() to forward ISM device events to clients. While the clients_lock is taken in the IRQ handler when calling handle_event() it is however incorrectly not held during the client->handle_irq() call and for the preceding clients[] access leaving it unprotected against concurrent client (un-)registration. Furthermore the accesses to ism->sba_client_arr[] in ism_register_dmb() and ism_unregister_dmb() are not protected by any lock. This is especially problematic as the client ID from the ism->sba_client_arr[] is not checked against NO_CLIENT and neither is the client pointer checked. Instead of expanding the use of the clients_lock further add a separate array in struct ism_dev which references clients subscribed to the device's events and IRQs. This array is protected by ism->lock which is already taken in ism_handle_irq() and can be taken outside the IRQ handler when adding/removing subscribers or the accessing ism->sba_client_arr[]. This also means that the clients_lock is no longer taken in IRQ context. Fixes: 89e7d2ba61b7 ("net/ism: Add new API for client registration") Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com> Reviewed-by: Alexandra Winter <wintera@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/ism.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/ism.h b/include/linux/ism.h
index ea2bcdae7401..5160d47e5ea9 100644
--- a/include/linux/ism.h
+++ b/include/linux/ism.h
@@ -44,6 +44,7 @@ struct ism_dev {
u64 local_gid;
int ieq_idx;
+ struct ism_client *subs[MAX_CLIENTS];
atomic_t free_clients_cnt;
atomic_t add_dev_cnt;
wait_queue_head_t waitq;