From aab2fe978c810366353fa8ed36f92f25d76361cf Mon Sep 17 00:00:00 2001 From: Will Huang Date: Thu, 22 Apr 2021 15:21:14 +0800 Subject: [PATCH] qcacmn: Fix possible spinlock vdev->peer_list_lock recursion It is possible to hit spinlock vdev->peer_list_lock recursion if running SSR case, the call stack is as following: dp_vdev_flush_peers dp_vdev_iterate_peer qdf_spin_lock_bh(&vdev->peer_list_lock); -> first time lock dp_peer_delete dp_peer_delete_wifi3 dp_peer_vdev_list_remove qdf_spin_lock_bh(&vdev->peer_list_lock) -> lock again in same thread. Replace it with dp_vdev_iterate_peer_lock_safe. Change-Id: I40fe492d43b376b404b855a7e86aa2cd66ba1d22 CRs-Fixed: 2926284 --- dp/wifi3.0/dp_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 3f89bef216..163753df30 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -6147,8 +6147,8 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only) if (!unmap_only) - dp_vdev_iterate_peer(vdev, dp_peer_delete, NULL, - DP_MOD_ID_CDP); + dp_vdev_iterate_peer_lock_safe(vdev, dp_peer_delete, NULL, + DP_MOD_ID_CDP); for (i = 0; i < soc->max_peers ; i++) { peer = __dp_peer_get_ref_by_id(soc, i, DP_MOD_ID_CDP);