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
This commit is contained in:
Will Huang
2021-04-22 15:21:14 +08:00
committed by Madan Koyyalamudi
parent 034e1c4507
commit aab2fe978c

View File

@@ -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);