浏览代码

qcacmn: add sync between peer teardown and add ast

Protect peer delete in progress under lock to avoid
addition of AST entry after peer tear down

Change-Id: I21ec1dde67339406ad1b5ac99d37b6ce8d021fde
CRs-fixed: 2384110
Chaithanya Garrepalli 6 年之前
父节点
当前提交
8fb487704b
共有 2 个文件被更改,包括 10 次插入6 次删除
  1. 5 4
      dp/wifi3.0/dp_main.c
  2. 5 2
      dp/wifi3.0/dp_peer.c

+ 5 - 4
dp/wifi3.0/dp_main.c

@@ -4533,12 +4533,10 @@ static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
 {
 	struct dp_ast_entry *ast_entry, *temp_ast_entry;
 
-	qdf_spin_lock_bh(&soc->ast_lock);
 	DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry)
 		dp_peer_del_ast(soc, ast_entry);
 
 	peer->self_ast_entry = NULL;
-	qdf_spin_unlock_bh(&soc->ast_lock);
 }
 #else
 static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
@@ -4634,9 +4632,10 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
 		qdf_atomic_init(&peer->is_default_route_set);
 		dp_peer_cleanup(vdev, peer);
 
-		peer->delete_in_progress = false;
-
+		qdf_spin_lock_bh(&soc->ast_lock);
 		dp_peer_delete_ast_entries(soc, peer);
+		peer->delete_in_progress = false;
+		qdf_spin_unlock_bh(&soc->ast_lock);
 
 		if ((vdev->opmode == wlan_op_mode_sta) &&
 		    !qdf_mem_cmp(peer_mac_addr, &vdev->mac_addr.raw[0],
@@ -8874,8 +8873,10 @@ static void dp_peer_teardown_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl)
 		return;
 	}
 
+	qdf_spin_lock_bh(&soc->ast_lock);
 	peer->delete_in_progress = true;
 	dp_peer_delete_ast_entries(soc, peer);
+	qdf_spin_unlock_bh(&soc->ast_lock);
 }
 #endif
 

+ 5 - 2
dp/wifi3.0/dp_peer.c

@@ -550,14 +550,18 @@ int dp_peer_add_ast(struct dp_soc *soc,
 	txrx_ast_free_cb cb = NULL;
 	void *cookie = NULL;
 
-	if (peer->delete_in_progress)
+	qdf_spin_lock_bh(&soc->ast_lock);
+	if (peer->delete_in_progress) {
+		qdf_spin_unlock_bh(&soc->ast_lock);
 		return ret;
+	}
 
 	vdev = peer->vdev;
 	if (!vdev) {
 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
 			FL("Peers vdev is NULL"));
 		QDF_ASSERT(0);
+		qdf_spin_unlock_bh(&soc->ast_lock);
 		return ret;
 	}
 
@@ -568,7 +572,6 @@ int dp_peer_add_ast(struct dp_soc *soc,
 		  __func__, pdev->pdev_id, vdev->vdev_id, type, flags,
 		  peer->mac_addr.raw, peer, mac_addr);
 
-	qdf_spin_lock_bh(&soc->ast_lock);
 
 	/* If AST entry already exists , just return from here
 	 * ast entry with same mac address can exist on different radios