瀏覽代碼

qcacmn: avoid deadlock in ast create

Fix to avoid race conditions between two locks
a) soc->peer_ref_mutex
b) soc->ast_lock
Right order to for these two locks is to first
acquire a) and then b)

But in ast create path these locks are acquired in
reverse order leading to deadlock.

This change helps in fixing deadlock

Change-Id: I02f802fa12d5f4e4ae3f584cdffe36c9bf717f84
Chaithanya Garrepalli 5 年之前
父節點
當前提交
cf0b4e2ea6
共有 1 個文件被更改,包括 9 次插入4 次删除
  1. 9 4
      dp/wifi3.0/dp_peer.c

+ 9 - 4
dp/wifi3.0/dp_peer.c

@@ -580,6 +580,14 @@ int dp_peer_add_ast(struct dp_soc *soc,
 	txrx_ast_free_cb cb = NULL;
 	void *cookie = NULL;
 	struct dp_peer *tmp_peer = NULL;
+	bool is_peer_found = false;
+
+	tmp_peer = dp_peer_find_hash_find(soc, mac_addr, 0,
+					  DP_VDEV_ALL);
+	if (tmp_peer) {
+		dp_peer_unref_delete(tmp_peer);
+		is_peer_found = true;
+	}
 
 	qdf_spin_lock_bh(&soc->ast_lock);
 	if (peer->delete_in_progress) {
@@ -629,10 +637,7 @@ int dp_peer_add_ast(struct dp_soc *soc,
 			qdf_spin_unlock_bh(&soc->ast_lock);
 			return 0;
 		}
-		tmp_peer = dp_peer_find_hash_find(soc, mac_addr, 0,
-						  DP_VDEV_ALL);
-		if (tmp_peer) {
-			dp_peer_unref_delete(tmp_peer);
+		if (is_peer_found) {
 			qdf_spin_unlock_bh(&soc->ast_lock);
 			return 0;
 		}