Эх сурвалжийг харах

qcacmn: Check delete.pending in get_vdev_from_vdev_id

Currently vdev deletion happens as a part of last
peer's unma and vdev creation happens in a different context invoked
by the upper layer in dp_vdev_attach_wifi3.

In a scenario when the old vdev is being deleted and a new one is being
created, with the same vdev id (e.g. P2p -> SAP transition), its
possible that the old and new vdevs co-exist in the pdev->vdev_list
at the same time. In such a case, the API (get_vdev_from_vdev_id) can
return the old stale vdev, even when a new vdev has been created. This
is not the expected behaviour.

Check for "delete.pending" flag before returning the vdev. If the flag
is set, skip that vdev.

Change some logging to dp_ logging functions.

CRs-Fixed: 2432430
Change-Id: Icadd84059dfbab12910678e5b24007010c15b6a8
Mohit Khanna 6 жил өмнө
parent
commit
0255314127
2 өөрчлөгдсөн 23 нэмэгдсэн , 36 устгасан
  1. 12 12
      dp/wifi3.0/dp_main.c
  2. 11 24
      dp/wifi3.0/dp_peer.c

+ 12 - 12
dp/wifi3.0/dp_main.c

@@ -4528,8 +4528,7 @@ static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_pdev *txrx_pdev,
 	if (pdev->vdev_count == 1)
 		dp_lro_hash_setup(soc, pdev);
 
-	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-		"Created vdev %pK (%pM)", vdev, vdev->mac_addr.raw);
+	dp_info("Created vdev %pK (%pM)", vdev, vdev->mac_addr.raw);
 	DP_STATS_INIT(vdev);
 
 	if (wlan_op_mode_sta == vdev->opmode)
