Parcourir la source

qcacmn: change lock order to avoid deadlock

Acquiring parent lock with in child lock context can occur deadlock
as some caller can invoke API with parent lock acquired.

Change-Id: I8fab6226d9cafe6df20737f966be1063feebb603
CRs-Fixed: 2219624
Srinivas Pitla il y a 7 ans
Parent
commit
fd3685537b
1 fichiers modifiés avec 5 ajouts et 2 suppressions
  1. 5 2
      umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

+ 5 - 2
umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

@@ -650,17 +650,19 @@ QDF_STATUS wlan_objmgr_vdev_peer_attach(struct wlan_objmgr_vdev *vdev,
 		wlan_vdev_obj_unlock(vdev);
 		return QDF_STATUS_E_FAILURE;
 	}
+	wlan_vdev_obj_unlock(vdev);
 
 	wlan_pdev_obj_lock(pdev);
 	if (wlan_pdev_get_peer_count(pdev) >=
 			wlan_pdev_get_max_peer_count(pdev)) {
 		wlan_pdev_obj_unlock(pdev);
-		wlan_vdev_obj_unlock(vdev);
 		return QDF_STATUS_E_FAILURE;
 	}
 
 	wlan_pdev_incr_peer_count(wlan_vdev_get_pdev(vdev));
 	wlan_pdev_obj_unlock(pdev);
+
+	wlan_vdev_obj_lock(vdev);
 	/* Add peer to vdev's peer list */
 	wlan_obj_vdev_peerlist_add_tail(&objmgr->wlan_peer_list, peer);
 	objmgr->wlan_peer_count++;
@@ -737,11 +739,12 @@ QDF_STATUS wlan_objmgr_vdev_peer_detach(struct wlan_objmgr_vdev *vdev,
 	objmgr->wlan_peer_count--;
 	/* decrement pdev peer count */
 	pdev = wlan_vdev_get_pdev(vdev);
+	wlan_vdev_obj_unlock(vdev);
+
 	wlan_pdev_obj_lock(pdev);
 	wlan_pdev_decr_peer_count(pdev);
 	wlan_pdev_obj_unlock(pdev);
 
-	wlan_vdev_obj_unlock(vdev);
 	/* decrement vdev ref count after peer released its reference */
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_OBJMGR_ID);
 	return QDF_STATUS_SUCCESS;