@@ -4699,13 +4698,15 @@ static void dp_vdev_detach_wifi3(struct cdp_vdev *vdev_handle,
 	ol_txrx_vdev_delete_cb callback, void *cb_context)
 {
 	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
-	struct dp_pdev *pdev = vdev->pdev;
-	struct dp_soc *soc = pdev->soc;
+	struct dp_pdev *pdev;
+	struct dp_soc *soc;
 	struct dp_neighbour_peer *peer = NULL;
 	struct dp_neighbour_peer *temp_peer = NULL;
 
 	/* preconditions */
-	qdf_assert(vdev);
+	qdf_assert_always(vdev);
+	pdev = vdev->pdev;
+	soc = pdev->soc;
 
 	if (wlan_op_mode_monitor == vdev->opmode)
 		goto free_vdev;
@@ -4729,9 +4730,7 @@ static void dp_vdev_detach_wifi3(struct cdp_vdev *vdev_handle,
 	/* check that the vdev has no peers allocated */
 	if (!TAILQ_EMPTY(&vdev->peer_list)) {
 		/* debug print - will be removed later */
-		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
-			FL("not deleting vdev object %pK (%pM)"
-			"until deletion finishes for all its peers"),
+		dp_warn("not deleting vdev object %pK (%pM) until deletion finishes for all its peers",
 			vdev, vdev->mac_addr.raw);
 		/* indicate that the vdev needs to be deleted */
 		vdev->delete.pending = 1;
@@ -4994,16 +4993,14 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
 	/* Initialize the peer state */
 	peer->state = OL_TXRX_PEER_STATE_DISC;
 
-	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
-		"vdev %pK created peer %pK (%pM) ref_cnt: %d",
+	dp_info("vdev %pK created peer %pK (%pM) ref_cnt: %d",
 		vdev, peer, peer->mac_addr.raw,
 		qdf_atomic_read(&peer->ref_cnt));
 	/*
 	 * For every peer MAp message search and set if bss_peer
 	 */
 	if (memcmp(peer->mac_addr.raw, vdev->mac_addr.raw, 6) == 0) {
-		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
-			"vdev bss_peer!!!!");
+		dp_info("vdev bss_peer!!");
 		peer->bss_peer = 1;
 		vdev->vap_bss_peer = peer;
 	}
@@ -5751,6 +5748,9 @@ static struct cdp_vdev *dp_get_vdev_from_vdev_id_wifi3(struct cdp_pdev *dev,
 
 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
 	TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
+		if (vdev->delete.pending)
+			continue;
+
 		if (vdev->vdev_id == vdev_id)
 			break;
 	}

+ 11 - 24
dp/wifi3.0/dp_peer.c

@@ -1413,10 +1413,8 @@ dp_rx_peer_map_handler(void *soc_handle, uint16_t peer_id,
 	struct dp_peer *peer = NULL;
 	enum cdp_txrx_ast_entry_type type = CDP_TXRX_AST_TYPE_STATIC;
 
-	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
-		  "peer_map_event (soc:%pK): peer_id %di, hw_peer_id %d, peer_mac %02x:%02x:%02x:%02x:%02x:%02x, vdev_id %d",
-		  soc, peer_id,
-		  hw_peer_id, peer_mac_addr[0], peer_mac_addr[1],
+	dp_info("peer_map_event (soc:%pK): peer_id %d, hw_peer_id %d, peer_mac %02x:%02x:%02x:%02x:%02x:%02x, vdev_id %d",
+		soc, peer_id, hw_peer_id, peer_mac_addr[0], peer_mac_addr[1],
 		  peer_mac_addr[2], peer_mac_addr[3], peer_mac_addr[4],
 		  peer_mac_addr[5], vdev_id);
 
@@ -1443,9 +1441,7 @@ dp_rx_peer_map_handler(void *soc_handle, uint16_t peer_id,
 			if (!(qdf_mem_cmp(peer->mac_addr.raw,
 					  peer->vdev->mac_addr.raw,
 					  QDF_MAC_ADDR_SIZE))) {
-				QDF_TRACE(QDF_MODULE_ID_DP,
-					  QDF_TRACE_LEVEL_INFO_HIGH,
-					  "vdev bss_peer!!!!");
+				dp_info("vdev bss_peer!!!!");
 				peer->bss_peer = 1;
 				peer->vdev->vap_bss_peer = peer;
 			}
@@ -1462,10 +1458,8 @@ dp_rx_peer_map_handler(void *soc_handle, uint16_t peer_id,
 			 * referring it
 			 */
 			if (!peer->self_ast_entry) {
-				QDF_TRACE(QDF_MODULE_ID_DP,
-					  QDF_TRACE_LEVEL_INFO_HIGH,
-					  "Add self ast from map %pM",
-					  peer_mac_addr);
+				dp_info("Add self ast from map %pM",
+					peer_mac_addr);
 				dp_peer_add_ast(soc, peer,
 						peer_mac_addr,
 						type, 0);
@@ -1506,9 +1500,7 @@ dp_rx_peer_unmap_handler(void *soc_handle, uint16_t peer_id,
 	 * in peer_id_to_obj_map will be NULL.
 	 */
 	if (!peer) {
-		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Received unmap event for invalid peer_id %u",
-			  __func__, peer_id);
+		dp_err("Received unmap event for invalid peer_id %u", peer_id);
 		return;
 	}
 
@@ -1526,17 +1518,15 @@ dp_rx_peer_unmap_handler(void *soc_handle, uint16_t peer_id,
 			return;
 		}
 
-		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
-			  "%s:%d AST entry not found with peer %pK peer_id %u peer_mac %pM mac_addr %pM vdev_id %u next_hop %u\n",
-			  __func__, __LINE__, peer, peer->peer_ids[0],
-			  peer->mac_addr.raw, mac_addr, vdev_id,
-			  is_wds);
+		dp_alert("AST entry not found with peer %pK peer_id %u peer_mac %pM mac_addr %pM vdev_id %u next_hop %u",
+			 peer, peer->peer_ids[0],
+			 peer->mac_addr.raw, mac_addr, vdev_id,
+			 is_wds);
 
 		return;
 	}
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		"peer_unmap_event (soc:%pK) peer_id %d peer %pK",
+	dp_info("peer_unmap_event (soc:%pK) peer_id %d peer %pK",
 		soc, peer_id, peer);
 
 	soc->peer_id_to_obj_map[peer_id] = NULL;
@@ -2915,9 +2905,7 @@ void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle,
 	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
 	struct dp_peer *peer;
 
-	DP_TRACE(INFO, "vdev %pK peer_addr %pK", vdev, peer_addr);
 	peer = dp_peer_find_hash_find(pdev->soc, peer_addr, 0, 0);
-	DP_TRACE(INFO, "peer %pK vdev %pK", peer, vdev);
 
 	if (!peer)
 		return NULL;
@@ -2928,7 +2916,6 @@ void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle,
 	}
 
 	*local_id = peer->local_id;
-	DP_TRACE(INFO, "peer %pK vdev %pK local id %d", peer, vdev, *local_id);
 
 	/* ref_cnt is incremented inside dp_peer_find_hash_find().
 	 * Decrement it here.